Browse Source

修改测试问题及优化项

temp
fks-xuxinyue 3 months ago
parent
commit
06e0ec7425
  1. 30
      hx-ai-intelligent/src/view/carbonEmissionManage/carbonAssets/carbonAssetsDetail/index.vue
  2. 5
      hx-ai-intelligent/src/view/carbonEmissionManage/carbonAssets/index.vue
  3. 45
      hx-ai-intelligent/src/view/carbonEmissionManage/carbonEmissionStatistics/energyConsumption/index.vue
  4. 26
      hx-ai-intelligent/src/view/carbonEmissionManage/carbonEmissionStatistics/quickCalculation/index.vue
  5. 110
      hx-ai-intelligent/src/view/carbonEmissionManage/carbonInventoryCheck/config.ts
  6. 104
      hx-ai-intelligent/src/view/carbonEmissionManage/carbonInventoryCheck/fillInPage/index.vue
  7. 7
      hx-ai-intelligent/src/view/carbonEmissionManage/carbonInventoryCheck/index.vue
  8. 231
      hx-ai-intelligent/src/view/carbonEmissionManage/carbonPlanning/category/categoryDeatil.vue
  9. 7
      hx-ai-intelligent/src/view/carbonEmissionManage/carbonPlanning/category/index.vue
  10. 36
      hx-ai-intelligent/src/view/carbonEmissionManage/carbonPlanning/index.vue

30
hx-ai-intelligent/src/view/carbonEmissionManage/carbonAssets/carbonAssetsDetail/index.vue

@ -20,10 +20,11 @@
</a-form-item> </a-form-item>
<a-form-item> <a-form-item>
<a-cascader <a-cascader
v-model:value="queryParams.transactionType" v-model:value="transactionType"
multiple multiple
style="width: 200px" style="width: 200px"
:options="options" :options="options"
@change="changeSelect"
placeholder="请选择交易类型" placeholder="请选择交易类型"
suffix-icon="Shopping Around"> suffix-icon="Shopping Around">
<template #tagRender="data"> <template #tagRender="data">
@ -49,7 +50,7 @@
</div> </div>
<div style="display: flex; margin-top: 20px; height: calc(84% - 20px)"> <div style="display: flex; margin-top: 20px; height: calc(84% - 20px)">
<div class="detailTable"> <div class="detailTable">
<ns-view-list-table v-bind="tableConfig" :model="data" ref="mainRef" :scroll="{ x: 2000 }"> <ns-view-list-table v-bind="tableConfig" :model="data" ref="mainRef" :scroll="{ x: 1280 }">
<template #bodyCell="{ column, text, record }"> <template #bodyCell="{ column, text, record }">
<template v-if="column.dataIndex === 'accountType'"> <template v-if="column.dataIndex === 'accountType'">
<span v-if="record.accountType">{{ record.accountType.label }}</span> <span v-if="record.accountType">{{ record.accountType.label }}</span>
@ -195,6 +196,7 @@
}; };
const total = ref<number>(); const total = ref<number>();
const year = ref(new Date().getFullYear().toString()); const year = ref(new Date().getFullYear().toString());
const transactionType = ref();
const queryParams = ref({ const queryParams = ref({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
@ -202,9 +204,16 @@
accountType: props.parentId, accountType: props.parentId,
year: year.value, year: year.value,
}); });
const transactionTypeValue = ref();
const changeSelect = (value, selectedOptions) => {
transactionTypeValue.value = selectedOptions.flatMap((group) =>
group.flatMap((node) => [node.value, ...(node.children?.map((child) => child.value) || [])]),
);
};
const searchTableList = () => { const searchTableList = () => {
year.value = queryParams.value.year; year.value = queryParams.value.year;
transactionType.value = queryParams.value.transactionType; transactionTypeList.value = transactionTypeValue.value;
queryParams.value.transactionTypeList = transactionTypeValue.value;
accountType.value = queryParams.value.accountType; accountType.value = queryParams.value.accountType;
getTotalTable(queryParams.value.accountType); getTotalTable(queryParams.value.accountType);
mainRef.value?.nsTableRef.reload(); mainRef.value?.nsTableRef.reload();
@ -283,6 +292,9 @@
accountType.value = props.parentId; accountType.value = props.parentId;
year.value = new Date().getFullYear(); year.value = new Date().getFullYear();
transactionType.value = ''; transactionType.value = '';
transactionTypeList.value = [];
queryParams.value.transactionTypeList = transactionTypeList.value;
getTotalTable();
mainRef.value?.nsTableRef.reload(); mainRef.value?.nsTableRef.reload();
// getDetailList(); // getDetailList();
}; };
@ -364,7 +376,7 @@
}; };
const mainRef = ref(); const mainRef = ref();
const transactionType = ref(); const transactionTypeList = ref([]);
const accountType = ref(); const accountType = ref();
accountType.value = props.parentId; accountType.value = props.parentId;
const tableConfig = ref({ const tableConfig = ref({
@ -373,6 +385,7 @@
params: { params: {
orgId, orgId,
accountType, accountType,
transactionTypeList,
year, year,
}, },
headerActions: [ headerActions: [
@ -467,40 +480,49 @@
{ {
title: '资产类别', title: '资产类别',
dataIndex: 'accountType', dataIndex: 'accountType',
width: 100,
}, },
{ {
title: '交易方式', title: '交易方式',
dataIndex: 'transactionTypeName', dataIndex: 'transactionTypeName',
width: 100,
}, },
{ {
title: '交易日期', title: '交易日期',
dataIndex: 'transactionDate', dataIndex: 'transactionDate',
width: 100,
sorter: (a, b) => a.transactionDate - b.transactionDate, sorter: (a, b) => a.transactionDate - b.transactionDate,
}, },
{ {
title: '本期收入(tCO2)', title: '本期收入(tCO2)',
dataIndex: 'income', dataIndex: 'income',
width: 150,
sorter: (a, b) => a.income - b.income, sorter: (a, b) => a.income - b.income,
}, },
{ {
title: '本期支出(tCO2)', title: '本期支出(tCO2)',
dataIndex: 'expenditure', dataIndex: 'expenditure',
width: 150,
sorter: (a, b) => a.expenditure - b.expenditure, sorter: (a, b) => a.expenditure - b.expenditure,
}, },
{ {
title: '发生金额(¥)', title: '发生金额(¥)',
width: 150,
dataIndex: 'amountIncurredValue', dataIndex: 'amountIncurredValue',
}, },
{ {
title: '交易对象', title: '交易对象',
width: 100,
dataIndex: 'tradingPartner', dataIndex: 'tradingPartner',
}, },
{ {
title: '更新人', title: '更新人',
width: 100,
dataIndex: 'updateUser', dataIndex: 'updateUser',
}, },
{ {
title: '更新时间', title: '更新时间',
width: 150,
dataIndex: 'updateTime', dataIndex: 'updateTime',
}, },
], ],

5
hx-ai-intelligent/src/view/carbonEmissionManage/carbonAssets/index.vue

@ -2,7 +2,9 @@
<div class="mainContant" v-if="homePage"> <div class="mainContant" v-if="homePage">
<a-card class="card" v-if="nationwide" style="margin-right: 1%; margin-bottom: 1%"> <a-card class="card" v-if="nationwide" style="margin-right: 1%; margin-bottom: 1%">
<div class="top" style="background: rgba(252, 139, 78, 0.05)"> <div class="top" style="background: rgba(252, 139, 78, 0.05)">
<div class="moneyImg"><img width="68" height="68" src="../../../../src/icon/carbonAssetsMoney-1.svg" /></div> <div class="moneyImg"
><img width="68" height="68" src="../../../../src/icon/carbonAssetsMoney-1.svg"
/></div>
<div class="moneyTitle">全国碳账户估值CNY</div> <div class="moneyTitle">全国碳账户估值CNY</div>
<div class="moneyTotal" style="color: rgba(229, 102, 22, 1)">{{ <div class="moneyTotal" style="color: rgba(229, 102, 22, 1)">{{
nationwide.valuation nationwide.valuation
@ -369,6 +371,7 @@
background: linear-gradient(180deg, rgba(244, 252, 250, 1) 0%, rgba(255, 255, 255, 1) 100%); background: linear-gradient(180deg, rgba(244, 252, 250, 1) 0%, rgba(255, 255, 255, 1) 100%);
border: 1px solid rgba(42, 197, 155, 0.3); border: 1px solid rgba(42, 197, 155, 0.3);
padding: 10px; padding: 10px;
border-radius: 8px;
.money { .money {
opacity: 1; opacity: 1;
font-size: 28px; font-size: 28px;

45
hx-ai-intelligent/src/view/carbonEmissionManage/carbonEmissionStatistics/energyConsumption/index.vue

@ -85,7 +85,7 @@
<div class="ns-form-title" style="display: flex"> <div class="ns-form-title" style="display: flex">
<div class="title">凭证上传</div> <div class="title">凭证上传</div>
</div> </div>
<a-upload <!-- <a-upload
:file-list="fileList" :file-list="fileList"
name="file" name="file"
accept=".pdf" accept=".pdf"
@ -109,33 +109,26 @@
<span>1.仅支持pdf格式文件或文件夹</span> <span>1.仅支持pdf格式文件或文件夹</span>
<span>2.文件名命名规则为能源种类_年份</span> <span>2.文件名命名规则为能源种类_年份</span>
<span>3.每次上传自动覆盖</span> <span>3.每次上传自动覆盖</span>
</div> </div> -->
<template #footer>
<a-button style="margin-right: 8px" @click="onClose">取消</a-button>
<a-button type="primary" @click="onSubmit">确定</a-button>
</template>
</a-drawer>
<!-- 上传凭证弹窗 -->
<!-- <a-modal :visible="openUpload" title="凭证上传" @ok="handleOk" @cancel="closeOpenUpload">
<a-upload-dragger <a-upload-dragger
v-model:fileList="fileList" v-model:fileList="fileList"
accept=".pdf"
name="file" name="file"
:multiple="true" @remove="handleFileRemove"
action="https://www.mocky.io/v2/5cc8019d300000980a055e76" :before-upload="beforeUpload"
@change="handleChange" @change="handleChange">
@drop="handleDrop"
>
<p class="ant-upload-drag-icon"> <p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined> <inbox-outlined></inbox-outlined>
</p> </p>
<p class="ant-upload-hint" style="display: flex;flex-direction: column;"> <p class="ant-upload-hint">1.仅支持pdf格式文件或文件夹</p>
<p>1.仅支持pdf格式文件或文件夹</p> <p class="ant-upload-hint">2.文件名命名规则为能源种类_年份</p>
<p>2.文件命名规则为能源种类_年份</p> <p class="ant-upload-hint">3.每次上传自动覆盖</p>
<p>3.每次上传自动覆盖</p>
</p>
</a-upload-dragger> </a-upload-dragger>
</a-modal> --> <template #footer>
<a-button style="margin-right: 8px" @click="onClose">取消</a-button>
<a-button type="primary" @click="onSubmit">确定</a-button>
</template>
</a-drawer>
<!-- 凭证下载 --> <!-- 凭证下载 -->
<a-drawer <a-drawer
:visible="downLoadVisible" :visible="downLoadVisible"
@ -172,10 +165,10 @@
</template> </template>
</template> </template>
</a-table> </a-table>
<template #footer> <!-- <template #footer>
<a-button style="margin-right: 8px" @click="onCloseDownLoad">取消</a-button> <a-button style="margin-right: 8px" @click="onCloseDownLoad">取消</a-button>
<a-button type="primary" @click="onSubmitDownLoad">确定</a-button> <a-button type="primary" @click="onSubmitDownLoad">确定</a-button>
</template> </template> -->
</a-drawer> </a-drawer>
</div> </div>
</template> </template>
@ -183,7 +176,7 @@
import { ref, toRaw, defineExpose, createVNode } from 'vue'; import { ref, toRaw, defineExpose, createVNode } from 'vue';
import type { Rule } from 'ant-design-vue/es/form'; import type { Rule } from 'ant-design-vue/es/form';
import { Pagination, message, Modal, Upload } from 'ant-design-vue'; import { Pagination, message, Modal, Upload } from 'ant-design-vue';
import { UploadOutlined } from '@ant-design/icons-vue'; import { UploadOutlined, InboxOutlined } from '@ant-design/icons-vue';
import type { TreeSelectProps, UploadChangeParam, UploadProps } from 'ant-design-vue'; import type { TreeSelectProps, UploadChangeParam, UploadProps } from 'ant-design-vue';
import { NsMessage } from '/nerv-lib/component'; import { NsMessage } from '/nerv-lib/component';
import dayjs, { Dayjs } from 'dayjs'; import dayjs, { Dayjs } from 'dayjs';
@ -1174,6 +1167,10 @@
:deep(.ant-table-container) { :deep(.ant-table-container) {
padding: unset; padding: unset;
} }
:deep(.ant-upload.ant-upload-drag) {
height: 18vh;
margin-top: 10px;
}
</style> </style>
<style scoped> <style scoped>
th.column-money, th.column-money,

26
hx-ai-intelligent/src/view/carbonEmissionManage/carbonEmissionStatistics/quickCalculation/index.vue

@ -119,10 +119,11 @@
<!-- 选择因子 --> <!-- 选择因子 -->
<a-modal <a-modal
v-model:visible="openVisible" v-model:visible="openVisible"
v-if="openVisible"
width="60%" width="60%"
title="选择因子" title="选择因子"
@ok="onSubmit" @ok="btnClick"
@cancel="onClose"> @cancel="onCloseClick">
<ns-view-list-table v-bind="config" ref="setFactorRef" style="height: 500px" /> <ns-view-list-table v-bind="config" ref="setFactorRef" style="height: 500px" />
</a-modal> </a-modal>
</div> </div>
@ -140,6 +141,7 @@
} from '/@/api/carbonEmissionFactorLibrary'; } from '/@/api/carbonEmissionFactorLibrary';
import { or } from '@vueuse/core'; import { or } from '@vueuse/core';
import { setFactorConfig } from '../config'; import { setFactorConfig } from '../config';
import { NsMessage } from '/nerv-lib/saas';
defineOptions({ defineOptions({
energyType: 'quickCalculation', // name energyType: 'quickCalculation', // name
components: { components: {
@ -340,8 +342,8 @@
formState.value.factorId = record.factorId; formState.value.factorId = record.factorId;
text.value = '编辑'; text.value = '编辑';
visible.value = true; visible.value = true;
emissionSources.value = record.emissionSources; emissionSources.value = record.factorId; //todo
queryData.value.emissionSources = emissionSources.value; queryData.value.factorId = emissionSources.value; //todo
getNewTable(); getNewTable();
}, },
}, },
@ -484,10 +486,26 @@
}); });
}; };
const openVisible = ref(false); const openVisible = ref(false);
const setFactorRef = ref();
const config = setFactorConfig(orgId.value); const config = setFactorConfig(orgId.value);
const selectFactor = () => { const selectFactor = () => {
openVisible.value = true; openVisible.value = true;
}; };
const btnClick = () => {
let selectRowKeys = setFactorRef.value?.nsTableRef.tableState.selectedRowKeys;
if (selectRowKeys.length === 0) {
NsMessage.warn('请选择因子');
return;
} else {
newTableData.value = setFactorRef.value?.nsTableRef.tableState.selectedRows;
selectedRowKeys.value = setFactorRef.value?.nsTableRef.tableState.selectedRowKeys;
formState.value.factorId = selectedRowKeys.value[0];
openVisible.value = false;
}
};
const onCloseClick = () => {
openVisible.value = false;
};
// //
const onClose = () => { const onClose = () => {
visible.value = false; visible.value = false;

110
hx-ai-intelligent/src/view/carbonEmissionManage/carbonInventoryCheck/config.ts

@ -1,3 +1,5 @@
import { quickCalculation, carbonEmissionFactorLibrary } from '/@/api/carbonEmissionFactorLibrary';
import { ref } from 'vue';
// 凭证弹窗表头 // 凭证弹窗表头
export const voucherColumns = [ export const voucherColumns = [
{ {
@ -9,8 +11,8 @@ export const voucherColumns = [
}, },
{ {
title: '日期', title: '日期',
dataIndex: 'updateTime', dataIndex: 'bizName',
key: 'updateTime', key: 'bizName',
ellipsis: true, ellipsis: true,
}, },
{ {
@ -42,3 +44,107 @@ export const drawerColumns = [
dataIndex: 'dataSources', dataIndex: 'dataSources',
}, },
]; ];
export const setFactorConfig = (orgId) => {
return ref({
api: carbonEmissionFactorLibrary.getTableList,
params: { orgId, pageNum: 1, pageSize: 9999, emissionList: [0] },
treeConfig: {
header: {
icon: 'deviceType',
title: '排放分类',
},
params: { orgId},
dynamicParams: { emissionList: 'id[]' },
defaultExpandAll: true,
// checkable:true,
api: carbonEmissionFactorLibrary.getCarbonFactorTree,
fieldNames: { title: 'emissionName', key: 'id' },
formConfig: {
schemas: [
{
field: 'deviceType',
label: '设备名称',
component: 'NsInput',
autoSubmit: true,
componentProps: {
placeholder: '请输入关键字',
},
},
],
},
},
rowSelection: { type: 'radio' },
columns: [
{
title: '序号',
textNumber: 2,
dataIndex: 'address',
customRender: (text: any) => {
return text.index + 1;
},
},
{
title: '名称',
dataIndex: 'emissionSources',
textNumber: 3,
},
{
title: '排放因子',
dataIndex: 'emissionFactors',
textNumber: 4,
textEllipsis: true,
},
{
title: '排放因子单位',
dataIndex: 'emissionFactorUnits',
width: 100,
textEllipsis: true,
},
{
title: '排放环节',
dataIndex: 'emissionProcess',
textWidth: 88,
textEllipsis: true,
},
{
title: '数据来源',
dataIndex: 'dataSources',
textNumber: 5,
textEllipsis: true,
},
],
formConfig: {
schemas: [
{
field: 'emissionSources',
label: '排放源',
component: 'NsInput',
componentProps: {
placeholder: '请输入排放源',
maxLength: 20,
},
},
{
field: 'emissionProcess',
label: '排放环节',
component: 'NsSelectApi',
componentProps: {
placeholder: '请选择排放环节',
api: carbonEmissionFactorLibrary.gasAndDatabase,
resultField: 'data',
params: {
orgId: orgId.value,
type: 'emissionProcess',
},
immediate: true,
labelField: 'label',
valueField: 'value',
},
},
],
params: {},
},
// pagination: { pageSizeOptions: false },
rowKey: 'id',
});
};

104
hx-ai-intelligent/src/view/carbonEmissionManage/carbonInventoryCheck/fillInPage/index.vue

@ -106,8 +106,13 @@
<span>{{ data.emissionSource }}</span> <span>{{ data.emissionSource }}</span>
</div> </div>
<div class="actionMore"> <div class="actionMore">
<EditOutlined @click="editUnit(data)" /> <EditOutlined
<MinusCircleOutlined style="margin-left: 6px" @click="delUnit(data)" /> @click="editUnit(data)"
v-if="data.emissionSource !== '全部'" />
<MinusCircleOutlined
v-if="data.emissionSource !== '全部'"
style="margin-left: 6px"
@click="delUnit(data)" />
<PlusCircleOutlined <PlusCircleOutlined
v-if="data.emissionSource === '全部'" v-if="data.emissionSource === '全部'"
style="margin-left: 6px" style="margin-left: 6px"
@ -131,7 +136,7 @@
:pagination="false" :pagination="false"
bordered bordered
size="middle" size="middle"
:scroll="{ y: 380 }"> :scroll="{ x: 660, y: 380 }">
<template #title> <template #title>
<a-button type="primary" @click="downLoadVoucher">凭证</a-button> <a-button type="primary" @click="downLoadVoucher">凭证</a-button>
</template> </template>
@ -373,20 +378,21 @@
@keydown="handleKeyDown" /> @keydown="handleKeyDown" />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="24"> <!-- <a-col :span="24">
<a-form-item ref="name" label="关键字" name="key"> <a-form-item ref="name" label="关键字" name="key">
<a-input-search <a-input-search
v-model:value="editFormState.key" v-model:value="editFormState.key"
@search="searchKey" @search="searchKey"
placeholder="请输入关键字" /> placeholder="请输入关键字" />
</a-form-item> </a-form-item>
</a-col> </a-col> -->
</a-row> </a-row>
</a-form> </a-form>
</a-spin> </a-spin>
<div class="ns-form-title-edit" style="display: flex"> <!-- <div class="ns-form-title-edit" style="display: flex">
<div class="titleEdit">因子列表</div> <div class="titleEdit">因子列表</div>
</div> </div> -->
<a-button type="primary" style="margin-bottom: 10px" @click="selectFactor">选择因子</a-button>
<a-table <a-table
:columns="drawerColumns" :columns="drawerColumns"
:data-source="newTableData" :data-source="newTableData"
@ -430,14 +436,23 @@
<inbox-outlined></inbox-outlined> <inbox-outlined></inbox-outlined>
</p> </p>
<p class="ant-upload-hint">1.仅支持pdf格式文件或文件夹</p> <p class="ant-upload-hint">1.仅支持pdf格式文件或文件夹</p>
<p class="ant-upload-hint">2.文件名命名规则为能源种类_年份</p> <p class="ant-upload-hint">2.每次上传自动覆盖</p>
<p class="ant-upload-hint">3.每次上传自动覆盖</p>
</a-upload-dragger> </a-upload-dragger>
<template #footer> <template #footer>
<a-button style="margin-right: 8px" @click="onCloseEditData">取消</a-button> <a-button style="margin-right: 8px" @click="onCloseEditData">取消</a-button>
<a-button type="primary" @click="submitEditData">确定</a-button> <a-button type="primary" @click="submitEditData">确定</a-button>
</template> </template>
</a-drawer> </a-drawer>
<!-- 选择因子 -->
<a-modal
v-model:visible="openVisible"
v-if="openVisible"
width="60%"
title="选择因子"
@ok="btnClick"
@cancel="onCloseClick">
<ns-view-list-table v-bind="config" ref="setFactorRef" style="height: 500px" />
</a-modal>
</div> </div>
</template> </template>
@ -464,6 +479,8 @@
import { group } from '/@/api/deviceManage'; import { group } from '/@/api/deviceManage';
import { debug, log } from 'node:console'; import { debug, log } from 'node:console';
import { dict } from '/@/api'; import { dict } from '/@/api';
import { NsMessage } from '/nerv-lib/saas';
import { setFactorConfig } from '../config';
defineOptions({ defineOptions({
energyType: 'fillInPage', // name energyType: 'fillInPage', // name
components: { components: {
@ -673,12 +690,14 @@
} }
}; };
// //
const carbonEmission = ref();
const getTableHeardUnit = (id) => { const getTableHeardUnit = (id) => {
fetch(carbonInventoryCheck.findUnitById, { id: id }).then((res) => { fetch(carbonInventoryCheck.findUnitById, { id: id }).then((res) => {
if (res.data) { if (res.data) {
columns.value[1].title = '消耗量【' + res.data.unit + '】'; columns.value[1].title = '消耗量【' + res.data.unit + '】';
columns.value[2].title = '碳排因子【' + res.data.carbonEmission + '】'; columns.value[2].title = '碳排因子【' + res.data.carbonEmission + '】';
columns.value[3].title = '排放量【' + res.data.carbonUnits + '】'; columns.value[3].title = '排放量【' + res.data.carbonUnits + '】';
carbonEmission.value = res.data.carbonEmission;
} }
}); });
}; };
@ -879,6 +898,7 @@
{ {
title: '日期', title: '日期',
dataIndex: 'acquisitionDate', dataIndex: 'acquisitionDate',
width: 80,
key: 'acquisitionDate', key: 'acquisitionDate',
}, },
{ {
@ -887,11 +907,13 @@
{ {
title: '数据来源', title: '数据来源',
dataIndex: 'dataSources', dataIndex: 'dataSources',
width: 100,
key: 'dataSources', key: 'dataSources',
}, },
{ {
title: '数值', title: '数值',
dataIndex: 'consumption', dataIndex: 'consumption',
width: 100,
key: 'consumption', key: 'consumption',
}, },
], ],
@ -902,11 +924,13 @@
{ {
title: '数据来源', title: '数据来源',
dataIndex: 'carbonSource', dataIndex: 'carbonSource',
width: 100,
key: 'carbonSource', key: 'carbonSource',
}, },
{ {
title: '数值', title: '数值',
dataIndex: 'emissionFactors', dataIndex: 'emissionFactors',
width: 100,
key: 'emissionFactors', key: 'emissionFactors',
}, },
], ],
@ -914,6 +938,7 @@
{ {
title: '排放量', title: '排放量',
dataIndex: 'emissions', dataIndex: 'emissions',
width: 100,
key: 'emissions', key: 'emissions',
fixed: 'right', fixed: 'right',
}, },
@ -1069,12 +1094,23 @@
// //
const options = await dict({ params: { dicKey: 'ENERGY_TYPE' } }); const options = await dict({ params: { dicKey: 'ENERGY_TYPE' } });
energyTypeOptions.value = options.data.data; energyTypeOptions.value = options.data.data;
editFormState.value.key = record.factorName; editFormState.value.key = record.factorId;
searchKey(); searchKey();
editFormState.value.id = record.id; editFormState.value.id = record.id;
editFormState.value.dataSources = record.dataSources; editFormState.value.dataSources = record.dataSources;
if (record.dataSources !== undefined) {
if (record.dataSources.value === 3) {
canEdit.value = true;
automatic.value = true;
} else {
canEdit.value = false;
automatic.value = false;
}
}
editFormState.value.consumption = record.consumption; editFormState.value.consumption = record.consumption;
editFormState.value.collectionNode = record.carbonSource; editFormState.value.energyConsumptionType = record.energyConsumptionType;
changeEnergyType(record.energyConsumptionType);
editFormState.value.collectionNode = record.collectionNode;
editFormState.value.factorId = record.factorId; editFormState.value.factorId = record.factorId;
editFormState.value.emissionFactors = record.emissionFactors; editFormState.value.emissionFactors = record.emissionFactors;
selectedRowKeysEdit.value = [record.factorId]; selectedRowKeysEdit.value = [record.factorId];
@ -1097,9 +1133,9 @@
}; };
const searchKey = () => { const searchKey = () => {
if (editFormState.value.key) { if (editFormState.value.key) {
queryData.value.emissionSources = editFormState.value.key; queryData.value.factorId = editFormState.value.key;
} else { } else {
queryData.value.emissionSources = ''; queryData.value.factorId = 0;
} }
getNewTable(); getNewTable();
}; };
@ -1137,6 +1173,7 @@
}; };
const spinning = ref(false); const spinning = ref(false);
const selectNode = (value) => { const selectNode = (value) => {
editFormState.value.collectionNode = value;
spinning.value = true; spinning.value = true;
const getConsumeData = ref({ const getConsumeData = ref({
acquisitionDate: acquisitionDate.value, acquisitionDate: acquisitionDate.value,
@ -1198,9 +1235,9 @@
if (editFormState.value.dataSources.value) { if (editFormState.value.dataSources.value) {
editFormState.value.dataSources = editFormState.value.dataSources.value; editFormState.value.dataSources = editFormState.value.dataSources.value;
} }
if (editFormState.value.collectionNode) { // if (editFormState.value.collectionNode) {
editFormState.value.collectionNode = editFormState.value.collectionNode.value; // editFormState.value.collectionNode = editFormState.value.collectionNode.value;
} // }
fetch(carbonInventoryCheck.updateTable, editFormState.value).then((res) => { fetch(carbonInventoryCheck.updateTable, editFormState.value).then((res) => {
if (fileList.value.length !== 0) { if (fileList.value.length !== 0) {
const formData = ref(new FormData()); const formData = ref(new FormData());
@ -1235,6 +1272,32 @@
console.log('error', error); console.log('error', error);
}); });
}; };
const openVisible = ref(false);
const setFactorRef = ref();
const config = setFactorConfig(orgId.value);
const selectFactor = () => {
openVisible.value = true;
};
const btnClick = () => {
let selectRowKeys = setFactorRef.value?.nsTableRef.tableState.selectedRowKeys;
if (selectRowKeys.length === 0) {
NsMessage.warn('请选择因子');
return;
} else {
if (newTableData.value.emissionFactorUnits === carbonEmission.value) {
newTableData.value = setFactorRef.value?.nsTableRef.tableState.selectedRows;
selectedRowKeysEdit.value = setFactorRef.value?.nsTableRef.tableState.selectedRowKeys;
editFormState.value.emissionFactors = newTableData.value[0].emissionFactors;
editFormState.value.factorId = selectedRowKeysEdit.value[0];
openVisible.value = false;
} else {
NsMessage.warn('因子值单位不统一,请重新选择!');
}
}
};
const onCloseClick = () => {
openVisible.value = false;
};
const onCloseEditData = () => { const onCloseEditData = () => {
editData.value = false; editData.value = false;
delIds.value = []; delIds.value = [];
@ -1249,7 +1312,7 @@
const onChange = (pageNumber: number, size: number) => { const onChange = (pageNumber: number, size: number) => {
queryData.value.pageNum = pageNumber; queryData.value.pageNum = pageNumber;
queryData.value.pageSize = size; queryData.value.pageSize = size;
getNewTable(); // getNewTable();
}; };
// / // /
const fillInPage = ref(true); const fillInPage = ref(true);
@ -1730,9 +1793,11 @@
.mainLeft { .mainLeft {
width: 19%; width: 19%;
margin-right: 1%; margin-right: 1%;
border-right: 1px solid #f2f2f2;
position: relative; position: relative;
height: 96%; height: 100%;
border: 1px solid #f2f2f2;
border-radius: 8px;
padding: 4px;
.treeRow { .treeRow {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@ -1757,6 +1822,7 @@
} }
.mainRight { .mainRight {
width: 80%; width: 80%;
border-left: 1px solid #f2f2f2;
} }
} }

7
hx-ai-intelligent/src/view/carbonEmissionManage/carbonInventoryCheck/index.vue

@ -79,7 +79,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, toRaw } from 'vue'; import { ref, toRaw, watch, nextTick } from 'vue';
import { http } from '/nerv-lib/util/http'; import { http } from '/nerv-lib/util/http';
import { carbonInventoryCheck } from '/@/api/carbonEmissionFactorLibrary'; import { carbonInventoryCheck } from '/@/api/carbonEmissionFactorLibrary';
import fillIn from './fillInPage/index.vue'; import fillIn from './fillInPage/index.vue';
@ -118,7 +118,10 @@
const openChange = (status) => { const openChange = (status) => {
if (status === false) { if (status === false) {
if (formState.value.reportYear) { if (formState.value.reportYear) {
defaultPickerValue.value = [dayjs('2022'), dayjs('2022')]; defaultPickerValue.value = [
dayjs(formState.value.reportYear),
dayjs(formState.value.reportYear),
];
} }
} }
}; };

231
hx-ai-intelligent/src/view/carbonEmissionManage/carbonPlanning/category/categoryDeatil.vue

@ -100,7 +100,6 @@
<a-table-summary-row> <a-table-summary-row>
<a-table-summary-cell></a-table-summary-cell> <a-table-summary-cell></a-table-summary-cell>
<a-table-summary-cell :colSpan="2">合计</a-table-summary-cell> <a-table-summary-cell :colSpan="2">合计</a-table-summary-cell>
<a-table-summary-cell></a-table-summary-cell>
<a-table-summary-cell> <a-table-summary-cell>
<a-typography-text>{{ totalLastYearActualUsage + unit }}</a-typography-text> <a-typography-text>{{ totalLastYearActualUsage + unit }}</a-typography-text>
</a-table-summary-cell> </a-table-summary-cell>
@ -153,88 +152,120 @@
</a-form> </a-form>
</a-modal> </a-modal>
<!-- 基准值设置 --> <!-- 基准值设置 -->
<a-modal :visible="visible" @ok="onSubmit" @cancel="onClose"> <a-modal
<a-tooltip placement="top"> :visible="visible"
<template #title> @ok="onSubmit"
<span>月基准值设置使用基准年相应月份的数据作为当前年相应月份的基准值</span> @cancel="onClose"
</template> :style="{ top: '20px', left: '-100px' }"
<QuestionCircleOutlined style="position: absolute; right: 60px; top: 22px; z-index: 7" /> :bodyStyle="{ maxHeight: '800px', overflowY: 'auto' }">
</a-tooltip> <a-spin :spinning="loading">
<div style="display: flex; margin-top: 20px; justify-content: space-between"> <a-tooltip placement="top">
<span> 节点{{ props.nodeName }} </span> <template #title>
<a-date-picker <span>月基准值设置使用基准年相应月份的数据作为当前年相应月份的基准值</span>
v-if="activeKey === '1'" </template>
v-model:value="selectYear" <QuestionCircleOutlined style="position: absolute; right: 60px; top: 22px; z-index: 7" />
picker="year" </a-tooltip>
valueFormat="YYYY" <a-tabs v-model:activeKey="activeKey" @change="handleTabChange">
@change="changeYearData" /> <a-tab-pane key="1" tab="年基准值设置">
</div> <div
<a-tabs v-model:activeKey="activeKey" @change="handleTabChange"> style="
<a-tab-pane key="1" tab="年基准值设置"> display: flex;
<a-table margin-bottom: 10px;
:columns="yearColumns" justify-content: space-between;
:data-source="yearTableData" margin-top: 10px;
bordered ">
:rowKey="(record, index) => record.referenceYear" <span> 节点{{ props.nodeName }} </span>
:rowSelection="{ <a-date-picker
selectedRowKeys: selectedRowKeysSet, v-model:value="selectYear"
onChange: onSelectionChangeSet, picker="year"
type: 'radio', valueFormat="YYYY"
}" @change="changeYearData" />
:pagination="false"> </div>
</a-table> <a-table
</a-tab-pane> :columns="yearColumns"
<a-tab-pane key="2" tab="月基准值设置" force-render> :data-source="yearTableData"
<a-table :columns="monthColumns" :data-source="dataSource" bordered :pagination="false"> bordered
<template #bodyCell="{ column, text, record }"> :rowKey="(record, index) => record.referenceYear"
<template v-if="['referenceValue'].includes(column.dataIndex)"> :rowSelection="{
<div> selectedRowKeys: selectedRowKeysSet,
<a-input onChange: onSelectionChangeSet,
v-if="editableData[record.yearMonth]" type: 'radio',
v-model:value="editableData[record.yearMonth][column.dataIndex]" }"
style="margin: -5px 0" /> :pagination="false">
<template v-else> </a-table>
{{ text }} <a-pagination
</template> v-model:current="queryData.pageNum"
</div> simple
</template> :total="total"
<template v-else-if="column.dataIndex === 'operation'"> @change="onChange"
<div class="editable-row-operations"> style="display: flex; justify-content: end; margin-top: 10px" />
<span v-if="editableData[record.yearMonth]"> </a-tab-pane>
<a-popconfirm <a-tab-pane key="2" tab="月基准值设置" force-render>
title="确定要保存?" <div
ok-text="确定" style="
cancel-text="取消" display: flex;
@confirm="save(record.yearMonth)" margin-bottom: 10px;
@cancel="cancel(record.yearMonth)"> justify-content: space-between;
<a>保存</a> margin-top: 10px;
</a-popconfirm> ">
</span> <span> 节点{{ props.nodeName }} </span>
<span v-else> </div>
<a-button <a-table
type="link" :columns="monthColumns"
@click="edit(record.yearMonth)" :data-source="dataSource"
:disabled="record.isAutoObtained === 0 ? true : false"> size="small"
编辑 bordered
</a-button> :pagination="false">
</span> <template #bodyCell="{ column, text, record }">
</div> <template v-if="['referenceValue'].includes(column.dataIndex)">
</template> <div>
<template v-if="column.key === 'isAutoObtained'"> <a-input
<a-switch v-if="editableData[record.yearMonth]"
checked-children="是" v-model:value="editableData[record.yearMonth][column.dataIndex]"
un-checked-children="否" style="margin: -5px 0" />
:checked="record.isAutoObtained === 0 ? true : false" <template v-else>
:class="{ {{ text }}
'blue-background': record.isAutoObtained === 0 ? true : false, </template>
'grey-background': record.isAutoObtained === 0 ? false : true, </div>
}" </template>
@click="changeSwitch(record)" /> <template v-else-if="column.dataIndex === 'operation'">
<div class="editable-row-operations">
<span v-if="editableData[record.yearMonth]">
<a-popconfirm
title="确定要保存?"
ok-text="确定"
cancel-text="取消"
@confirm="save(record.yearMonth)"
@cancel="cancel(record.yearMonth)">
<a>保存</a>
</a-popconfirm>
</span>
<span v-else>
<a-button
type="link"
@click="edit(record.yearMonth)"
:disabled="record.isAutoObtained === 0 ? true : false">
编辑
</a-button>
</span>
</div>
</template>
<template v-if="column.key === 'isAutoObtained'">
<a-switch
checked-children="是"
un-checked-children="否"
:checked="record.isAutoObtained === 0 ? true : false"
:class="{
'blue-background': record.isAutoObtained === 0 ? true : false,
'grey-background': record.isAutoObtained === 0 ? false : true,
}"
@click="changeSwitch(record)" />
</template>
</template> </template>
</template> </a-table>
</a-table> </a-tab-pane>
</a-tab-pane> </a-tabs>
</a-tabs> </a-spin>
</a-modal> </a-modal>
</div> </div>
</template> </template>
@ -255,7 +286,13 @@
import * as echarts from 'echarts'; import * as echarts from 'echarts';
import { any, string } from 'vue-types'; import { any, string } from 'vue-types';
import type { Dayjs } from 'dayjs'; import type { Dayjs } from 'dayjs';
import { Pagination } from 'ant-design-vue';
defineOptions({
components: {
'a-pagination': Pagination,
},
});
// id // id
const props = defineProps({ const props = defineProps({
parentId: { parentId: {
@ -383,8 +420,10 @@
formState.value.ids = [record.id]; formState.value.ids = [record.id];
if (record.lastYear === '是') { if (record.lastYear === '是') {
formState.value.isLastYear = 1; formState.value.isLastYear = 1;
disabled.value = false;
} else { } else {
formState.value.isLastYear = 0; formState.value.isLastYear = 0;
disabled.value = true;
} }
formState.value.conversionRate = record.conversionRate; formState.value.conversionRate = record.conversionRate;
formState.value.lastYearList = [record.lastYearActualUsage]; formState.value.lastYearList = [record.lastYearActualUsage];
@ -454,7 +493,14 @@
orgId: orgId.value, orgId: orgId.value,
type: props.type, type: props.type,
itemizeId: props.parentId, itemizeId: props.parentId,
pageSize: 10,
pageNum: 1,
}); });
const total = ref();
const onChange = (page, pageSize) => {
queryData.value.pageNum = page;
setBasicData();
};
const changeYearData = () => { const changeYearData = () => {
queryData.value.referenceYear = selectYear.value; queryData.value.referenceYear = selectYear.value;
setBasicData(); setBasicData();
@ -462,7 +508,8 @@
const yearTableData = ref([]); const yearTableData = ref([]);
const setBasicData = () => { const setBasicData = () => {
fetch(carbonPlanning.benchmarkSetting, queryData.value).then((res) => { fetch(carbonPlanning.benchmarkSetting, queryData.value).then((res) => {
yearTableData.value = res.data; yearTableData.value = res.data.records;
total.value = res.data.total;
}); });
visible.value = true; visible.value = true;
}; };
@ -507,6 +554,7 @@
{ {
title: '日期', title: '日期',
dataIndex: 'yearMonth', dataIndex: 'yearMonth',
width: '20%',
}, },
{ {
title: '用电量', title: '用电量',
@ -543,7 +591,9 @@
const cancel = (yearMonth: string) => { const cancel = (yearMonth: string) => {
delete editableData[yearMonth]; delete editableData[yearMonth];
}; };
const loading = ref(false);
const onSubmit = () => { const onSubmit = () => {
loading.value = true;
const benchmark = monthData.value; const benchmark = monthData.value;
fetch(carbonPlanning.benchmarkSubmit, { fetch(carbonPlanning.benchmarkSubmit, {
benchmark: benchmark, benchmark: benchmark,
@ -555,6 +605,7 @@
visible.value = false; visible.value = false;
activeKey.value = '1'; activeKey.value = '1';
selectedRowKeysSet.value = []; selectedRowKeysSet.value = [];
loading.value = false;
getTableData(); getTableData();
}); });
}; };
@ -623,8 +674,8 @@
props.year + '年预算', props.year + '年预算',
'基准值', '基准值',
], ],
top: '0', top: '1%',
right: '0', right: '1%',
textStyle: { textStyle: {
color: '#666', color: '#666',
fontSize: 12, fontSize: 12,
@ -781,7 +832,6 @@
<style lang="less" scoped> <style lang="less" scoped>
.detailContant { .detailContant {
height: 100%; height: 100%;
margin: 12px;
} }
.ns-form-title { .ns-form-title {
font-weight: bold; font-weight: bold;
@ -791,7 +841,7 @@
align-items: center; align-items: center;
width: 100%; width: 100%;
height: 5vh; height: 5vh;
padding: 12px 12px 0 12px;
.title { .title {
text-align: left; text-align: left;
height: 32px; height: 32px;
@ -826,11 +876,15 @@
width: 100%; width: 100%;
height: calc(95% - 5vh); height: calc(95% - 5vh);
overflow: auto; overflow: auto;
padding: 12px;
.chartsPart { .chartsPart {
width: 100%; width: 100%;
height: 63%; height: 63%;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
border-radius: 12px;
background: rgba(255, 255, 255, 1);
box-shadow: 0px 2px 20px rgb(69 123 234 / 20%);
.chart { .chart {
width: 100%; width: 100%;
height: 65%; height: 65%;
@ -938,6 +992,9 @@
right: 10px; right: 10px;
top: 5px; top: 5px;
} }
:deep(.ant-card-bordered) {
border: unset;
}
</style> </style>
<style scoped> <style scoped>
.editable-row-operations a { .editable-row-operations a {

7
hx-ai-intelligent/src/view/carbonEmissionManage/carbonPlanning/category/index.vue

@ -126,6 +126,9 @@
energyType: { energyType: {
type: String, type: String,
}, },
energyTypeName: {
type: String,
},
}); });
const orgId = ref(''); const orgId = ref('');
const result = JSON.parse(sessionStorage.getItem('ORGID')!); const result = JSON.parse(sessionStorage.getItem('ORGID')!);
@ -216,7 +219,9 @@
const option = { const option = {
backgroundColor: 'transparent', backgroundColor: 'transparent',
title: { title: {
text: '历年用电量分析', text: selectedTime.value
? '历年' + props.energyTypeName + '分析'
: '每月' + props.energyTypeName + '分析',
x: '0', x: '0',
textStyle: { textStyle: {
color: 'rgba(51, 51, 51, 1)', color: 'rgba(51, 51, 51, 1)',

36
hx-ai-intelligent/src/view/carbonEmissionManage/carbonPlanning/index.vue

@ -4,19 +4,39 @@
<all ref="allRef" /> <all ref="allRef" />
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="2" tab="用电量"> <a-tab-pane key="2" tab="用电量">
<category ref="electricRef" :tabId="tabId" :energyType="energyType" /> <category
ref="electricRef"
:tabId="tabId"
:energyType="energyType"
:energyTypeName="energyTypeName" />
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="3" tab="用水量"> <a-tab-pane key="3" tab="用水量">
<category ref="useWaterRef" :tabId="tabId" :energyType="energyType" /> <category
ref="useWaterRef"
:tabId="tabId"
:energyType="energyType"
:energyTypeName="energyTypeName" />
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="4" tab="用气量"> <a-tab-pane key="4" tab="用气量">
<category ref="provideWaterRef" :tabId="tabId" :energyType="energyType" /> <category
ref="provideWaterRef"
:tabId="tabId"
:energyType="energyType"
:energyTypeName="energyTypeName" />
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="5" tab="供热量"> <a-tab-pane key="5" tab="供热量">
<category ref="carbonEmissionsRef" :tabId="tabId" :energyType="energyType" /> <category
ref="carbonEmissionsRef"
:tabId="tabId"
:energyType="energyType"
:energyTypeName="energyTypeName" />
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="6" tab="碳排量"> <a-tab-pane key="6" tab="碳排量">
<category ref="provideHotRef" :tabId="tabId" :energyType="energyType" /> <category
ref="provideHotRef"
:tabId="tabId"
:energyType="energyType"
:energyTypeName="energyTypeName" />
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
</template> </template>
@ -41,6 +61,7 @@
// tab // tab
const tabId = ref(1); const tabId = ref(1);
const energyType = ref(); const energyType = ref();
const energyTypeName = ref();
const handleTabChange = (key) => { const handleTabChange = (key) => {
console.log('Tab changed:', key); console.log('Tab changed:', key);
// //
@ -53,6 +74,7 @@
} else if (key === '2') { } else if (key === '2') {
tabId.value = 4; tabId.value = 4;
energyType.value = 'ELECTRICITY_USAGE'; energyType.value = 'ELECTRICITY_USAGE';
energyTypeName.value = '用电量';
nextTick(() => { nextTick(() => {
if (electricRef.value) { if (electricRef.value) {
electricRef.value.electricTotal = true; electricRef.value.electricTotal = true;
@ -62,6 +84,7 @@
} else if (key === '3') { } else if (key === '3') {
tabId.value = 5; tabId.value = 5;
energyType.value = 'WATER_USAGE'; energyType.value = 'WATER_USAGE';
energyTypeName.value = '用水量';
nextTick(() => { nextTick(() => {
if (useWaterRef.value) { if (useWaterRef.value) {
useWaterRef.value.electricTotal = true; useWaterRef.value.electricTotal = true;
@ -71,6 +94,7 @@
} else if (key === '4') { } else if (key === '4') {
tabId.value = 6; tabId.value = 6;
energyType.value = 'GAS_USAGE'; energyType.value = 'GAS_USAGE';
energyTypeName.value = '用气量';
nextTick(() => { nextTick(() => {
if (provideWaterRef.value) { if (provideWaterRef.value) {
provideWaterRef.value.electricTotal = true; provideWaterRef.value.electricTotal = true;
@ -80,6 +104,7 @@
} else if (key === '5') { } else if (key === '5') {
tabId.value = 7; tabId.value = 7;
energyType.value = 'CARBON_EMISSIONS'; energyType.value = 'CARBON_EMISSIONS';
energyTypeName.value = '供热量';
nextTick(() => { nextTick(() => {
if (carbonEmissionsRef.value) { if (carbonEmissionsRef.value) {
carbonEmissionsRef.value.electricTotal = true; carbonEmissionsRef.value.electricTotal = true;
@ -89,6 +114,7 @@
} else if (key === '6') { } else if (key === '6') {
tabId.value = 8; tabId.value = 8;
energyType.value = 'HEAT_SUPPLY'; energyType.value = 'HEAT_SUPPLY';
energyTypeName.value = '碳排量';
nextTick(() => { nextTick(() => {
if (provideHotRef.value) { if (provideHotRef.value) {
provideHotRef.value.electricTotal = true; provideHotRef.value.electricTotal = true;

Loading…
Cancel
Save