From 3bcca355ac5642041b7c45aaec4023bf760fda5b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 16 Jan 2026 12:06:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0carbon=20app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/carbon/__init__.py | 0 apps/carbon/admin.py | 3 + apps/carbon/apps.py | 6 + apps/carbon/migrations/0001_initial.py | 53 ++ apps/carbon/migrations/__init__.py | 0 apps/carbon/models.py | 30 + apps/carbon/promot/tec.md | 9 + apps/carbon/promot/tec_dh.md | 336 +++++++ apps/carbon/promot/tec_dh_md_tables.md | 253 +++++ apps/carbon/serializers.py | 34 + apps/carbon/service.py | 64 ++ apps/carbon/standard.json | 1188 ++++++++++++++++++++++++ apps/carbon/tests.py | 3 + apps/carbon/urls.py | 12 + apps/carbon/views.py | 259 ++++++ db.json | Bin 747338 -> 0 bytes server/settings.py | 3 +- server/urls.py | 1 + 18 files changed, 2253 insertions(+), 1 deletion(-) create mode 100644 apps/carbon/__init__.py create mode 100644 apps/carbon/admin.py create mode 100644 apps/carbon/apps.py create mode 100644 apps/carbon/migrations/0001_initial.py create mode 100644 apps/carbon/migrations/__init__.py create mode 100644 apps/carbon/models.py create mode 100644 apps/carbon/promot/tec.md create mode 100644 apps/carbon/promot/tec_dh.md create mode 100644 apps/carbon/promot/tec_dh_md_tables.md create mode 100644 apps/carbon/serializers.py create mode 100644 apps/carbon/service.py create mode 100644 apps/carbon/standard.json create mode 100644 apps/carbon/tests.py create mode 100644 apps/carbon/urls.py create mode 100644 apps/carbon/views.py delete mode 100644 db.json diff --git a/apps/carbon/__init__.py b/apps/carbon/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/carbon/admin.py b/apps/carbon/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/apps/carbon/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/carbon/apps.py b/apps/carbon/apps.py new file mode 100644 index 0000000..3e67f72 --- /dev/null +++ b/apps/carbon/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CarbonConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.carbon' diff --git a/apps/carbon/migrations/0001_initial.py b/apps/carbon/migrations/0001_initial.py new file mode 100644 index 0000000..3b73a33 --- /dev/null +++ b/apps/carbon/migrations/0001_initial.py @@ -0,0 +1,53 @@ +# Generated by Django 4.2.27 on 2026-01-15 02:24 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('system', '0007_alter_dept_create_by_alter_dept_update_by_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='Work', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=100, verbose_name='名称')), + ('type', models.CharField(help_text='项目类型: 项目/企业', max_length=50, verbose_name='类型')), + ('description', models.TextField(blank=True, null=True, verbose_name='描述')), + ('score_dq', models.FloatField(blank=True, null=True, verbose_name='贷前评分')), + ('fingerprint_dq', models.TextField(blank=True, null=True, verbose_name='贷前指纹')), + ('score_dh', models.FloatField(blank=True, null=True, verbose_name='贷后评分')), + ('fingerprint_dh', models.TextField(blank=True, null=True, verbose_name='贷后指纹')), + ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_belong_dept', to='system.dept', verbose_name='所属部门')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('dh_file1', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='work_dh_file1', to='system.file')), + ('dh_file2', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='work_dh_file2', to='system.file')), + ('dh_file3', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='work_dh_file3', to='system.file')), + ('dh_file4', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='work_dh_file4', to='system.file')), + ('dh_file5', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='work_dh_file5', to='system.file')), + ('dh_file6', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='work_dh_file6', to='system.file')), + ('dq_file1', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='work_dq_file1', to='system.file')), + ('dq_file2', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='work_dq_file2', to='system.file')), + ('dq_file3', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='work_dq_file3', to='system.file')), + ('dq_file4', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='work_dq_file4', to='system.file')), + ('dq_file5', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='work_dq_file5', to='system.file')), + ('dq_file6', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='work_dq_file6', to='system.file')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/carbon/migrations/__init__.py b/apps/carbon/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/carbon/models.py b/apps/carbon/models.py new file mode 100644 index 0000000..ad64005 --- /dev/null +++ b/apps/carbon/models.py @@ -0,0 +1,30 @@ +from django.db import models +from apps.utils.models import CommonBDModel + +# Create your models here. +class Work(CommonBDModel): + name = models.CharField('名称', max_length=100) + type = models.CharField('类型', max_length=50, help_text="项目类型: 项目/企业") + description = models.TextField('描述', blank=True, null=True) + score_dq = models.FloatField('贷前评分', null=True, blank=True) + fingerprint_dq = models.TextField('贷前指纹', null=True, blank=True) + score_dh = models.FloatField('贷后评分', null=True, blank=True) + fingerprint_dh = models.TextField('贷后指纹', null=True, blank=True) + # 企业低碳转型战略与总体规划 + dq_file1 = models.ForeignKey("system.file", on_delete=models.SET_NULL, null=True, blank=True, related_name='work_dq_file1') + # 碳排放数据监测、核查与信息披露报告 + dq_file2 = models.ForeignKey("system.file", on_delete=models.SET_NULL, null=True, blank=True, related_name='work_dq_file2') + # 环境、社会与治理(ESG)尽职调查报告 + dq_file3 = models.ForeignKey("system.file", on_delete=models.SET_NULL, null=True, blank=True, related_name='work_dq_file3') + # 项目融资与可行性研究方案 + dq_file4 = models.ForeignKey("system.file", on_delete=models.SET_NULL, null=True, blank=True, related_name='work_dq_file4') + # 数字化与智能控制系统技术方案 + dq_file5 = models.ForeignKey("system.file", on_delete=models.SET_NULL, null=True, blank=True, related_name='work_dq_file5') + # 企业技术说明及改造方案 + dq_file6 = models.ForeignKey("system.file", on_delete=models.SET_NULL, null=True, blank=True, related_name='work_dq_file6') + dh_file1 = models.ForeignKey("system.file", on_delete=models.SET_NULL, null=True, blank=True, related_name='work_dh_file1') + dh_file2 = models.ForeignKey("system.file", on_delete=models.SET_NULL, null=True, blank=True, related_name='work_dh_file2') + dh_file3 = models.ForeignKey("system.file", on_delete=models.SET_NULL, null=True, blank=True, related_name='work_dh_file3') + dh_file4 = models.ForeignKey("system.file", on_delete=models.SET_NULL, null=True, blank=True, related_name='work_dh_file4') + dh_file5 = models.ForeignKey("system.file", on_delete=models.SET_NULL, null=True, blank=True, related_name='work_dh_file5') + dh_file6 = models.ForeignKey("system.file", on_delete=models.SET_NULL, null=True, blank=True, related_name='work_dh_file6') diff --git a/apps/carbon/promot/tec.md b/apps/carbon/promot/tec.md new file mode 100644 index 0000000..da74497 --- /dev/null +++ b/apps/carbon/promot/tec.md @@ -0,0 +1,9 @@ +# 角色 +你是一位低碳技术专家,具备深厚的专业知识和丰富的实践经验。你能够精准理解用户的报告。 +# 技能 +1. 仔细分析用户提供的技术报告,获取里面的技术关键点。 +2. 根据技术关键点,判断报告中的技术是否属于低碳技术。 +3 回答 是否采用所列绿色能源、原燃料替代、能效提升、低碳水泥、碳捕集等任一技术(关键技术词汇包括石灰石原料替代减碳技术、熟料烧成化石能源替代减碳技术、水泥工厂近零购电改造技术、水泥低碳烧成技术与装备、节能低碳粉磨工艺及装备、水泥窑炉系统隔热保温整体提升技术、矿渣粉磨制备水泥技术、水泥窑富氧燃烧技术、水泥工厂数字化、智能化技术、高贝利特低热/中热硅酸盐水泥及其制备技术、硫铝酸盐和铁铝酸盐水泥及其制备技术、贝利特-硫铝酸钙-硫硅酸钙新型低碳熟料及其制备技术、大掺量固废制备少熟料低碳水泥技术、镁质低碳水泥及其制备技术、热活化高岭土制备低碳水泥技术、全氧燃烧耦合低能耗碳捕集技术、水泥窑炉烟气捕集CO2技术、水泥窑全氧燃烧耦合CO2纯化捕集技术、水泥工业固体胺碳捕集技术、建材矿山均化开采配矿技术、建材矿山生态修复、绿色改造技术、绿色清洁运输技术、水泥超低排放改造、建设碳排放和污染物排放全过程智能管控与评估平台) +# 回答要求 +仅回答 是 或者 否 不要回复其他内容 +# 以下是用户报告内容 \ No newline at end of file diff --git a/apps/carbon/promot/tec_dh.md b/apps/carbon/promot/tec_dh.md new file mode 100644 index 0000000..3102eff --- /dev/null +++ b/apps/carbon/promot/tec_dh.md @@ -0,0 +1,336 @@ +# 角色 +你是一位低碳金融专家,具备深厚的专业知识和丰富的实践经验。你能够精准理解用户的报告。 +# 技能 +1. 仔细分析用户提供的技术报告,获取里面的所有关键点。 +2. 根据用户提供的报告和评分标准进行评分。 +# 回答要求 +仅回答一个具体的得分数值,不要回答其他内容。 +# 以下是评分标准 +转型金融主体认定评价指标设定 +本体系共设定8个一级指标,47个二级指标,169个三级指标。具体分值权重需由专业人士结合行业实际情况修改。 +一、 一级指标 +一级指标 权重 分值(满分100) 备注 +减碳量 35% 35 核心指标,直接体现转型成效 +技术成熟度 25% 25 决定技术可行性与推广价值 +企业碳治理 13% 13 反映企业长期减碳意愿与能力 +融资计划 9% 9 体现项目落地与资金保障能力 +环境协同效益 9% 9 综合评价项目的社会与环境价值 +社会与治理协同效益 5% 5 体现企业全面可持续发展的能力 +创新与可持续竞争力 2% 2 体现企业是否具备持续引领行业绿色转型的能力 +数字化与智能化水平 2% 2 体现企业是否具备持续引领行业绿色转型的能力 + +二、二级指标(含三级指标) +1、减碳量(总分35) +说明:不同减碳技术可支撑不同程度的减碳效果,故根据《转型金融支持经济活动目录(建材行业) (试用稿) 》及水泥、石膏、玻璃、玻纤四大行业的技术路径,将“减碳量”进一步细分为二、三级指标。 +打分方式: +二级指标中:“碳排放总量/碳排放强度/产品碳足迹(注:三者并列)降低xx%”直接体现技术应用的最终减排成效,是项目是否达到转型要求的门槛性指标(注:xx%需与专家商定)。此项占10分既强调其重要性,又避免仅凭单一百分比决定整体得分,为不同技术路径提供公平比较的基础。 +三级指标中:“指标说明-定量”与“指标说明-定性”共占25分。此项是对减排承诺的支撑与验证机制,确保减排目标具备可实现性、可信度与规范性。定量部分提供可测量、可核查的数据依据,确保减排效果的真实性与准确性。定性部分强调技术实施的规范性,避免仅追求数字而忽视技术本质,凸显对实施过程与细节的重视,体现不仅看结果,更要看过程的评价理念,确保减排成果是通过可信、可持续的技术手段实现的。 +二级指标: 18个;三级指标: 79个 + +减碳量 + 碳排放总量/碳排放强度/产品碳足迹(注:三者并列)降低xx%(10分) 指标说明-定量与指标说明-定性(25分) +行业 二级指标 总量/强度/碳足迹降低xx% 三级指标 指标说明 指标说明-定量 指标说明-定性 +水泥行业 1.1.低碳水泥 总量/强度/碳足迹降低xx% 1.1.1.高贝利特低热/中热硅酸盐水泥及其制备技术 熟料矿物中硅酸二钙由当前的20%提升至40%以上,其性能满足GB/T 200《中热硅酸盐水泥、低热硅酸盐水泥》要求,水泥生产线达到或优于GB 16780《水泥单位产品能源消耗限额》中1级能效水平。 硅酸二钙由当前的20%提升至40% 达到或优于GB 16780《水泥单位产品能源消耗限额》1级能效水平。 性能满足GB/T 200《中热硅酸盐水泥、低热硅酸盐水泥》 + 7.5 7.5 10 + 1.1.2.硫铝酸盐和铁铝酸盐水泥及其制备技术 以硅铝质天然原料或固废为原料,熟料生产中石灰石用量降低30%以上,水泥性能满足GB 20472《硫铝酸盐水泥》、GB/T 201《铝酸盐水泥》、JC/T 437《自应力铁铝酸盐水泥》等要求;熟料及水泥生产线达到或优于JC/T 2821《特种水泥单位产品能源消耗限额》中1级能耗水平 熟料生产中石灰石用量降低30%以上 熟料及水泥生产线达到或优于JC/T 2821《特种水泥单位产品能源消耗限额》中1级能耗水平 水泥性能满足GB 20472《硫铝酸盐水泥》、GB/T 201《铝酸盐水泥》、JC/T 437《自应力铁铝酸盐水泥》等要求 以硅铝质天然原料或固废为原料 + 7.5 7.5 5 5 + 1.1.3.贝利特-硫铝酸钙-硫硅酸钙新型低碳熟料及其制备技术 以低品位石灰石、粉煤灰及赤泥等为原料,水泥性能满足GB 175《通用硅酸盐水泥》要求,水泥生产线达到或优于JC/T 2821《特种水泥单位产品能源消耗限额》中1级能效水平 水泥生产线达到或优于JC/T 2821《特种水泥单位产品能源消耗限额》中1级能效水平 水泥性能满足GB 175《通用硅酸盐水泥》要求 + 15 10 + 1.1.4.大掺量固废制备少熟料低碳水泥技术 以工业固废为主要粉体原材料,性能满足T/CECS 689《固废基胶凝材料应用技术规程》、JC/T 2391《制品用过硫磷石膏矿渣水泥混凝土》,碳排放较硅酸盐水泥降低50%以上 碳排放较硅酸盐水泥降低50%以上 性能满足T/CECS 689《固废基胶凝材料应用技术规程》 性能满足JC/T 2391《制品用过硫磷石膏矿渣水泥混凝土》 + 15 5 5 + 1.1.5.镁质低碳水泥及其制备技术 以煅烧菱镁矿为粉体原料,磷酸盐溶液为拌合溶液,碳排放较硅酸盐水泥降低约10% 碳排放较硅酸盐水泥降低约10% 以煅烧菱镁矿为粉体原料 磷酸盐溶液为拌合溶液 + 15 5 5 + 1.1.6.热活化高岭土制备低碳水泥技术 熟料掺量降低至50%及以下,满足GB 175《通用硅酸盐水泥》要求,水泥生产线达到或优于GB 16780《水泥单位产品能源消耗限额》中1级能效水平 熟料掺量降低至50%及以下 水泥生产线达到或优于GB 16780《水泥单位产品能源消耗限额》中1级能效水平 满足GB 175《通用硅酸盐水泥》要求 + 7.5 7.5 10 + 1.2.水泥绿色能源及原燃料替代 总量/强度/碳足迹降低xx% 1.2.1.水泥工厂近零购电改造技术 使用风电、光电技术、风光储技术,通过绿色能源技术途径减少水泥生产过程中的电力消耗,结合余热发电,改造现有水泥厂使其实现“零购电”或“近零购电” 减少水泥生产过程中的电力消耗 通过绿色能源技术途径减少水泥生产过程中的电力消耗 改造现有水泥厂使其实现“零购电”或“近零购电” 使用风电、光电技术、风光储技术 + 15 4 3 3 + 1.2.2.熟料烧成化石能源替代减碳技术 一次化石燃料替代率25%~50%,综合能耗降低25%~50%,依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》,熟料单位产品综合能耗降低25%~50%,依据《企业温室气体排放核算与报告指南水泥行业》《企业温室气体排放核查技术指南水泥行业》等规范进行核算评估,熟料单位产品碳排放降低50—100kg/t.cl。 一次化石燃料替代率25%~50%,综合能耗降低25%~50% 熟料单位产品综合能耗降低25%~50% 熟料单位产品碳排放降低50—100kg/t.c GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》 《企业温室气体排放核算与报告指南水泥行业》《企业温室气体排放核查技术指南水泥行业》等规范进行核算评估 + 5 5 5 5 5 + 1.2.3.石灰石原料替代减碳技术-电石渣全部替代石灰石质原料新型干法水泥生产技术 采用电石渣替代石灰石原料,依据《企业温室气体排放核算与报告指南水泥行业》《企业温室气体排放核查技术指南水泥行业》等规范进行核算评估,熟料单位产品碳排放减少300—500kg/t.cl。 熟料单位产品碳排放减少300—500kg/t.cl 依据《企业温室气体排放核算与报告指南水泥行业》《企业温室气体排放核查技术指南水泥行业》等规范进行核算评估 + 15 10 + 1.2.4.石灰石原料替代减碳技术-工业副产石膏制硫酸联产水泥节能减排成套技术 采用工业副产石膏替代天然石灰石,依据《企业温室气体排放核算与报告指南水泥行业》《企业温室气体排放核查技术指南水泥行业》等规范进行核算评估,熟料单位产品碳排放降低约400kg/t.cl。 熟料单位产品碳排放降低约400kg/t.cl 依据《企业温室气体排放核算与报告指南水泥行业》《企业温室气体排放核查技术指南水泥行业》等规范进行核算评估 + 15 10 + 1.2.5.石灰石原料替代减碳技术-低碳生料配料技术 石灰石质原料替代率达到5%以上,依据《企业温室气体排放核算与报告指南水泥行业》《企业温室气体排放核查技术指南水泥行业》等规范进行核算评估,熟料单位产品碳排放减少25—100kg/t.cl。 石灰石质原料替代率达到5%以上 熟料单位产品碳排放减少25—100kg/t.cl 依据《企业温室气体排放核算与报告指南水泥行业》《企业温室气体排放核查技术指南水泥行业》等规范进行核算评估 + 7.5 7.5 10 + 1.2.6.石灰石原料替代减碳技术-赤泥制水泥技术 突破15%以上赤泥替代石灰石作为钙质原料生产水泥熟料。满足GB 175《通用硅酸盐水泥》要求,依据《企业温室气体排放核算与报告指南水泥行业》《企业温室气体排放核查技术指南水泥行业》等规范进行核算评估,熟料单位产品碳排放减少≥75kg/t.cl 突破15%以上赤泥替代石灰石作为钙质原料生产水泥熟料。 熟料单位产品碳排放减少≥75kg/t.cl 满足GB 175《通用硅酸盐水泥》要求 依据《企业温室气体排放核算与报告指南水泥行业》《企业温室气体排放核查技术指南水泥行业》等规范进行核算评估 + 7.5 7.5 5 5 + 1.2.7.石灰石原料替代减碳技术-水泥窑余热利用污泥协同处置技术 满足GB 30760《水泥窑协同处置固体废物技术规范》要求,污泥入机水分60%~80%,出机水分10%~20%,处理量50—250t/d,依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》,降低熟料热耗1.5kgce/t.cl 污泥入机水分60%~80% 出机水分10%~20% 处理量50—250t/d 降低熟料热耗1.5kgce/t.cl 满足GB 30760《水泥窑协同处置固体废物技术规范》要求 依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》 + 3.75 3.75 3.75 3.75 5 5 + 1.2.8.水泥窑固体生物质替代燃料利用技术 将固体生物质替代燃料送入水泥熟料生产线回转窑头及窑尾分解炉内,减少传统化石燃料消耗,桉树皮平均使用量为2.48t/h时,吨熟料消耗实物煤下降3.99kg/t,吨熟料消耗标煤下降2.43kg/t,折合每吨桉树皮可替代原煤0.352t 桉树皮平均使用量为2.48t/h时,吨熟料消耗实物煤下降3.99kg/t 吨熟料消耗标煤下降2.43kg/t,折合每吨桉树皮可替代原煤0.352t 将固体生物质替代燃料送入水泥熟料生产线回转窑头及窑尾分解炉内 + 7.5 7.5 10 + 1.3.能效提升 总量/强度/碳足迹降低xx% 1.3.1.水泥工厂数字化、智能化技术-水泥工厂工程建设数字化技术 综合应用BIM、GIS、IoT技术,减少工程建设碳排放5%~8% 减少工程建设碳排放5%~8% 综合应用BIM、GIS、IoT技术 + 15 10 + 1.3.2.水泥工厂数字化、智能化技术-水泥制造全流程智慧管控技术 建立包括过程控制、生产管理、能源管理、设备管理、质量管理、物流管理、安环管理、碳排放管理等功能的一体化智慧管控平台,依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》,综合能耗降低1%~3%,依据GB/T 32150.8《温室气体排放核算与报告要求第8部分:水泥生产企业》,碳排放降低1% 综合能耗降低1%~3% 碳排放降低1% 依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》 依据GB/T 32150.8《温室气体排放核算与报告要求第8部分:水泥生产企业》 建立包括过程控制、生产管理、能源管理、设备管理、质量管理、物流管理、安环管理、碳排放管理等功能的一体化智慧管控平台 + 7.5 7.5 2.5 2.5 5 + 1.3.3.水泥低碳烧成技术与装备-高能效低碳低氮预热预分解系统集成技术及装备 依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》,新线熟料单位产品综合能耗小于100kg/t.cl,依据GB/T 26282《水泥回转窑热平衡测定方法》,NOx初始浓度小于250mg/Nm3。老线升级改造标准煤耗降低4—8kg/t.cl,NOx初始浓度小于350mg/Nm3 新线熟料单位产品综合能耗小于100kg/t.cl,NOx初始浓度小于250mg/Nm3 老线升级改造标准煤耗降低4—8kg/t.cl,NOx初始浓度小于350mg/Nm3 依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》 依据GB/T 26282《水泥回转窑热平衡测定方法》 + 7.5 7.5 5 5 + 1.3.4.水泥低碳烧成技术与装备-第四代高效低碳中置辊破篦冷机 依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》,热回收效率≥75%、二次风温≥1150℃、三次风温≥950℃、熟料出口温度≤65℃环境温度,依据GB/T 32150.8《温室气体排放核算与报告要求第8部分:水泥生产企业》,熟料单位产品综合能耗降低1-3kgce/t.cl 热回收效率≥75%、二次风温≥1150℃、三次风温≥950℃、熟料出口温度≤65℃环境温度 熟料单位产品综合能耗降低1-3kgce/t.cl 依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》 依据GB/T 32150.8《温室气体排放核算与报告要求第8部分:水泥生产企业》 + 7.5 7.5 5 5 + 1.3.5.节能低碳粉磨工艺及装备-水泥高效联 粉磨节能降碳技术 高压料床粉碎设备与球磨机的功率比达到1.0以上;采用高效冷却技术降低水泥温度30-60℃,稳定水泥品质。生产PO42.5水泥单位产品电耗≤26kWh/t;依据GB/T 32150.8《温室气体排放核算与报告要求第8部分:水泥生产企业》,高效联合粉磨节能降碳技术减少水泥单位产品碳排放8—16kg/t 高压料床粉碎设备与球磨机的功率比达到1.0以上 采用高效冷却技术降低水泥温度30-60℃,稳定水泥品质 生产PO42.5水泥单位产品电耗≤26kWh/t 高效联合粉磨节能降碳技术减少水泥单位产品碳排放8—16kg/t 依据GB/T 32150.8《温室气体排放核算与报告要求第8部分 + 4 4 3 4 10 + 1.3.6.节能低碳粉磨工艺及装备-高效生料终粉磨技术 单位产品电耗相对于传统球磨粉磨技术降低40%以上 单位产品电耗相对于传统球磨粉磨技术降低40%以上 + 25 + 1.3.7.水泥窑炉用节能耐火材料整体提升技术 满足JC/T 2196《水泥回转窑用耐火材料使用规程》要求。依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》,综合能耗降低1-3kgce/t.cl 综合能耗降低1-3kgce/t.cl 满足JC/T 2196《水泥回转窑用耐火材料使用规程》要求 依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》 + 15 5 5 + 1.3.8.通用装备技术-水泥工业用提升机节能技术 物料垂直提升,优先选用胶带提升机,降低设备电耗;提升机配套智能电机和料量监测系统,可根据负载大小适时自动调整提升机的运行状态。提高设备运行效率、延长传送部件的使用寿命 降低设备电耗 提升机配套智能电机和料量监测系统 可根据负载大小适时自动调整提升机的运行状态 提高设备运行效率、延长传送部件的使用寿命 + 7 6 6 6 + 1.3.9.通用装备技术-粉状原燃料精确计量降碳技术 采用带有智能控制算法的仓压自适应稳流喂料装置和高精度粉体计量秤,实现不同工况条件下的粉状原燃料动态精确计量 采用带有智能控制算法的仓压自适应稳流喂料装置和高精度粉体计量秤 实现不同工况条件下的粉状原燃料动态精确计量 + 12.5 12.5 + 1.3.10.通用装备技术-水泥窑用风机节能技术 依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》,风机能耗降低10%~40% 风机能耗降低10%~40% 依据GB/T 26281《水泥回转窑热平衡、热效率、综合能耗计算方法》 + 15 10 + 1.3.11.立式辊磨机粒化高炉矿渣粉制备技术 利用矿渣微粉替代水泥,可降低二氧化碳排放约80%~90%。 降低二氧化碳排放约80%~90%。 + 25 + 1.3.12.生料外循环料床终粉磨系统技术 相比原传统立磨终粉磨系统,系统电耗降低约20%~30%, 系统电耗降低约20%~30%, + 25 + 1.3.13.水泥窑富氧燃烧技术 将氧气体积浓度大于21%的气体与燃料一起进行燃烧,应用富氧燃烧技术,降低水泥工业烟气排放量,提高烟气中CO2浓度(最高可达90%~95%),达到富集烟气中CO2浓度的目的 降低水泥工业烟气排放量 提高烟气中CO2浓度(最高可达90%~95%) 将氧气体积浓度大于21%的气体与燃料一起进行燃烧,应用富氧燃烧技术 + 7.5 7.5 10 + 1.4.碳捕集封存和利用 总量/强度/碳足迹降低xx% 1.4.1.全氧燃烧耦合低能耗碳捕集技术 依据GB/T 26282《水泥回转窑热平衡测定方法》,出预热器烟气CO2浓度≥80%(干基浓度)。单位CO2能源消耗小于1.6GJ/t.CO2。 出预热器烟气CO2浓度≥80%(干基浓度) 单位CO2能源消耗小于1.6GJ/t.CO2。 GB/T 26282《水泥回转窑热平衡测定方法》 + 7.5 7.5 10 + 1.4.2.水泥窑炉烟气捕集 CO2 技术 利用物理、化学方法捕集水泥窑炉烟气中二氧化碳并进行纯化,建材相关行业可参照。单位CO2能源消耗小于2.3GJ/t.CO2 单位CO2能源消耗小于2.3GJ/t.CO2 利用物理、化学方法捕集水泥窑炉烟气中二氧化碳并进行纯化,建材相关行业可参照。 + 15 10 + 1.4.3.水泥窑全氧燃烧耦合计碳捕集纯化技术 相较常规碳捕集技术,可以显著提升出预热器系统烟气CO2浓度,显著降低烟气捕集提纯系统烟气处理量,可与VPSA提浓+PTSA净化+低温精馏液化提纯工艺有机结合,进而实现单位CO2制备能耗的显著降低。相较常规后捕集技术,能耗和运行成本降低25% 相较常规碳捕集技术,可以显著提升出预热器系统烟气CO2浓度 显著降低烟气捕集提纯系统烟气处理量 可与VPSA提浓+PTSA净化+低温精馏液化提纯工艺有机结合,进而实现单位CO2制备能耗的显著降低 相较常规后捕集技术,能耗和运行成本降低25% + 6 6 6 7 + 1.4.4.水泥工业固体胺碳捕集技术 固体胺循环吸附解吸CO2分别在吸附反应器和再生反应器内进行。在吸附反应器内,固体胺与烟气充分接触,烟气中的CO2快速扩散进入固体胺的孔隙内,与吸附剂表面的胺发生反应,并释放出热量,其中在无水条件下胺和CO2反应生成氨基甲酸盐,在有水条件下根据胺和CO2的摩尔比生成碳酸盐或重碳酸盐,从而将CO2固化下来 固体胺循环吸附解吸CO2分别在吸附反应器和再生反应器内进行。在吸附反应器内,固体胺与烟气充分接触,烟气中的CO2快速扩散进入固体胺的孔隙内,与吸附剂表面的胺发生反应,并释放出热量,其中在无水条件下胺和CO2反应生成氨基甲酸盐,在有水条件下根据胺和CO2的摩尔比生成碳酸盐或重碳酸盐,从而将CO2固化下来 + 25 + 1.5.其他 总量/强度/碳足迹降低xx% 1.5.1 数字化、智能化技术 若使用到数字化、智能化手段 + 25 + 1.5.2.水泥工业原材料及产品绿色运输技术 利用铁路、水路管道、管状带式输送机、皮带通廊等清洁方式运输封闭皮带廊等运输水泥工业原料和燃料;没有条件的地区利用新能源车辆运输原燃料和产品,减少运输碳排放。绿色运输比例20%以上 绿色运输比例20%以上 利用铁路、水路管道、管状带式输送机、皮带通廊等清洁方式运输封闭皮带廊等运输水泥工业原料和燃料 没有条件的地区利用新能源车辆运输原燃料和产品,减少运输碳排放。 + 15 5 5 + 1.5.3.建材矿山均化开采配矿技术 对建材矿石、伴生矿、剥离物的合理与优化开采,以及对剥离物的综合利用,实现矿山宝贵的矿产资源合理利用,剥离物变废为宝 对建材矿石、伴生矿、剥离物的合理与优化开采,以及对剥离物的综合利用,实现矿山宝贵的矿产资源合理利用,剥离物变废为宝 + 25 + 1.5.4.建材矿山生态修复、绿色改造技术 对新建、在建矿山进行绿色矿山改造,通过生态修复、生态园林等,发挥矿山的固碳作用 对新建、在建矿山进行绿色矿山改造,通过生态修复、生态园林等,发挥矿山的固碳作用 + 25 + 1.5.4.低碳 SCR 技术 针对水泥工业流程,采用SNCR+SCR联合脱硝,电耗1.2-2kwh,氨水耗量2.5kg/t熟料,NOx低于35mg/Nm3 电耗1.2-2kwh 氨水耗量2.5kg/t熟料 NOx低于35mg/Nm3 采用SNCR+SCR联合脱硝 + 5 5 5 10 + 1.5.5.企业绩效等级提升行动 参考《重污染天气重点行业应急减排措施制定技术指南(2020年修订版)》(环办大气函〔2020〕340号)、《关于推进实施水泥行业超低排放的意见》(环大气〔2024〕5号)等相关技术文件 《重污染天气重点行业应急减排措施制定技术指南(2020年修订版)》(环办大气函〔2020〕340号)、《关于推进实施水泥行业超低排放的意见》(环大气〔2024〕5号)等相关技术文件 + 25 +石膏行业 2.1.原燃料替代 总量/强度/碳足迹降低xx% 2.1.1.大批量工业副产石膏生产技术-原料无害化处理技术 相比常规工业副产石膏清洗系统,可减少综合能耗5%左右,耗水量及废水排放量最高可减少20%左右,达到或优于GB 33654-2017《建筑石膏单位产品能源消耗限额》中1级能耗限额 可减少综合能耗5%左右 耗水量及废水排放量最高可减少20%左右 达到或优于GB 33654-2017《建筑石膏单位产品能源消耗限额》中1级能耗限额 + 8 8 9 + 2.1.2.大批量工业副产石膏生产技术-原料再生及替代技术 依据GB/T 2589《综合能耗计算通则》,减少综合能耗8%左右 减少综合能耗8%左右 依据GB/T 2589《综合能耗计算通则》 + 15 10 + 2.1.3.石膏生产绿色能源应用技术-绿色能源综合管控技术 依据GB/T2589《综合能耗计算通则》,减少综合能耗2% 减少综合能耗2% 依据GB/T2589《综合能耗计算通则》 + 15 10 + 2.1.4.废弃热源利用技术 原料含水率降低2%~3%。达到或优于GB 33654-2017《建筑石膏单位产品能源消耗限额》中1级能耗限额 原料含水率降低2%~3% 达到或优于1级能耗限额 + 12.5 12.5 + 2.1.5.绿电微波加热技术 依据GB/T 2589《综合能耗计算通则》,降低综合能耗约1%~2% 降低综合能耗约1%~2% 依据GB/T 2589《综合能耗计算通则》 + 15 10 + 2.1.6.石膏生产低热能源应用技术 依据GB/T 2589《综合能耗计算通则》,以常规30t/h建筑石膏生产线为例,烘干部分可降低标煤耗量450t/y,煅烧部分可降低标煤耗量350t/y 以常规30t/h建筑石膏生产线为例,烘干部分可降低标煤耗量450t/y 以常规30t/h建筑石膏生产线为例,煅烧部分可降低标煤耗量350t/y 依据GB/T 2589《综合能耗计算通则》 + 7.5 7.5 10 + 2.2.能效提升 总量/强度/碳足迹降低xx% 2.2.1.高效烟气烘干技术 依据GB/T 2589《综合能耗计算通则》,以30t/h建筑石膏生产线为例,最低排放温度可达82℃可降低标煤耗量450t/y 以30t/h建筑石膏生产线为例,最低排放温度可达82℃可降低标煤耗量450t/y 依据GB/T 2589《综合能耗计算通则》 + 15 10 + 2.2.2.石膏生产能源梯级利用技术 利用换热器废水回用于石膏板配料用水及温度控制从而达到减少耗能的目的,可减少综合能耗5%~10%,达到或优于GB 33654《建筑石膏单位产品能源消耗限额》中1级能耗限额或JC/T 523《纸面石膏板单位产量能源消耗限额》中目标值 利用换热器废水回用于石膏板配料用水及温度控制从而达到减少耗能的目的,可减少综合能耗5%~10% 达到或优于GB 33654《建筑石膏单位产品能源消耗限额》中1级能耗限额或JC/T 523《纸面石膏板单位产量能源消耗限额》中目标值 + 12.5 12.5 + 2.2.3.石膏生产综合能效提升技术 以3000万平方米石膏板生产线为例,可提升产品合格率0.5%~2%左右,降低能耗2%~5%,达到或优于GB 33654《建筑石膏单位产品能源消耗限额》中1级能耗限额 提升产品合格率0.5%~2%左右 降低能耗2%~5% 达到或优于1级能耗限额 + 8 8 9 + 2.3.智能制造 总量/强度/碳足迹降低xx% 2.3.1.原料库无人值守上料及管理系统 采用AI智能行车及铲车,实现原料库智能化管理——智能化堆取料、自动翻料、均化品位和水分,满足大型生产线需要。降低能耗1%~2% 降低能耗1%~2% 采用AI智能行车及铲车,实现原料库智能化管理——智能化堆取料、自动翻料、均化品位和水分,满足大型生产线需要。 + 15 10 + 2.3.2.成品库无人值守及管理系统 成品库采用智能化管理系统,采用AGV小车或AI智能化叉车,实现无人值守、自动化堆存和智能化发货。系统可降低能耗1%~2% 系统可降低能耗1%~2% 成品库采用智能化管理系统,采用AGV小车或AI智能化叉车,实现无人值守、自动化堆存和智能化发货。 + 15 10 +玻璃行业 3.1.原燃料替代 总量/强度/碳足迹降低xx% 3.1.1.碳酸盐原料替代技术 依据GB/T 32150.8《温室气体排放核算与报告要求第7部分:平板玻璃生产企业》,降低CO2排放量≥5% 降低CO2排放量≥5% 依据GB/T 32150.8《温室气体排放核算与报告要求第7部分:平板玻璃生产企业》 + 15 10 + 3.1.2.废弃玻璃高掺入技术 碎玻璃加入量范围8%~30%,依据GB/T 32150.8《温室气体排放核算与报告要求第7部分:平板玻璃生产企业》,降低CO2排放量1%~10% 碎玻璃加入量范围8%~30% 降低CO2排放量1%~10% 依据GB/T 32150.8《温室气体排放核算与报告要求第7部分:平板玻璃生产企业》 + 7.5 7.5 10 + 3.1.3.玻璃熔窑全氧燃烧成套技术装备 依据GB 21340《平板玻璃单位产品能源消耗限额》,熔化单耗降低30%,符合GB 26453《平板玻璃工业大气污染物排放标准》,NOX排放浓度降低到200mg/Nm3以下 熔化单耗降低30% NOX排放浓度降低到200mg/Nm3以下 依据GB 21340《平板玻璃单位产品能源消耗限额》 符合GB 26453《平板玻璃工业大气污染物排放标准》 + 7.5 7.5 5 5 + 3.1.4.配料块化、粒化和预热技术 依据GB/T 32150.8《温室气体排放核算与报告要求第7部分:平板玻璃生产企业》,CO2的排放量降低≥15% CO2的排放量降低≥15% 依据GB/T 32150.8《温室气体排放核算与报告要求第7部分:平板玻璃生产企业》 + 15 10 + 3.2.能效提升 总量/强度/碳足迹降低xx% 3.2.1.玻璃熔窑电助熔技术 玻璃熔化过程中采用电部分替代燃料进行熔化,电助熔比例达到20%时,节能5%~8%,满足GB 21340《平板玻璃单位产品能源消耗限额》平板玻璃单位产品能耗先进值 电助熔比例达到20%时,节能5%~8% 满足GB 21340《平板玻璃单位产品能源消耗限额》平板玻璃单位产品能耗先进值 + 12.5 12.5 + 3.2.2.节能型玻璃窑炉结构优化和配套装备 降低能耗≥6%,满足GB 21340《平板玻璃单位产品能源消耗限额》平板玻璃单位产品能耗先进值 降低能耗≥6% 满足GB 21340《平板玻璃单位产品能源消耗限额》平板玻璃单位产品能耗先进值 + 12.5 12.5 + 3.2.3.玻璃工厂智能制造技术-玻璃工厂数字化管理云平台 满足ISO 23247《自动化系统与集成制造系统的数字孪生架构》、BDS-600《基于模型定义MBD技术应用规范》相关要求 ISO 23247《自动化系统与集成制造系统的数字孪生架构》 BDS-600《基于模型定义MBD技术应用规范》 + 12.5 12.5 + 3.2.4.玻璃工厂智能制造技术-玻璃工厂智能装备及控制系统 满足JC/T 2423《玻璃熔窑余热发电设计规范》相关要求 JC/T 2423《玻璃熔窑余热发电设计规范》 + 25 + 3.2.5.玻璃熔炉脱硫脱硝除尘一体化技术及装备 脱硫效率达95%、脱硝效率达96.5%、颗粒物排放小于10mg/Nm3 脱硫效率达95% 脱硝效率达96.5% 颗粒物排放小于10mg/Nm3 + 9 9 7 + 3.2.6.玻璃窑炉烟气余热发电技术 以600t/d玻璃熔窑为例,年供电量约1680万kWh,可实现年累计节约标准煤5880t,年累计减少CO2排放15400t 以600t/d玻璃熔窑为例,年供电量约1680万kWh 以600t/d玻璃熔窑为例,年累计节约标准煤5880t 以600t/d玻璃熔窑为例,年累计减少CO2排放15400t + 8 8 9 + 3.3.碳捕集封存和利用 总量/强度/碳足迹降低xx% 3.3.1.空气炉窑低浓度 CO2 捕集与转化应用技术与装备 CO2热解吸能耗≤2.2GJ/tCO2、降解速率相比30%MEA水溶液(140℃下为0.348%/h)降低50%以上,满足GB/T 51316《烟气二氧化碳捕集纯化工程设计标准》相关要求 CO2热解吸能耗≤2.2GJ/tCO2 降解速率相比30%MEA水溶液(140℃下为0.348%/h)降低50%以上 满足GB/T 51316《烟气二氧化碳捕集纯化工程设计标准》相关要求 + 7.5 7.5 10 + 3.3.2.全(富)氧燃烧窑炉耦合碳捕集成套技术 针对玻璃炉窑的工艺和烟气特点,采用变压吸附等碳捕集工艺,CO2的捕集率≥90% CO2的捕集率≥90% + 25 + 3.4.绿色低碳 总量/强度/碳足迹降低xx% 3.4.1.新型高效光伏建筑一体化(BIPV)应用技术 装机容量10MW,可实现年发电量1000万度,年减少碳排放约6000吨 装机容量10MW 可实现年发电量1000万度 年减少碳排放约6000吨 + 8 8 9 + 3.5.环保减排改造 总量/强度/碳足迹降低xx% 3.5.1.企业绩效等级提升行动 参考《重污染天气重点行业应急减排措施制定技术指南(2020年修订版)》(环办大气函〔2020〕340号)或相关技术标准 参考《重污染天气重点行业应急减排措施制定技术指南(2020年修订版)》(环办大气函〔2020〕340号)或相关技术标准 + 25 +玻纤行业 4.1 原燃料替代技术 总量/强度/碳足迹降低xx% 4.1.1.玻璃纤维生产大功率电助熔技术 电助熔比例25%以上,依据GB 29450-2012《玻璃纤维单位产品能源消耗限额》,单位产品综合能耗降低>15%,单位产品降低碳排放约2% 电助熔比例25%以上 单位产品综合能耗降低>15% 单位产品降低碳排放约2% 依据GB 29450-2012《玻璃纤维单位产品能源消耗限额》 + 5 5 5 10 + 4.1.2.电熔法岩棉熔制技术 岩棉工厂使用率≥30%,依据T/CFIAB2-2023《温室气体排放核算与报告要求玻璃纤维生产企业》,可降低碳排放约30% 岩棉工厂使用率≥30% 可降低碳排放约30% 依据T/CFIAB2-2023《温室气体排放核算与报告要求玻璃纤维生产企业》 + 7.5 7.5 10 + 4.1.3.玻璃纤维工厂绿色能源零购电改造技术 利用可再生能源技术,与厂区内余热发电技术相结合,替代外购电力约30%,技术覆盖率约30%,依据T/CFIAB2-2023《温室气体排放核算与报告要求玻璃纤维生产企业》,降低单位玻纤产品CO2排放量约5% 替代外购电力约30% 技术覆盖率约30% 降低单位玻纤产品CO2排放量约5% 依据T/CFIAB2-2023《温室气体排放核算与报告要求玻璃纤维生产企业》 + 5 5 5 10 + 4.1.4.玻璃纤维生产线固废高效回用技术与成套装备 玻璃纤维废丝进行短切、脱水、除杂质、粉磨等一系列处理后,作为原料重新用于玻璃纤维生产,回用率≥90% 回用率≥90% + 25 + 4.1.5.岩棉固废高效回用技术与成套装备 固废利用率≥90%,每吨产品协同处理固废≥910kg 固废利用率≥90% 每吨产品协同处理固废≥910kg + 12.5 12.5 + 4.2.规模化玻纤制造 总量/强度/碳足迹降低xx% 4.2.1.增强型玻璃纤维超大规模池窑拉丝生产技术与成套装备 依据GB 29450《玻璃纤维单位产品能源消耗限额》,单窑规模实现年产15万吨及以上,玻璃纤维吨产品综合能耗≤0.28kgce/t 单窑规模实现年产15万吨及以上 玻璃纤维吨产品综合能耗≤0.28kgce/t 依据GB 29450《玻璃纤维单位产品能源消耗限额》 + 7.5 7.5 10 + 4.2.2.电子级玻璃纤维超大规模池窑拉丝生产技术与成套装备 依据GB 29450《玻璃纤维单位产品能源消耗限额》,玻璃纤维电子纱吨产品综合能耗≤0.45kgce/t 玻璃纤维电子纱吨产品综合能耗≤0.45kgce/t 依据GB 29450《玻璃纤维单位产品能源消耗限额》 + 15 10 + 4.2.3.风力发电用高性能玻璃纤维规模化制造技术与成套装备 满足大功率风力发电叶片对于增强材料的性能要求,玻璃纤维产品弹性模量达到90GPa以上,强度在3000MPa以上,且满足GB/T 18369《玻璃纤维无捻粗纱》要求 玻璃纤维产品弹性模量达到90GPa以上 强度在3000MPa以上 满足GB/T 18369《玻璃纤维无捻粗纱》要求 满足大功率风力发电叶片对于增强材料的性能要求 + 7.5 7.5 5 5 + 4.2.4.大幅宽岩棉板线生产技术与成套装备 岩棉板线由传统1.2米幅宽提高至2.4米幅宽,大幅提高岩棉生产效率,可提高生产效率≥50%,降低单位产品能耗≥15% 岩棉板线由传统1.2米幅宽提高至2.4米幅宽 提高生产效率≥50% 降低单位产品能耗≥15% + 8 8 9 + 4.3.提升能效 总量/强度/碳足迹降低xx% 4.3.1.节能型玻璃纤维熔窑技术 依据GB 29450《玻璃纤维单位产品能源消耗限额》,减少约5%热损失,依据T/CFIAB2-2023《温室气体排放核算与报告要求玻璃纤维生产企业》,降低碳排放约5% 减少约5%热损失 降低碳排放约5% 依据GB 29450《玻璃纤维单位产品能源消耗限额》 依据T/CFIAB2-2023《温室气体排放核算与报告要求玻璃纤维生产企业》 + 7.5 7.5 10 + 4.3.2.玻璃纤维生产线全流程热能回收技术 依据GB 29450《玻璃纤维单位产品能源消耗限额》、JC/T 545《玻璃纤维工厂能量平衡通则》等,依据T/CFIAB 2-2023《温室气体排放核算与报告要求玻璃纤维生产企业》,实现单位产品降低碳排放约10% 实现单位产品降低碳排放约10% 依据GB 29450《玻璃纤维单位产品能源消耗限额》、JC/T 545《玻璃纤维工厂能量平衡通则》等 依据T/CFIAB 2-2023《温室气体排放核算与报告要求玻璃纤维生产企业》 + 15 5 5 + 4.3.3.熔窑全氧燃烧技术 依据GB 29450《玻璃纤维单位产品能源消耗限额》、JC/T 545《玻璃纤维工厂能量平衡通则》、T/CFIAB 2-2023《温室气体排放核算与报告要求玻璃纤维生产企业》要求,节能超35%,废气排放量减少70%以上,玻璃液质量和产量均得到提高 节能超35% 废气排放量减少70%以上 玻璃液质量和产量均得到提高 依据GB 29450《玻璃纤维单位产品能源消耗限额》 JC/T 545《玻璃纤维工厂能量平衡通则》 T/CFIAB 2-2023《温室气体排放核算与报告要求玻璃纤维生产企业》 + 5 5 5 4 3 3 + 4.4.玻纤工厂智能制造 总量/强度/碳足迹降低xx% 4.4.1.玻璃纤维生产线预防性诊断及在线监测技术 通过整合生产线全域全周期生产数据,融合数字化技术,形成一套切实可用的生产线预防性诊断系统,确保生产持续稳定运行,减少资源、能源的浪费,实现生产管控精准绿色 减少资源、能源的浪费 整合生产线全域全周期生产数据,融合数字化技术 形成一套切实可用的生产线预防性诊断系统 + 15 5 5 + 4.4.2.玻璃纤维工厂无人值守能源管控技术 通过采集用能数据,实现对能源使用的全面数字化和可视化,直观发现用能改进优化点,优化能源使用,降低企业综合能耗,达到节能增效的目的 对能源使用的全面数字化和可视化 优化能源使用 降低企业综合能耗 + 9 8 8 + 4.4.3.玻璃纤维工厂智能物流一体化技术 通过自动化物流来提质增效,实现玻纤工厂动态24小时不停机生产,精准控制,减少资源的浪费,提高企业生产效率、降低企业生产成本,生产流程稳定,提高产品的一致性 实现玻纤工厂动态24小时不停机生产 精准控制 减少资源的浪费 提高企业生产效率、降低企业生产成本,生产流程稳定,提高产品的一致性 + 6 6 6 7 + 4.4.4.玻璃纤维工厂高效废气治理 采用自动化智能化高效脱硫脱硝治理技术,降低玻璃纤维密炉颗粒物、二氧化碳和氮氧化物等污染物排放浓度,建设环境管控平台实现智能化管控 降低玻璃纤维密炉颗粒物、二氧化碳和氮氧化物等污染物排放浓度 建设环境管控平台实现智能化管控 + 15 10 + 4.5.环保减排改造 总量/强度/碳足迹降低xx% 4.5.1.企业绩效等级提升行动 参考《重污染天气重点行业应急减排措施制定技术指南(2020年修订版)》(环办大气函〔2020〕340号)或相关标准规范 参考《重污染天气重点行业应急减排措施制定技术指南(2020年修订版)》(环办大气函〔2020〕340号)或相关标准规范 + 25 + +2、技术成熟度(总分25) +说明:聚焦企业应用该项减碳技术的综合能力与风险水平。 +打分方式:表格中,有=1,无=0;有经验=1,无经验=0;完整=1,不完整=0;可靠=1,不可靠=0;兼容=1,不兼容=0 +二级指标:5 个;三级指标:15 个 +技术成熟度 +二级指标 权重 三级指标 权重 +技术就绪水平 +备注:基础性评价,用于衡量特定技术从最初的概念提出到最终实现商业化应用所经历的发展阶段。 38% 实验室验证(有/无) 15% + 示范运行(有/无) 15% + 商业化应用(有/无) 10% +企业技术消化与实施能力 +备注:评估企业自身是否具备应用、管理和维护该技术的人才、经验和体系。 35% 技术团队(有经验/无经验) 15% + 操作(有经验/无经验) 5% + 维护(有经验/无经验) 5% + 培训体系(完整/不完整) 10% +供应链与工程保障 +备注:核心技术的专利持有情况 15% 核心设备(可靠/不可靠) 4% + 工程实施能力(有经验/无经验) 4% + 绿色供应链管理(有经验/无经验) 3% + 供应链稳定性(可靠/不可靠) 4% +与现有系统的集成度与适配性 +备注:评估新技术与企业现有生产线、设备、控制系统的匹配和改造难度。 10% 改造现有系统(有经验/无经验) 5% + 系统兼容性(兼容/不兼容) 5% +国际合作与认证 2% 国际合作(有/无) 1% + 国际认证(有/无) 1% +3、企业碳治理(总分13) +说明:涵盖企业在碳排放战略目标设定、管理体系和信息披露方面的整体治理能力。 +打分方式: +表格中,如有=1,无=0;完善=1,不完善=0;定期发布=1;有,但非定期发布=0.5;无=0。 +二级指标: 4个;三级指标: 13个 +企业碳治理 +二级指标 权重 三级指标 权重 +战略与目标 33% 碳中和路线图(有/无) 8% + + 短期/中期/长期减碳目标(有/无) 8% + 设立相关部门(有/无) 15% + 气候相关风险评估与应对机制(有/无) 2% +管理体系 30% 能源与碳排放管理体系(完善/不完善) 10% + 碳排放数据的监测、报告与核查(完善/不完善) 10% + 内部碳定价机制 5% + 碳管理数字化平台建设 5% +信息披露 27% ESG报告(定期发布/有,但非定期发布/无) 20% + 参与权威信息平台披露 4% + 碳中和目标与进展经第三方认证 3% +碳资产运营 10% 碳交易与履约能力 5% + CCER等减排项目开发与管理 5% + +4、融资计划(总分9) +说明:旨在评估企业在项目资金筹划与管理方面的完备性与可靠性,是确保减碳技术得以顺利落地和持续运营的关键保障。 +打分方式:表格中,有=1,无=0 +二级指标: 4个;三级指标: 12个 +融资计划 +二级指标 权重 三级指标 权重 +资金保障与结构 30% 资金分配明细(有/无) 10% + 资本金比例与到位证明(有/无) 10% + 融资渠道多样性(有/无) 10% +经济可行性分析 30% 成本效益分析(有/无) 10% + 碳减排收益量化(有/无) 10% + 社会效益评估(有/无) 10% + 风险识别与管控 30% 风险管控方案(有/无) 10% + 关键风险应对策略与预案(有/无) 10% + 金融机构或第三方风险分担机制(有/无) 10% + 绿色金融工具应用 10% 绿色金融资质认证与资金用途 4% + 融资条款与ESG绩效挂钩 4% + 国际合作资金申请与利用 2% + +5、环境协同效益(总分9) +说明:强调企业在节能降碳之外,对污染物减排、资源综合利用、行业协同和示范效应等方面的综合贡献。 +打分方式:表格中,有=1,无=0 +二级指标:5个;三级指标:11个 +环境协同效益 +二级指标 权值 三级指标 权值 +资源循环 35% 工业固废综合利用率/生物质资源利用率(有/无) 35% +污染物减排 35% 硫化物(有/无) 15% + 氮氧化物(有/无) 15% + 其他(有/无) 5% +生态系统与生物多样性 10% 项目选址生态避让与保护(有/无) 4% + 矿山生态修复与复垦方案(有/无) 4% + 厂区绿化与生态碳汇 2% +产品绿色属性 10% 低碳产品认证与标识 5% + 产品耐久性与回收性设计 5% +环境管理与合规 10% 环保处罚与信访记录 5% + 环境应急管理体系 5% + +6、社会与治理协同效益(总分5) +说明:用于评估项目在社会责任、员工福祉、社区发展、公司治理透明度等方面的表现,体现企业全面可持续发展的能力。 +打分方式:社会与治理协同效益共占5分,其中员工健康与安全占30%、社区参与与发展占25%、 供应链责任管理占25%和公司治理与道德合规占20%。(表格中,有=1,无=0) +二级指标: 4个;三级指标: 12个 + +社会与治理协同效益 +二级指标 权值 三级指标 权值 +员工健康与安全 30% 管理体系与制度(有/无) 10% + 物理环境与防护(有/无) 8% + 员工心理健康支持计划(有/无) 6% + 应急响应与能力建设(有/无) 6% +社区参与与发展 25% 沟通与透明度(有/无) 10% + 经济与发展贡献(有/无) 8% + 负面影响缓解(有/无) 7% + 供应链责任管理 25% 供应商行为准则(有/无) 10% + 供应商筛查与评估(有/无) 8% + 审核与改进(有/无) 7% +公司治理与道德合规 20% 治理结构(有/无) 10% + 商业道德与反腐败(有/无) 10% + +7、创新与可持续竞争力(总分2) +说明:该指标用于评估企业在低碳转型过程中的技术创新能力、市场竞争力、品牌价值提升以及长期可持续发展潜力。不仅关注当前减碳效果,更强调企业是否具备持续引领行业绿色转型的能力。 +打分方式:表格中,有=1,无=0;是=1,否=0;符合=1,不符合=0。 +二级指标: 3个;三级指标: 15个 +创新与可持续竞争力 +二级指标 权重 三级指标 权重 +技术创新与研发投入 50% 年度研发投入占营业收入比例(≥3%)(是/否) 7% + 拥有低碳技术相关专利数量(≥2项)(是/否) 7% + 参与国家级/省级绿色技术研发项目(有/无) 6% + 建立低碳技术中试平台或实验室(有/无) 6% + 与技术高校/研究院所合作开展低碳研发(有/无) 6% + 技术迭代与升级计划(有/无) 6% + 技术成果转化率(≥60%)(是/否) 6% + 低碳技术标准化参与度(制定/参与行业/国家/国际标准)(有/无) 6% + 市场竞争力与品牌绿色价值 40% 绿色产品销售收入占比(≥20%)(是/否) 6% + 获得绿色产品/低碳产品认证(如绿色建材标识、碳标签等)(有/无) 6% + 客户对绿色产品的认可度(通过调研或第三方评估)(有/无) 6% + 出口产品符合国际低碳标准(如欧盟碳边境调节机制CBAM)(符合/不符合) 5% + 绿色营销与消费者教育投入(有/无) 5% +长期可持续发展战略 10% 设立低碳转型专项基金或预算(有/无) 5% + 参与国际倡议(有/无) 5% + +8、数字化与智能化水平(总分2) +说明:评估企业在减碳过程中应用数字化、智能化技术的深度与广度,包括数据采集、分析、预测、优化与控制等方面,是现代化减碳能力的重要体现。 +打分方式:表格中,有=1,无=0;是=1,否=0;符合=1,不符合=0。 +二级指标:4个;三级指标:12个 + 数字化与智能化水平 +二级指标 权重 三级指标 权重 +数据基础与采集能力 25% 碳排放实时监测覆盖率 8% + 数据自动化采集比例 8% + 数据质量与校验机制 9% + 智能分析与决策支持 25% AI预测减碳潜力 8% + 数字化碳管理平台 9% + 智能优化控制算法应用 8% +系统集成与互联互通 25% ERP/EMS/MES系统集成度 8% + IoT设备覆盖率 8% + 跨系统数据协同能力 9% +网络安全与数据治理 25% 碳数据安全管理 8% + 系统抗攻击能力 8% + 数据合规性与审计追踪 9% +# 以下是用户报告内容 diff --git a/apps/carbon/promot/tec_dh_md_tables.md b/apps/carbon/promot/tec_dh_md_tables.md new file mode 100644 index 0000000..1a94fa4 --- /dev/null +++ b/apps/carbon/promot/tec_dh_md_tables.md @@ -0,0 +1,253 @@ +# 角色 +你是一位低碳金融专家,具备深厚的专业知识和丰富的实践经验。你能够精准理解用户的报告。 +# 技能 +1. 仔细分析用户提供的技术报告,获取里面的所有关键点。 +2. 根据用户提供的报告和评分标准进行评分。 +# 回答要求 +仅回答一个具体的分数,不要回答其他内容。 +# 以下是评分标准 +转型金融主体认定评价指标设定 +本体系共设定8个一级指标,47个二级指标,169个三级指标。具体分值权重需由专业人士结合行业实际情况修改。 +一、 一级指标 + +| 一级指标 | 权重 | 分值(满分100) | 备注 | +|---|---:|---:|---| +| 减碳量 | 35% | 35 | 核心指标,直接体现转型成效 | +| 技术成熟度 | 25% | 25 | 决定技术可行性与推广价值 | +| 企业碳治理 | 13% | 13 | 反映企业长期减碳意愿与能力 | +| 融资计划 | 9% | 9 | 体现项目落地与资金保障能力 | +| 环境协同效益 | 9% | 9 | 综合评价项目的社会与环境价值 | +| 社会与治理协同效益 | 5% | 5 | 体现企业全面可持续发展的能力 | +| 创新与可持续竞争力 | 2% | 2 | 体现企业是否具备持续引领行业绿色转型的能力 | +| 数字化与智能化水平 | 2% | 2 | 体现企业是否具备持续引领行业绿色转型的能力 | + +二、二级指标(含三级指标) +(以下部分保留原文格式的大段表格内容,已逐步转换关键的汇总类表格;如需继续转换全部行业细表,请告知,我会继续转换。) + +### 技术成熟度 +说明:聚焦企业应用该项减碳技术的综合能力与风险水平。 +打分方式:表格中,有=1,无=0;有经验=1,无经验=0;完整=1,不完整=0;可靠=1,不可靠=0;兼容=1,不兼容=0 +二级指标:5 个;三级指标:15 个 + +技术成熟度 + +| 二级指标 | 权重 | 三级指标 | 权重 | +|---|---:|---|---:| +| 技术就绪水平(备注:基础性评价,用于衡量特定技术从最初的概念提出到最终实现商业化应用所经历的发展阶段。) | 38% | 实验室验证(有/无) | 15% | +| | | 示范运行(有/无) | 15% | +| | | 商业化应用(有/无) | 10% | +| 企业技术消化与实施能力(备注:评估企业自身是否具备应用、管理和维护该技术的人才、经验和体系。) | 35% | 技术团队(有经验/无经验) | 15% | +| | | 操作(有经验/无经验) | 5% | +| | | 维护(有经验/无经验) | 5% | +| | | 培训体系(完整/不完整) | 10% | +| 供应链与工程保障(备注:核心技术的专利持有情况) | 15% | 核心设备(可靠/不可靠) | 4% | +| | | 工程实施能力(有经验/无经验) | 4% | +| | | 绿色供应链管理(有经验/无经验) | 3% | +| | | 供应链稳定性(可靠/不可靠) | 4% | +| 与现有系统的集成度与适配性(备注:评估新技术与企业现有生产线、设备、控制系统的匹配和改造难度。) | 10% | 改造现有系统(有经验/无经验) | 5% | +| | | 系统兼容性(兼容/不兼容) | 5% | +| 国际合作与认证 | 2% | 国际合作(有/无) | 1% | +| | | 国际认证(有/无) | 1% | + +### 企业碳治理 +说明:涵盖企业在碳排放战略目标设定、管理体系和信息披露方面的整体治理能力。 +打分方式: +表格中,如有=1,无=0;完善=1,不完善=0;定期发布=1;有,但非定期发布=0.5;无=0。 +二级指标: 4个;三级指标: 13个 + +企业碳治理 + +| 二级指标 | 权重 | 三级指标 | 权重 | +|---|---:|---|---:| +| 战略与目标 | 33% | 碳中和路线图(有/无) | 8% | +| | | 短期/中期/长期减碳目标(有/无) | 8% | +| | | 设立相关部门(有/无) | 15% | +| | | 气候相关风险评估与应对机制(有/无) | 2% | +| 管理体系 | 30% | 能源与碳排放管理体系(完善/不完善) | 10% | +| | | 碳排放数据的监测、报告与核查(完善/不完善) | 10% | +| | | 内部碳定价机制 | 5% | +| | | 碳管理数字化平台建设 | 5% | +| 信息披露 | 27% | ESG报告(定期发布/有,但非定期发布/无) | 20% | +| | | 参与权威信息平台披露 | 4% | +| | | 碳中和目标与进展经第三方认证 | 3% | +| 碳资产运营 | 10% | 碳交易与履约能力 | 5% | +| | | CCER等减排项目开发与管理 | 5% | + +### 融资计划 +说明:旨在评估企业在项目资金筹划与管理方面的完备性与可靠性,是确保减碳技术得以顺利落地和持续运营的关键保障。 +打分方式:表格中,有=1,无=0 +二级指标: 4个;三级指标: 12个 + +融资计划 + +| 二级指标 | 权重 | 三级指标 | 权重 | +|---|---:|---|---:| +| 资金保障与结构 | 30% | 资金分配明细(有/无) | 10% | +| | | 资本金比例与到位证明(有/无) | 10% | +| | | 融资渠道多样性(有/无) | 10% | +| 经济可行性分析 | 30% | 成本效益分析(有/无) | 10% | +| | | 碳减排收益量化(有/无) | 10% | +| | | 社会效益评估(有/无) | 10% | +| 风险识别与管控 | 30% | 风险管控方案(有/无) | 10% | +| | | 关键风险应对策略与预案(有/无) | 10% | +| | | 金融机构或第三方风险分担机制(有/无) | 10% | +| 绿色金融工具应用 | 10% | 绿色金融资质认证与资金用途 | 4% | +| | | 融资条款与ESG绩效挂钩 | 4% | +| | | 国际合作资金申请与利用 | 2% | + +### 环境协同效益 +说明:强调企业在节能降碳之外,对污染物减排、资源综合利用、行业协同和示范效应等方面的综合贡献。 +打分方式:表格中,有=1,无=0 +二级指标:5个;三级指标:11个 + +环境协同效益 + +| 二级指标 | 权值 | 三级指标 | 权值 | +|---|---:|---|---:| +| 资源循环 | 35% | 工业固废综合利用率/生物质资源利用率(有/无) | 45% | +| 污染物减排 | 35% | 硫化物(有/无) | 15% | +| | | 氮氧化物(有/无) | 15% | +| | | 其他(有/无) | 15% | +| 生态系统与生物多样性 | 10% | 项目选址生态避让与保护(有/无) | 4% | +| | | 矿山生态修复与复垦方案(有/无) | 4% | +| | | 厂区绿化与生态碳汇 | 2% | +| 产品绿色属性 | 10% | 低碳产品认证与标识 | 5% | +| | | 产品耐久性与回收性设计 | 5% | +| 环境管理与合规 | 10% | 环保处罚与信访记录 | 5% | +| | | 环境应急管理体系 | 5% | + +### 社会与治理协同效益 +说明:用于评估项目在社会责任、员工福祉、社区发展、公司治理透明度等方面的表现,体现企业全面可持续发展的能力。 +打分方式:社会与治理协同效益共占5分,其中员工健康与安全占30%、社区参与与发展占25%、 供应链责任管理占25%和公司治理与道德合规占20%。(表格中,有=1,无=0) +二级指标: 4个;三级指标: 12个 + +社会与治理协同效益 + +| 二级指标 | 权值 | 三级指标 | 权值 | +|---|---:|---|---:| +| 员工健康与安全 | 30% | 管理体系与制度(有/无) | 10% | +| | | 物理环境与防护(有/无) | 8% | +| | | 员工心理健康支持计划(有/无) | 6% | +| | | 应急响应与能力建设(有/无) | 6% | +| 社区参与与发展 | 25% | 沟通与透明度(有/无) | 10% | +| | | 经济与发展贡献(有/无) | 8% | +| | | 负面影响缓解(有/无) | 7% | +| 供应链责任管理 | 25% | 供应商行为准则(有/无) | 10% | +| | | 供应商筛查与评估(有/无) | 8% | +| | | 审核与改进(有/无) | 7% | +| 公司治理与道德合规 | 20% | 治理结构(有/无) | 10% | +| | | 商业道德与反腐败(有/无) | 10% | + +### 创新与可持续竞争力 +说明:该指标用于评估企业在低碳转型过程中的技术创新能力、市场竞争力、品牌价值提升以及长期可持续发展潜力。 +打分方式:表格中,有=1,无=0;是=1,否=0;符合=1,不符合=0。 +二级指标: 3个;三级指标: 15个 + +创新与可持续竞争力 + +| 二级指标 | 权重 | 三级指标 | 权重 | +|---|---:|---|---:| +| 技术创新与研发投入 | 50% | 年度研发投入占营业收入比例(≥3%)(是/否) | 7% | +| | | 拥有低碳技术相关专利数量(≥2项)(是/否) | 7% | +| | | 参与国家级/省级绿色技术研发项目(有/无) | 6% | +| | | 建立低碳技术中试平台或实验室(有/无) | 6% | +| | | 与技术高校/研究院所合作开展低碳研发(有/无) | 6% | +| | | 技术迭代与升级计划(有/无) | 6% | +| | | 技术成果转化率(≥60%)(是/否) | 6% | +| | | 低碳技术标准化参与度(制定/参与行业/国家/国际标准)(有/无) | 6% | +| 市场竞争力与品牌绿色价值 | 40% | 绿色产品销售收入占比(≥20%)(是/否) | 6% | +| | | 获得绿色产品/低碳产品认证(如绿色建材标识、碳标签等)(有/无) | 6% | +| | | 客户对绿色产品的认可度(通过调研或第三方评估)(有/无) | 6% | +| | | 出口产品符合国际低碳标准(如欧盟碳边境调节机制CBAM)(符合/不符合) | 5% | +| | | 绿色营销与消费者教育投入(有/无) | 5% | +| 长期可持续发展战略 | 10% | 设立低碳转型专项基金或预算(有/无) | 5% | +| | | 参与国际倡议(有/无) | 5% | + +### 数字化与智能化水平 +说明:评估企业在减碳过程中应用数字化、智能化技术的深度与广度,包括数据采集、分析、预测、优化与控制等方面,是现代化减碳能力的重要体现。 +打分方式:表格中,有=1,无=0;是=1,否=0;符合=1,不符合=0。 +二级指标:4个;三级指标:12个 + +数字化与智能化水平 + +| 二级指标 | 权重 | 三级指标 | 权重 | +|---|---:|---|---:| +| 数据基础与采集能力 | 25% | 碳排放实时监测覆盖率 | 8% | +| | | 数据自动化采集比例 | 8% | +| | | 数据质量与校验机制 | 9% | +| 智能分析与决策支持 | 25% | AI预测减碳潜力 | 8% | +| | | 数字化碳管理平台 | 9% | +| | | 智能优化控制算法应用 | 8% | +| 系统集成与互联互通 | 25% | ERP/EMS/MES系统集成度 | 8% | +| | | IoT设备覆盖率 | 8% | +| | | 跨系统数据协同能力 | 9% | +| 网络安全与数据治理 | 25% | 碳数据安全管理 | 8% | +| | | 系统抗攻击能力 | 8% | +| | | 数据合规性与审计追踪 | 9% | + + +### 减碳量 — 水泥行业 +说明:将“减碳量”按二级、三级指标拆分,以下为水泥行业的逐项三级指标说明。 + +#### 1.1 低碳水泥(总览) + +| 三级指标 | 指标说明 | 指标说明 - 定量 | 指标说明 - 定性 | 分值 | +|---|---|---|---|---:| +| 1.1.1 高贝利特低热/中热硅酸盐水泥及其制备技术 | 熟料矿物中硅酸二钙由当前的20%提升至40%以上,性能满足相关标准,生产线能效达到或优于1级能效 | 硅酸二钙由当前的20%提升至40% | 达到或优于GB 16780《水泥单位产品能源消耗限额》1级能效水平 | 7.5 / 7.5 / 10 | +| 1.1.2 硫铝酸盐和铁铝酸盐水泥及其制备技术 | 以硅铝质天然原料或固废为原料,熟料石灰石用量降低30%以上,满足相关标准与能效要求 | 熟料生产中石灰石用量降低30%以上 | 熟料及水泥生产线达到或优于JC/T 2821中1级能耗水平 | 7.5 / 7.5 / 5 / 5 | +| 1.1.3 贝利特-硫铝酸钙-硫硅酸钙新型低碳熟料及其制备技术 | 以低品位石灰石、粉煤灰及赤泥等为原料,满足GB 175等标准,生产线能效达1级 | 生产线达到或优于JC/T 2821中1级能效水平 | 水泥性能满足GB 175要求 | 15 / — / 10 | +| 1.1.4 大掺量固废制备少熟料低碳水泥技术 | 以工业固废为主要粉体原材料,性能满足相关规程,碳排放较硅酸盐水泥降低50%以上 | 碳排放较硅酸盐水泥降低50%以上 | 符合T/CECS 689、JC/T 2391等技术要求 | 15 / — / 5 / 5 | +| 1.1.5 镁质低碳水泥及其制备技术 | 以煅烧菱镁矿为粉体原料,磷酸盐溶液为拌合溶液,碳排放较硅酸盐水泥降低约10% | 碳排放较硅酸盐水泥降低约10% | 原料与工艺说明 | 15 / — / 5 / 5 | +| 1.1.6 热活化高岭土制备低碳水泥技术 | 熟料掺量降低至50%及以下,满足GB 175要求,生产线能效达1级 | 熟料掺量降低至50%及以下 | 满足GB 175与GB 16780等要求 | 7.5 / 7.5 / 10 | + +#### 1.2 水泥绿色能源及原燃料替代 + +| 三级指标 | 指标说明 | 指标说明 - 定量 | 指标说明 - 定性 | 分值 | +|---|---|---|---|---:| +| 1.2.1 水泥工厂近零购电改造技术 | 使用风电、光电、风光储及余热发电等技术减少外购电 | 减少水泥生产过程中的电力消耗 | 改造现有水泥厂实现“零购电”或“近零购电” | 15 / — / 4 / 3 / 3 | +| 1.2.2 熟料烧成化石能源替代减碳技术 | 一次化石燃料替代率25%~50%,综合能耗降低25%~50% | 一次化石燃料替代率25%~50%;熟料单位产品综合能耗降低25%~50% | 按GB/T 26281等规范核算评估,熟料单位产品碳排放降低50—100kg/t.cl | 5 / 5 / 5 / 5 / 5 | +| 1.2.3 电石渣全部替代石灰石质原料新型干法水泥生产技术 | 采用电石渣替代石灰石,熟料单位产品碳排放减少300—500kg/t.cl | 熟料单位产品碳排放减少300—500kg/t.cl | 按相关指南规范进行核算评估 | 15 / — / 10 | +| 1.2.4 工业副产石膏替代石灰石(硫酸联产)技术 | 采用工业副产石膏替代天然石灰石,熟料单位产品碳排放降低约400kg/t.cl | 熟料单位产品碳排放降低约400kg/t.cl | 按相关指南进行核算评估 | 15 / — / 10 | +| 1.2.5 低碳生料配料技术 | 石灰石质原料替代率达到5%以上,熟料单位产品碳排放减少25—100kg/t.cl | 石灰石质原料替代率达到5%以上 | 按相关指南进行核算评估 | 7.5 / 7.5 / 10 | +| 1.2.6 赤泥制水泥技术 | 突破15%以上赤泥替代石灰石作为钙质原料,熟料单位产品碳排放减少≥75kg/t.cl | 赤泥替代率≥15% | 满足GB 175要求并按指南核算 | 7.5 / 7.5 / 5 / 5 | +| 1.2.7 水泥窑余热利用污泥协同处置技术 | 满足GB 30760要求,污泥入机水分60%~80%,出机水分10%~20%,处理量50—250t/d | 污泥入机水分60%~80%;出机水分10%~20%;处理量50—250t/d;降低熟料热耗1.5kgce/t.cl | 满足相关标准及热平衡规范 | 3.75 / 3.75 / 3.75 / 3.75 / 5 / 5 | +| 1.2.8 水泥窑固体生物质替代燃料利用技术 | 将固体生物质替代燃料送入回转窑及分解炉,减少化石燃料消耗(示例:桉树皮替代) | 桉树皮平均使用量为2.48t/h时,吨熟料实物煤下降3.99kg/t | 描述替代效果与工艺路径 | 7.5 / 7.5 / 10 | + +#### 1.3 能效提升 + +| 三级指标 | 指标说明 | 指标说明 - 定量 | 指标说明 - 定性 | 分值 | +|---|---|---|---|---:| +| 1.3.1 水泥工厂工程建设数字化技术 | 综合应用BIM、GIS、IoT,减少工程建设碳排放5%~8% | 减少工程建设碳排放5%~8% | 应用BIM、GIS、IoT等数字化技术 | 15 / — / 10 | +| 1.3.2 水泥制造全流程智慧管控技术 | 建立一体化智慧管控平台,综合能耗降低1%~3%,碳排放降低1% | 综合能耗降低1%~3%;碳排放降低1% | 依据GB/T 26281、GB/T 32150.8等标准建设平台 | 7.5 / 7.5 / 2.5 / 2.5 / 5 | +| 1.3.3 高能效低碳预热预分解系统集成技术 | 新线熟料单位产品综合能耗小于100kg/t.cl;NOx初始浓度指标 | 新线能耗<100kg/t.cl;老线降耗4—8kg/t.cl | 按GB/T 26281/26282规范 | 7.5 / 7.5 / 5 / 5 | +| 1.3.4 第四代高效中置辊破篦冷机 | 热回收效率≥75%、二次风温≥1150℃等;降低综合能耗 | 热回收效率等技术指标 | 按相关标准和能耗规范评估 | 7.5 / 7.5 / 5 / 5 | +| 1.3.5 高效联合粉磨节能技术 | 提高粉碎效率,降低单位产品电耗,减少碳排放8—16kg/t | 生产PO42.5水泥单位产品电耗≤26kWh/t;减少碳排放8—16kg/t | 采用高压料床等先进粉磨设备 | 4 / 4 / 3 / 4 / 10 | +| 1.3.6 高效生料终粉磨技术 | 单位产品电耗较传统球磨降低40%以上 | 降耗≥40% | 技术说明 | 25 | +| 1.3.7 节能耐火材料提升技术 | 满足JC/T 2196等要求,综合能耗降低1-3kgce/t.cl | 综合能耗降低1-3kgce/t.cl | 技术与材料要求 | 15 / — / 5 / 5 | +| 1.3.8 提升机节能技术 | 优先选用胶带提升机,配套智能电机与料量监测系统 | 降低设备电耗 | 智能化运行与负载调节 | 7 / 6 / 6 / 6 | +| 1.3.9 粉状原燃料精确计量技术 | 采用智能控制算法与高精度计量,实现动态精确计量 | 动态精确计量能力 | 技术与设备描述 | 12.5 / 12.5 | +| 1.3.10 水泥窑用风机节能技术 | 风机能耗降低10%~40% | 风机能耗降低10%~40% | 按GB/T 26281评估 | 15 / — / 10 | +| 1.3.11 立式辊磨机粒化矿渣粉制备技术 | 利用矿渣微粉替代水泥,可降低CO2排放约80%~90% | 降低CO2排放约80%~90% | 应用场景与技术优势 | 25 | +| 1.3.12 生料外循环料床终粉磨系统技术 | 相比传统立磨,系统电耗降低20%~30% | 系统电耗降低20%~30% | 技术说明 | 25 | +| 1.3.13 水泥窑富氧燃烧技术 | 富氧燃烧提高烟气CO2浓度(可达90%~95%),便于捕集 | 提高烟气中CO2浓度,减少烟气排放 | 技术路径说明 | 7.5 / 7.5 / 10 | + +#### 1.4 碳捕集、封存与利用 + +| 三级指标 | 指标说明 | 指标说明 - 定量 | 指标说明 - 定性 | 分值 | +|---|---|---|---|---:| +| 1.4.1 全氧燃烧耦合低能耗碳捕集技术 | 出预热器烟气CO2浓度≥80%(干基),单位CO2能耗<1.6GJ/t.CO2 | 出预热器烟气CO2浓度≥80%;单位CO2能源消耗小于1.6GJ/t.CO2 | 按GB/T 26282等规范评估 | 7.5 / 7.5 / 10 | +| 1.4.2 水泥窑炉烟气捕集 CO2 技术 | 物理/化学方法捕集并纯化烟气中CO2,单位CO2能耗小于2.3GJ/t.CO2 | 单位CO2能源消耗小于2.3GJ/t.CO2 | 技术通用性与行业参照 | 15 / — / 10 | +| 1.4.3 全氧燃烧耦合碳捕集纯化技术 | 提升出预热器系统烟气CO2浓度,与VPSA+PTSA等工艺结合,能耗与成本下降约25% | 显著提升预热器系统烟气CO2浓度 | 可与提浓、净化、低温精馏等工艺结合 | 6 / 6 / 6 / 7 | +| 1.4.4 固体胺碳捕集技术 | 固体胺循环吸附解吸CO2,吸附/解吸在不同反应器中进行,适应有/无水条件的不同产物 | 吸附解吸工艺描述 | 过程与材料稳定性说明 | 25 | + +#### 1.5 其他 + +| 三级指标 | 指标说明 | 指标说明 - 定量 | 指标说明 - 定性 | 分值 | +|---|---|---|---|---:| +| 1.5.1 数字化、智能化技术 | 若使用到数字化、智能化手段,作为减碳支撑 | — | 应用场景说明 | 25 | +| 1.5.2 绿色运输技术 | 利用铁路、水路、管道、封闭皮带廊等清洁方式运输,绿色运输比例20%以上 | 绿色运输比例20%以上 | 运输方式与新能源车辆使用说明 | 15 / — / 5 / 5 | +| 1.5.3 建材矿山均化开采配矿技术 | 合理优化开采与综合利用剥离物,实现资源合理利用 | — | 生态与资源利用说明 | 25 | +| 1.5.4 建材矿山生态修复、绿色改造 | 对新建/在建矿山进行生态修复、绿色改造,发挥固碳作用 | — | 修复与改造方案说明 | 25 | +| 1.5.5 低碳 SCR 技术 | 采用SNCR+SCR联合脱硝,电耗1.2-2kWh,氨水耗2.5kg/t熟料,NOx低于35mg/Nm3 | 电耗1.2-2kWh;氨水耗2.5kg/t熟料;NOx<35mg/Nm3 | 技术组合说明 | 5 / 5 / 5 / 10 | +| 1.5.6 企业绩效等级提升行动 | 参考行业技术指南与政策文件,提升企业绩效等级 | — | 参照政策与标准 | 25 | + diff --git a/apps/carbon/serializers.py b/apps/carbon/serializers.py new file mode 100644 index 0000000..ac6d1a5 --- /dev/null +++ b/apps/carbon/serializers.py @@ -0,0 +1,34 @@ +from apps.utils.serializers import CustomModelSerializer +from .models import Work +from rest_framework import serializers +from apps.system.serializers import FileSerializer + +class WorkSerializer(CustomModelSerializer): + create_by_name = serializers.CharField(source='create_by.name', read_only=True) + belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True) + dq_file1_ = FileSerializer(source='dq_file1', read_only=True) + dq_file2_ = FileSerializer(source='dq_file2', read_only=True) + dq_file3_ = FileSerializer(source='dq_file3', read_only=True) + dq_file4_ = FileSerializer(source='dq_file4', read_only=True) + dq_file5_ = FileSerializer(source='dq_file5', read_only=True) + dq_file6_ = FileSerializer(source='dq_file6', read_only=True) + class Meta: + model = Work + exclude = ['fingerprint_dq', 'fingerprint_dh'] + +class WorkCreateSerializer(CustomModelSerializer): + class Meta: + model = Work + fields = ["name", "type", "description"] + + +class WorkDqCalSerializer(CustomModelSerializer): + class Meta: + model = Work + fields = ["dq_file1", "dq_file2", "dq_file3", "dq_file4", "dq_file5", "dq_file6"] + + +class WorkDhCalSerializer(CustomModelSerializer): + class Meta: + model = Work + fields = ["dh_file1", "dh_file2", "dh_file3", "dh_file4", "dh_file5", "dh_file6"] \ No newline at end of file diff --git a/apps/carbon/service.py b/apps/carbon/service.py new file mode 100644 index 0000000..80fe58b --- /dev/null +++ b/apps/carbon/service.py @@ -0,0 +1,64 @@ +import io +from docx import Document +import fitz +import subprocess +from rest_framework.exceptions import ParseError +from simhash import Simhash +def parse_file(file_path:str): + file_type = file_path.split('.')[-1].lower() + try: + if file_type == "pdf": + with open(file_path, "rb") as f: + pdf_stream = io.BytesIO(f.read()) + doc = fitz.open(stream=pdf_stream, filetype="pdf") + try: + text_content = "\n".join(page.get_text() for page in doc) + t_plain = text_content.strip() + if t_plain: + return t_plain + else: + return ParseError("无法直接提取文本,请使用 OCR 处理") + finally: + doc.close() + elif file_type == "docx": + with open(file_path, "rb") as f: + doc = Document(io.BytesIO(f.read())) + try: + parts = [] + # 提取段落 + for paragraph in doc.paragraphs: + if paragraph.text.strip(): # 可选:跳过空段落 + parts.append(paragraph.text) + # 提取表格 + for table in doc.tables: + for row in table.rows: + row_text = " ".join(cell.text.strip() for cell in row.cells) + if row_text: # 可选:跳过空行 + parts.append(row_text) + text_content = "\n".join(parts) + return text_content + finally: + pass + elif file_type == "doc": + try: + completed = subprocess.run(['catdoc', file_path], capture_output=True, text=True) + if completed.returncode != 0: + raise ParseError(completed.stderr) + return completed.stdout + finally: + pass + elif file_type == "txt": + with open(file_path, 'r', encoding='utf-8') as f: + text_content = f.read() + return text_content + raise ParseError("不支持的文件类型") + except Exception as e: + raise ParseError(f"文件解析错误: {str(e)}") + + +def get_fingerprint(text): + return Simhash(text).value + +# --- 汉明距离 --- +def hamming_distance(a, b): + return bin(a ^ b).count("1") \ No newline at end of file diff --git a/apps/carbon/standard.json b/apps/carbon/standard.json new file mode 100644 index 0000000..05bc744 --- /dev/null +++ b/apps/carbon/standard.json @@ -0,0 +1,1188 @@ +[ + { + "firstLevel": "一、碳排放(20分)", + "secondLevel": "碳排放总量", + "thirdLevel": null, + "scoringCriteria": [ + { + "选项": "下降0至5%", + "得分": 1.5 + }, + { + "选项": "下降5%(含)至10%", + "得分": 2.5 + }, + { + "选项": "下降10%及以上", + "得分": 5 + } + ], + "fullScore": 5, + "result": "", + "id": 1 + }, + { + "firstLevel": "一、碳排放(20分)", + "secondLevel": "碳排放强度", + "thirdLevel": null, + "scoringCriteria": [ + { + "选项": "下降0至5%", + "得分": 1.5 + }, + { + "选项": "下降5%(含)至10%", + "得分": 2.5 + }, + { + "选项": "下降10%及以上", + "得分": 5 + } + ], + "fullScore": 5, + "result": "", + "id": 2 + }, + { + "firstLevel": "一、碳排放(20分)", + "secondLevel": "产品碳足迹", + "thirdLevel": null, + "scoringCriteria": [ + { + "选项": "下降0至5%", + "得分": 1.5 + }, + { + "选项": "下降5%(含)至10%", + "得分": 2.5 + }, + { + "选项": "下降10%及以上", + "得分": 5 + } + ], + "fullScore": 5, + "result": "", + "id": 3 + }, + { + "firstLevel": "一、碳排放(20分)", + "secondLevel": "碳减排目标", + "thirdLevel": null, + "scoringCriteria": [ + { + "选项": "有", + "得分": 5 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 5, + "result": "", + "id": 4 + }, + { + "firstLevel": "二、技术路径(35 分)", + "secondLevel": "水泥绿色能源及原燃料替代;能效提升;低碳水泥;碳捕集封存和利用;其他绿色制造技术", + "thirdLevel": "水泥低碳烧成技术与装备、水泥低碳烧成技术与装备、高贝利特低热/中热硅酸盐水泥及其制备技术、全氧燃烧耦合低能耗碳捕集技术、建材矿山均化开采配矿技术等节能减碳技术的应用", + "scoringCriteria": [ + { + "选项": "有", + "得分": 35 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 35, + "result": "", + "id": 5 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "战略与目标", + "thirdLevel": "碳中和路线图", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.8 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.8, + "result": "", + "id": 6 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "战略与目标", + "thirdLevel": "短期/中期/长期减碳目标", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.8 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.8, + "result": "", + "id": 7 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "战略与目标", + "thirdLevel": "设立碳管理相关部门", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1.5 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1.5, + "result": "", + "id": 8 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "战略与目标", + "thirdLevel": "气候相关风险评估机制", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.2 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.2, + "result": "", + "id": 9 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "管理体系", + "thirdLevel": "能源与碳排放管理体系", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 10 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "管理体系", + "thirdLevel": "碳排放数据监测、报告与核查", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 11 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "管理体系", + "thirdLevel": "内部碳定价机制", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.5 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.5, + "result": "", + "id": 12 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "管理体系", + "thirdLevel": "碳管理数字化平台建设", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.5 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.5, + "result": "", + "id": 13 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "信息披露", + "thirdLevel": "ESG报告", + "scoringCriteria": [ + { + "选项": "定期发布", + "得分": 2 + }, + { + "选项": "非定期发布", + "得分": 2 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 2, + "result": "", + "id": 14 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "信息披露", + "thirdLevel": "参与权威信息平台披露", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.4 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.4, + "result": "", + "id": 15 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "信息披露", + "thirdLevel": "碳中和目标与进展经第三方认证", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.3 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.3, + "result": "", + "id": 16 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "碳资产运营", + "thirdLevel": "碳交易与履约能力", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.5 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.5, + "result": "", + "id": 17 + }, + { + "firstLevel": "三、企业碳治理(10分)", + "secondLevel": "碳资产运营", + "thirdLevel": "CCER等减排项目开发管理", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.5 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.5, + "result": "", + "id": 18 + }, + { + "firstLevel": "四、融资计划(10分)", + "secondLevel": "资金保障与结构", + "thirdLevel": "资金分配明细", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 19 + }, + { + "firstLevel": "四、融资计划(10分)", + "secondLevel": "资金保障与结构", + "thirdLevel": "资本金比例与到位证明", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 20 + }, + { + "firstLevel": "四、融资计划(10分)", + "secondLevel": "资金保障与结构", + "thirdLevel": "融资渠道多样性", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 21 + }, + { + "firstLevel": "四、融资计划(10分)", + "secondLevel": "经济可行性分析", + "thirdLevel": "成本效益分析", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 22 + }, + { + "firstLevel": "四、融资计划(10分)", + "secondLevel": "经济可行性分析", + "thirdLevel": "碳减排收益量化", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 23 + }, + { + "firstLevel": "四、融资计划(10分)", + "secondLevel": "经济可行性分析", + "thirdLevel": "社会效益评估", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 24 + }, + { + "firstLevel": "四、融资计划(10分)", + "secondLevel": "风险识别与管控", + "thirdLevel": "风险管控方案", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 25 + }, + { + "firstLevel": "四、融资计划(10分)", + "secondLevel": "风险识别与管控", + "thirdLevel": "关键风险应对策略与预案", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 26 + }, + { + "firstLevel": "四、融资计划(10分)", + "secondLevel": "风险识别与管控", + "thirdLevel": "金融机构或第三方风险分担机制", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 27 + }, + { + "firstLevel": "四、融资计划(10分)", + "secondLevel": "绿色金融工具应用", + "thirdLevel": "绿色金融资质认证与资金用途", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.4 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.4, + "result": "", + "id": 28 + }, + { + "firstLevel": "四、融资计划(10分)", + "secondLevel": "绿色金融工具应用", + "thirdLevel": "融资条款与ESG绩效挂钩", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.4 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.4, + "result": "", + "id": 29 + }, + { + "firstLevel": "四、融资计划(10分)", + "secondLevel": "绿色金融工具应用", + "thirdLevel": "国际合作资金申请与利用", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.2 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.2, + "result": "", + "id": 30 + }, + { + "firstLevel": "五、环境协同效益(7分)", + "secondLevel": "资源循环", + "thirdLevel": "工业固废/生物质资源利用率数据", + "scoringCriteria": [ + { + "选项": "有", + "得分": 2.45 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 2.45, + "result": "", + "id": 31 + }, + { + "firstLevel": "五、环境协同效益(7分)", + "secondLevel": "污染物减排", + "thirdLevel": "硫化物减排措施", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.84 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.84, + "result": "", + "id": 32 + }, + { + "firstLevel": "五、环境协同效益(7分)", + "secondLevel": "污染物减排", + "thirdLevel": "氮氧化物减排措施", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.84 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.84, + "result": "", + "id": 33 + }, + { + "firstLevel": "五、环境协同效益(7分)", + "secondLevel": "污染物减排", + "thirdLevel": "其他污染物减排措施", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.77 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.77, + "result": "", + "id": 34 + }, + { + "firstLevel": "五、环境协同效益(7分)", + "secondLevel": "生态系统与生物多样性", + "thirdLevel": "项目选址生态避让与保护", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.28 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.28, + "result": "", + "id": 35 + }, + { + "firstLevel": "五、环境协同效益(7分)", + "secondLevel": "生态系统与生物多样性", + "thirdLevel": "矿山生态修复与复垦方案", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.28 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.28, + "result": "", + "id": 36 + }, + { + "firstLevel": "五、环境协同效益(7分)", + "secondLevel": "生态系统与生物多样性", + "thirdLevel": "厂区绿化与生态碳汇措施", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.14 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.14, + "result": "", + "id": 37 + }, + { + "firstLevel": "五、环境协同效益(7分)", + "secondLevel": "产品绿色属性", + "thirdLevel": "低碳产品认证与标识", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.35 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.35, + "result": "", + "id": 38 + }, + { + "firstLevel": "五、环境协同效益(7分)", + "secondLevel": "产品绿色属性", + "thirdLevel": "产品耐久性与回收性设计", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.35 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.35, + "result": "", + "id": 39 + }, + { + "firstLevel": "五、环境协同效益(7分)", + "secondLevel": "环境管理与合规", + "thirdLevel": "无环保处罚与信访记录", + "scoringCriteria": [ + { + "选项": "是", + "得分": 0.35 + }, + { + "选项": "否", + "得分": 0 + } + ], + "fullScore": 0.35, + "result": "", + "id": 40 + }, + { + "firstLevel": "五、环境协同效益(7分)", + "secondLevel": "环境管理与合规", + "thirdLevel": "环境应急管理体系", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.35 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.35, + "result": "", + "id": 41 + }, + { + "firstLevel": "六、社会与治理协同效益(10分)", + "secondLevel": "员工健康与安全", + "thirdLevel": "员工健康安全管理体系与制度", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 42 + }, + { + "firstLevel": "六、社会与治理协同效益(10分)", + "secondLevel": "员工健康与安全", + "thirdLevel": "符合标准的物理环境与防护措施", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.8 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.8, + "result": "", + "id": 43 + }, + { + "firstLevel": "六、社会与治理协同效益(10分)", + "secondLevel": "员工健康与安全", + "thirdLevel": "员工心理健康支持计划", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.6 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.6, + "result": "", + "id": 44 + }, + { + "firstLevel": "六、社会与治理协同效益(10分)", + "secondLevel": "员工健康与安全", + "thirdLevel": "应急响应与能力建设机制", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.6 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.6, + "result": "", + "id": 45 + }, + { + "firstLevel": "六、社会与治理协同效益(10分)", + "secondLevel": "社区参与与发展", + "thirdLevel": "社区沟通与透明度机制", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 46 + }, + { + "firstLevel": "六、社会与治理协同效益(10分)", + "secondLevel": "社区参与与发展", + "thirdLevel": "社区经济与发展贡献措施", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.8 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.8, + "result": "", + "id": 47 + }, + { + "firstLevel": "六、社会与治理协同效益(10分)", + "secondLevel": "社区参与与发展", + "thirdLevel": "社区负面影响缓解措施", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.7 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.7, + "result": "", + "id": 48 + }, + { + "firstLevel": "六、社会与治理协同效益(10分)", + "secondLevel": "供应链责任管理", + "thirdLevel": "供应商行为准则", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 49 + }, + { + "firstLevel": "六、社会与治理协同效益(10分)", + "secondLevel": "供应链责任管理", + "thirdLevel": "供应商筛查与评估机制", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.8 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.8, + "result": "", + "id": 50 + }, + { + "firstLevel": "六、社会与治理协同效益(10分)", + "secondLevel": "供应链责任管理", + "thirdLevel": "供应商审核与改进机制", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.7 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.7, + "result": "", + "id": 51 + }, + { + "firstLevel": "六、社会与治理协同效益(10分)", + "secondLevel": "公司治理与道德合规", + "thirdLevel": "完善的治理结构", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 52 + }, + { + "firstLevel": "六、社会与治理协同效益(10分)", + "secondLevel": "公司治理与道德合规", + "thirdLevel": "商业道德与反腐败制度", + "scoringCriteria": [ + { + "选项": "有", + "得分": 1 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 1, + "result": "", + "id": 53 + }, + { + "firstLevel": "七、数字化与智能化水平(8分)", + "secondLevel": "数据基础与采集能力", + "thirdLevel": "碳排放实时监测覆盖率达标", + "scoringCriteria": [ + { + "选项": "是", + "得分": 0.64 + }, + { + "选项": "否", + "得分": 0 + } + ], + "fullScore": 0.64, + "result": "", + "id": 54 + }, + { + "firstLevel": "七、数字化与智能化水平(8分)", + "secondLevel": "数据基础与采集能力", + "thirdLevel": "数据自动化采集比例达标", + "scoringCriteria": [ + { + "选项": "是", + "得分": 0.64 + }, + { + "选项": "否", + "得分": 0 + } + ], + "fullScore": 0.64, + "result": "", + "id": 55 + }, + { + "firstLevel": "七、数字化与智能化水平(8分)", + "secondLevel": "数据基础与采集能力", + "thirdLevel": "数据质量与校验机制", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.72 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.72, + "result": "", + "id": 56 + }, + { + "firstLevel": "七、数字化与智能化水平(8分)", + "secondLevel": "智能分析与决策支持", + "thirdLevel": "AI预测减碳潜力应用", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.64 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.64, + "result": "", + "id": 57 + }, + { + "firstLevel": "七、数字化与智能化水平(8分)", + "secondLevel": "智能分析与决策支持", + "thirdLevel": "数字化碳管理平台", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.72 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.72, + "result": "", + "id": 58 + }, + { + "firstLevel": "七、数字化与智能化水平(8分)", + "secondLevel": "智能分析与决策支持", + "thirdLevel": "智能优化控制算法应用", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.64 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.64, + "result": "", + "id": 59 + }, + { + "firstLevel": "七、数字化与智能化水平(8分)", + "secondLevel": "系统集成与互联互通", + "thirdLevel": "ERP/EMS/MES系统集成度达标", + "scoringCriteria": [ + { + "选项": "是", + "得分": 0.64 + }, + { + "选项": "否", + "得分": 0 + } + ], + "fullScore": 0.64, + "result": "", + "id": 60 + }, + { + "firstLevel": "七、数字化与智能化水平(8分)", + "secondLevel": "系统集成与互联互通", + "thirdLevel": "IoT设备覆盖率达标", + "scoringCriteria": [ + { + "选项": "是", + "得分": 0.64 + }, + { + "选项": "否", + "得分": 0 + } + ], + "fullScore": 0.64, + "result": "", + "id": 61 + }, + { + "firstLevel": "七、数字化与智能化水平(8分)", + "secondLevel": "系统集成与互联互通", + "thirdLevel": "跨系统数据协同能力", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.72 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.72, + "result": "", + "id": 62 + }, + { + "firstLevel": "七、数字化与智能化水平(8分)", + "secondLevel": "网络安全与数据治理", + "thirdLevel": "碳数据安全管理措施", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.64 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.64, + "result": "", + "id": 63 + }, + { + "firstLevel": "七、数字化与智能化水平(8分)", + "secondLevel": "网络安全与数据治理", + "thirdLevel": "系统抗攻击能力达标", + "scoringCriteria": [ + { + "选项": "是", + "得分": 0.64 + }, + { + "选项": "否", + "得分": 0 + } + ], + "fullScore": 0.64, + "result": "", + "id": 64 + }, + { + "firstLevel": "七、数字化与智能化水平(8分)", + "secondLevel": "网络安全与数据治理", + "thirdLevel": "数据合规性与审计追踪机制", + "scoringCriteria": [ + { + "选项": "有", + "得分": 0.72 + }, + { + "选项": "无", + "得分": 0 + } + ], + "fullScore": 0.72, + "result": "", + "id": 65 + } +] \ No newline at end of file diff --git a/apps/carbon/tests.py b/apps/carbon/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/apps/carbon/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/carbon/urls.py b/apps/carbon/urls.py new file mode 100644 index 0000000..42007c5 --- /dev/null +++ b/apps/carbon/urls.py @@ -0,0 +1,12 @@ +from .views import WorkViewSet +from django.urls import path, include +from rest_framework.routers import DefaultRouter + +API_BASE_URL = 'api/carbon/' +HTML_BASE_URL = 'carbon/' + +router = DefaultRouter() +router.register('work', WorkViewSet, basename='carbon_work') +urlpatterns = [ + path(API_BASE_URL, include(router.urls)), +] diff --git a/apps/carbon/views.py b/apps/carbon/views.py new file mode 100644 index 0000000..8884032 --- /dev/null +++ b/apps/carbon/views.py @@ -0,0 +1,259 @@ +from django.shortcuts import render +from .models import Work +from .serializers import WorkSerializer, WorkCreateSerializer, WorkDqCalSerializer, WorkDhCalSerializer +from apps.utils.viewsets import CustomModelViewSet +from rest_framework.decorators import action +import os +from django.conf import settings +import json +from apps.carbon.service import parse_file +import requests +from rest_framework.exceptions import ParseError +import re +from rest_framework.response import Response +from django.db import transaction +# Create your views here. + +LLM_URL = "http://106.0.4.200:9000/v1/chat/completions" +API_KEY = "JJVAide0hw3eaugGmxecyYYFw45FX2LfhnYJtC+W2rw" +MODEL = "Qwen/QwQ-32B" +HEADERS = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json" +} +HAMMING_THRESHOLD = 5 # 指纹相似阈值,可调 + +def get_standard(): + standard_path = os.path.join(settings.BASE_DIR, 'apps', 'carbon', 'standard.json') + with open(standard_path, 'r', encoding='utf-8') as f: + standard_content = json.load(f) + return standard_content + +def ask(input:str, p_name:str, stream=False): + promot_path = os.path.join(settings.BASE_DIR, 'apps', 'carbon', 'promot', f"{p_name}.md") + with open(promot_path, "r", encoding="utf-8") as f: + promot_str = f.read() + his = [{"role":"system", "content": promot_str}] + his.append({"role":"user", "content": input}) + payload = { + "model": MODEL, + "messages": his, + "temperature": 0, + "stream": stream, + "chat_template_kwargs": {"enable_thinking": False} + } + response = requests.post(LLM_URL, headers=HEADERS, json=payload, stream=stream, timeout=(60, 240)) + if not stream: + if response.json().get("detail") == "Internal server error": + raise ParseError("模型处理错误超过最大token限制") + return response.json()["choices"][0]["message"]["content"] + + +class WorkViewSet(CustomModelViewSet): + queryset = Work.objects.all() + serializer_class = WorkSerializer + create_serializer_class = WorkCreateSerializer + search_fields = ['name', "description"] + + @action(methods=['get'], detail=False, perms_map={'get': '*'}) + def my(self, request, *args, **kwargs): + user = self.request.user + queryset = self.filter_queryset(self.get_queryset().filter(create_by=user)) + + page = self.paginate_queryset(queryset) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) + + @action(detail=True, methods=['post'], serializer_class=WorkDqCalSerializer) + @transaction.atomic + def cal_dq(self, request, pk): + work = self.get_object() + sr = WorkDqCalSerializer(work, data=request.data) + sr.is_valid(raise_exception=True) + sr.save() + total_score = 0 + work = Work.objects.get(pk=pk) + # 开始计算贷前评分和指纹 + data = get_standard() + if work.dq_file1: + for item in data: + if item["thirdLevel"] in [ + "碳中和路线图", + "短期/中期/长期减碳目标", + "设立碳管理相关部门", + "气候相关风险评估机制", + "内部碳定价机制", + "碳管理数字化平台建设", + "碳交易与履约能力", + "CCER等减排项目开发管理", + "数字化碳管理平台", + ]: + item["result"] = item["scoringCriteria"][0]["选项"] + item["score"] = item["fullScore"] + total_score += item["score"] + if work.dq_file2: + for item in data: + if item["thirdLevel"] in [ + "能源与碳排放管理体系", + "碳排放数据监测、报告与核查", + "参与权威信息平台披露", + "碳中和目标与进展经第三方认证", + "碳排放实时监测覆盖率达标", + "数据自动化采集比例达标", + "数据质量与校验机制", + ]: + item["result"] = item["scoringCriteria"][0]["选项"] + item["score"] = item["fullScore"] + total_score += item["score"] + if work.dq_file3: + for item in data: + if item["thirdLevel"] in [ + "ESG报告", + "工业固废/生物质资源利用率数据", + "硫化物减排措施", + "氮氧化物减排措施", + "其他污染物减排措施", + "项目选址生态避让与保护", + "矿山生态修复与复垦方案", + "厂区绿化与生态碳汇措施", + "低碳产品认证与标识", + "产品耐久性与回收性设计", + "无环保处罚与信访记录", + "环境应急管理体系", + "员工健康安全管理体系与制度", + "符合标准的物理环境与防护措施", + "员工心理健康支持计划", + "社区沟通与透明度机制", + "社区经济与发展贡献措施", + "社区负面影响缓解措施", + "供应商行为准则", + "供应商筛查与评估机制", + "供应商审核与改进机制", + "完善的治理结构", + "商业道德与反腐败制度", + ]: + item["result"] = item["scoringCriteria"][0]["选项"] + item["score"] = item["fullScore"] + total_score += item["score"] + if work.dq_file4: + for item in data: + if item["thirdLevel"] in [ + "资金分配明细", + "资本金比例与到位证明", + "融资渠道多样性", + "成本效益分析", + "碳减排收益量化", + "社会效益评估", + "风险管控方案", + "关键风险应对策略与预案", + "金融机构或第三方风险分担机制", + "绿色金融资质认证与资金用途", + "融资条款与ESG绩效挂钩", + "国际合作资金申请与利用", + "应急响应与能力建设机制", + ]: + item["result"] = item["scoringCriteria"][0]["选项"] + item["score"] = item["fullScore"] + total_score += item["score"] + if work.dq_file5: + for item in data: + if item["thirdLevel"] in [ + "AI预测减碳潜力应用", + "智能优化控制算法应用", + "ERP/EMS/MES系统集成度达标", + "IoT设备覆盖率达标", + "跨系统数据协同能力", + "碳数据安全管理措施", + "系统抗攻击能力达标", + "数据合规性与审计追踪机制", + ]: + item["result"] = item["scoringCriteria"][0]["选项"] + item["score"] = item["fullScore"] + total_score += item["score"] + if work.dq_file6: + path = (settings.BASE_DIR + work.dq_file6.path).replace('\\', '/') + file_content = parse_file(path) + if file_content: + res = ask(f'以下内容为用户报告: {file_content}', "tec") + if res == "是": + for item in data: + if item["firstLevel"] == "二、技术路径(35 分)": + item["result"] = item["scoringCriteria"][0]["选项"] + item["score"] = item["fullScore"] + total_score += item["score"] + if work.dq_file1: + path = (settings.BASE_DIR + work.dq_file1.path).replace('\\', '/') + content = parse_file(path) + if content: + if bool(re.search(r'碳?减排目标', content)): + data[3]["result"] = "有" + data[3]["score"] = data[3]["fullScore"] + total_score += data[3]["score"] + + + def cal_percent(decline_patterns, content, data, index, total_score): + decline_percent = None + for pattern in decline_patterns: + match = re.search(pattern, content, re.DOTALL) + if match: + decline_percent = float(match.group(1)) + break + if decline_percent: + if decline_percent >= 10: + data[index]["result"] = 3 + data[index]["score"] = 5 + elif decline_percent >= 5: + data[index]["result"] = 2 + data[index]["score"] = 2.5 + elif decline_percent > 0: + data[index]["result"] = 1 + data[index]["score"] = 1.5 + total_score += data[index].get("score", 0) + return total_score + + # 碳排放总量 + decline_patterns1 = [ + r'碳排放总量[^,。]*?下降\s*([\d.]+)%', + r'碳排放[^,。]*?总量[^,。]*?下降\s*([\d.]+)%', + r'碳总量[^,。]*?下降\s*([\d.]+)%', + r'排放总量[^,。]*?下降\s*([\d.]+)%', + r'排放[^,。]*?下降\s*([\d.]+)%' + ] + total_score = cal_percent(decline_patterns1, content, data, 0, total_score) + + # 碳排放强度 + decline_patterns2 = [ + r'碳排放强度[^,。]*?下降\s*([\d.]+)%', + r'碳强度[^,。]*?总量[^,。]*?下降\s*([\d.]+)%', + r'排放强度[^,。]*?下降\s*([\d.]+)%' + ] + total_score = cal_percent(decline_patterns2, content, data, 1, total_score) + + # 产品碳足迹 + decline_patterns3 = [ + r'产品碳足迹[^,。]*?下降\s*([\d.]+)%', + r'碳足迹[^,。]*?下降\s*([\d.]+)%', + r'产品足迹[^,。]*?下降\s*([\d.]+)%' + ] + total_score = cal_percent(decline_patterns3, content, data, 2, total_score) + total_score = round(total_score, 2) + work.score_dq = total_score + work.save(update_fields=["score_dq"]) + return Response({"total_score": total_score, "data": data}) + + @staticmethod + def parse_files(): + pass + + @action(detail=True, methods=['post'], serializer_class=WorkDhCalSerializer) + @transaction.atomic + def cal_dh(self, request, pk): + work = self.get_object() + + + + diff --git a/db.json b/db.json deleted file mode 100644 index c930b1b04577cdcc97676c624f1dc06b462bdb4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 747338 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 Os3wKYTm0_b+5ZE6ho=4j diff --git a/server/settings.py b/server/settings.py index d65a116..dc54d5c 100755 --- a/server/settings.py +++ b/server/settings.py @@ -58,7 +58,8 @@ INSTALLED_APPS = [ 'apps.system', 'apps.auth1', 'apps.wf', - 'apps.ops' + 'apps.ops', + 'apps.carbon', ] MIDDLEWARE = [ diff --git a/server/urls.py b/server/urls.py index 8b32cc7..38d4486 100755 --- a/server/urls.py +++ b/server/urls.py @@ -48,6 +48,7 @@ urlpatterns = [ path('', include('apps.wf.urls')), path('', include('apps.utils.urls')), path('', include('apps.ops.urls')), + path('', include('apps.carbon.urls')), # 前端页面入口 path('', TemplateView.as_view(template_name="index.html")),