|
@@ -0,0 +1,1065 @@
|
|
|
+<script setup>
|
|
|
+import { ref, unref, onMounted } from 'vue';
|
|
|
+import { NDrawer, NDrawerContent, NForm, NSelect, NFormItem, NDatePicker, useMessage, NScrollbar, NTooltip } from 'naive-ui';
|
|
|
+import { SvgIcon, BaseNumberInput } from '@/components';
|
|
|
+import { BaseCard, BaseStep, BaseTable, BasePanel } from './index';
|
|
|
+import zhCn from 'element-plus/es/locale/lang/zh-cn'
|
|
|
+import { useTable } from '@/composables/useTable';
|
|
|
+import { inputConfig } from './config';
|
|
|
+import { inputHasBorderThemeOverrides } from '../tools/resetTheme';
|
|
|
+
|
|
|
+import { carbonApi } from '@/api/carbon'
|
|
|
+import dayjs from 'dayjs';
|
|
|
+
|
|
|
+const emit = defineEmits(['on-submit']);
|
|
|
+const isVisibleDrawer = defineModel();
|
|
|
+const props = defineProps({
|
|
|
+ allMonth: {
|
|
|
+ type: Array,
|
|
|
+ default: () => []
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+const BASE_RULES = { required: true, type: 'number' };
|
|
|
+
|
|
|
+const message = useMessage();
|
|
|
+const { addTable, removeTable, tableData } = useTable();
|
|
|
+
|
|
|
+const inpConfig = ref(inputConfig);
|
|
|
+
|
|
|
+const spliceInpData = ref([]);
|
|
|
+
|
|
|
+const today = dayjs();
|
|
|
+const firstDayOfMonth = today.startOf('month');
|
|
|
+const elementDatePicker = ref(null);
|
|
|
+
|
|
|
+const formValue = ref({});
|
|
|
+const selectCodeSet = ref({});
|
|
|
+const selectValue = ref({});
|
|
|
+
|
|
|
+const formRef = ref(null);
|
|
|
+const switchCo2State = ref(0);
|
|
|
+const disableEnthalpyValue = ref(false);
|
|
|
+const tabCo2Data = ['泵站和沉砂池逸散的CH₄量(实测)', '泵站和沉砂池逸散的CH₄量(未实测)']
|
|
|
+
|
|
|
+const rules = {
|
|
|
+ provinceId: [
|
|
|
+ { required: true, type: 'number' }
|
|
|
+ ],
|
|
|
+ addYearMonth: [
|
|
|
+ { required: true }
|
|
|
+ ],
|
|
|
+ wsSjclCh4Clsl: [
|
|
|
+ { required: true, type: 'number' }
|
|
|
+ ],
|
|
|
+ wsSjclCh4JsCod: [{ required: true, type: 'number' }],
|
|
|
+ wsSjclCh4CsCod: [{ required: true, type: 'number' }],
|
|
|
+ wsSjclCh4Tsb: [{ required: true, type: 'number' }],
|
|
|
+ wsSjclCh4Csc: [{ required: true, type: 'number' }],
|
|
|
+
|
|
|
+ wsTdN2oClsl: [{ required: true, type: 'number' }],
|
|
|
+ wsTdN2oJsTn: [{ required: true, type: 'number' }],
|
|
|
+ wsTdN2oCsTn: [{ required: true, type: 'number' }],
|
|
|
+
|
|
|
+ nyyjDlxhZhdl: [{ required: true, type: 'number' }],
|
|
|
+ nyyjGrrlZq: [
|
|
|
+ { required: true, type: 'number' }
|
|
|
+ ],
|
|
|
+ nyyjGrrlDyhz: [
|
|
|
+ { validator: (_, val) => {
|
|
|
+ if ( formValue.value.nyyjGrrlZq === 0 ) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (!val && val != 0) {
|
|
|
+ return new Error()
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ ],
|
|
|
+ wnclYyzqZqcl: [{ validator: (_, val) => (formValue.value.wnclYyzqChZlfs && !val ? new Error() : true) }],
|
|
|
+ wnclYyzqChZlfs: [{ validator: (_, val) => (formValue.value.wnclYyzqZqcl && !val ? new Error() : true) }],
|
|
|
+
|
|
|
+ wnclDdclZycll: [{
|
|
|
+ required: true, validator: (_, val) => {
|
|
|
+ const { wnclDdclClqnd, wnclDdclClhnd } = formValue.value;
|
|
|
+ if ((wnclDdclClqnd || wnclDdclClhnd) && !val) {
|
|
|
+ return new Error();
|
|
|
+ } else {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }],
|
|
|
+ wnclDdclClqnd: [{
|
|
|
+ required: true, validator: (_, val) => {
|
|
|
+ const { wnclDdclZycll, wnclDdclClhnd } = formValue.value;
|
|
|
+ if ((wnclDdclZycll || wnclDdclClhnd) && !val) {
|
|
|
+ return new Error();
|
|
|
+ } else {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }],
|
|
|
+ wnclDdclClhnd: [{
|
|
|
+ required: true, validator: (_, val) => {
|
|
|
+ const { wnclDdclClqnd, wnclDdclZycll } = formValue.value;
|
|
|
+ if ((wnclDdclClqnd || wnclDdclZycll) && !val) {
|
|
|
+ return new Error();
|
|
|
+ } else {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }],
|
|
|
+
|
|
|
+ wnclWnfsXhl: [{ validator: (_, val) => (formValue.value.wnclWnfsHtbl && !val ? new Error() : true) }],
|
|
|
+ wnclWnfsHtbl: [{ validator: (_, val) => (formValue.value.wnclWnfsXhl && !val ? new Error() : true) }],
|
|
|
+
|
|
|
+ wnclWnrjByhXhl: [{ validator: (_, val) => (formValue.value.wnclWnrjByhHtbl && !val ? new Error() : true) }],
|
|
|
+ wnclWnrjByhHtbl: [{ validator: (_, val) => (formValue.value.wnclWnrjByhXhl && !val ? new Error() : true) }],
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+const handleDatePicker = async (month) => {
|
|
|
+ const { data } = await carbonApi.getBaseData(dayjs(month).format('YYYY-MM'));
|
|
|
+
|
|
|
+ const { jsl, jsCod, csCod, jsTn, csTn } = data;
|
|
|
+ formValue.value.wsHsytkhClsl = jsl;
|
|
|
+ formValue.value.wsHsytkhJsCod = jsCod;
|
|
|
+ formValue.value.wsHsytkhCsCod = csCod;
|
|
|
+ formValue.value.wsSjclCh4Clsl = jsl;
|
|
|
+ formValue.value.wsSjclCh4JsCod = jsCod;
|
|
|
+ formValue.value.wsSjclCh4CsCod = csCod;
|
|
|
+
|
|
|
+ formValue.value.wsTdN2oClsl = jsl;
|
|
|
+ formValue.value.wsTdN2oJsTn = jsTn;
|
|
|
+ formValue.value.wsTdN2oCsTn = csTn;
|
|
|
+}
|
|
|
+
|
|
|
+const switchTabs = (index) => {
|
|
|
+ switchCo2State.value = index;
|
|
|
+ if (index == 1) {
|
|
|
+ spliceInpData.value = inpConfig.value.sewage.twoBlock.splice(4);
|
|
|
+ } else {
|
|
|
+ inpConfig.value.sewage.twoBlock = [...inpConfig.value.sewage.twoBlock, ...spliceInpData.value]
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const getCodeSetInfo = ({ key, code }) => {
|
|
|
+ return selectCodeSet.value[key].find(({ dictCode }) => dictCode == code);
|
|
|
+}
|
|
|
+
|
|
|
+// 表格添加
|
|
|
+const handleAddTableRow = (key) => {
|
|
|
+
|
|
|
+ let option = {};
|
|
|
+
|
|
|
+ if (key === 'sewageCo2First') {
|
|
|
+
|
|
|
+ const ids = [135];
|
|
|
+
|
|
|
+ if (!selectValue.value.tymc) {
|
|
|
+ return message.warning("请先选择碳源名称");
|
|
|
+ }
|
|
|
+
|
|
|
+ const codeSet = getCodeSetInfo({
|
|
|
+ key: 'tymcOptions',
|
|
|
+ code: selectValue.value.tymc
|
|
|
+ });
|
|
|
+
|
|
|
+ const isExists = ids.includes(codeSet.dictCode);
|
|
|
+
|
|
|
+ option = {
|
|
|
+ columns: ['碳源名称', isExists ? '有效COD质量' : '外加碳源用量', '操作'],
|
|
|
+ data: [
|
|
|
+ { type: 'name', value: codeSet.dictLabel },
|
|
|
+ { type: 'input', value: '', unit: 'Kg/月' },
|
|
|
+ { type: 'text' }
|
|
|
+ ],
|
|
|
+ codeSet,
|
|
|
+ type: 0
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (key === 'energyFirst') {
|
|
|
+
|
|
|
+ const ids = [181, 182];
|
|
|
+
|
|
|
+
|
|
|
+ if (!selectValue.value.hsrl) {
|
|
|
+ return message.warning("请先选择固液气-化石燃料");
|
|
|
+ }
|
|
|
+
|
|
|
+ const codeSet = getCodeSetInfo({
|
|
|
+ key: 'hsrlOptions',
|
|
|
+ code: selectValue.value.hsrl
|
|
|
+ });
|
|
|
+
|
|
|
+ const isExists = ids.includes(codeSet.dictCode);
|
|
|
+ let unit = '';
|
|
|
+ if (isExists) {
|
|
|
+ unit = '万m³/月';
|
|
|
+ } else {
|
|
|
+ if ( selectValue.value.hsrl === 180 ) {
|
|
|
+ unit = '10⁴Nm³';
|
|
|
+ } else {
|
|
|
+ unit = 't/月';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ option = {
|
|
|
+ columns: ['燃料名称', '燃料消耗量', '操作'],
|
|
|
+ data: [
|
|
|
+ { type: 'name', value: codeSet.dictLabel },
|
|
|
+ { type: 'input', value: null, unit: unit },
|
|
|
+ { type: 'text' }
|
|
|
+ ],
|
|
|
+ codeSet,
|
|
|
+ type: 1
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (key === 'energySecond') {
|
|
|
+
|
|
|
+ const ids = [143];
|
|
|
+
|
|
|
+ if (!selectValue.value.yjmc) {
|
|
|
+ return message.warning("请先选择药剂名称");
|
|
|
+ }
|
|
|
+
|
|
|
+ const codeSet = getCodeSetInfo({
|
|
|
+ key: 'yjmcOptions',
|
|
|
+ code: selectValue.value.yjmc
|
|
|
+ });
|
|
|
+
|
|
|
+ const isExists = ids.includes(codeSet.dictCode);
|
|
|
+
|
|
|
+ option = {
|
|
|
+ columns: ['药剂名称', isExists ? '有效COD质量' : '药剂消耗量', '操作'],
|
|
|
+ data: [
|
|
|
+ { type: 'name', value: codeSet.dictLabel },
|
|
|
+ { type: 'input', value: null, unit: 'Kg/月' },
|
|
|
+ { type: 'text' }
|
|
|
+ ],
|
|
|
+ codeSet,
|
|
|
+ type: 2
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (key === 'carbonFirst') {
|
|
|
+
|
|
|
+ if (!selectValue.value.gyittOne) {
|
|
|
+ return message.warning("请先选择固液气-替碳");
|
|
|
+ }
|
|
|
+
|
|
|
+ const codeSet = getCodeSetInfo({
|
|
|
+ key: 'gyittOptions',
|
|
|
+ code: selectValue.value.gyittOne
|
|
|
+ });
|
|
|
+
|
|
|
+ option = {
|
|
|
+ columns: ['替代的燃料名称', '热泵供热、供冷量', '操作'],
|
|
|
+ data: [
|
|
|
+ { type: 'name', value: codeSet.dictLabel },
|
|
|
+ { type: 'input', value: null, unit: 'KJ/月' },
|
|
|
+ { type: 'text' }
|
|
|
+ ],
|
|
|
+ codeSet,
|
|
|
+ type: 3
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (key === 'carbonThird') {
|
|
|
+
|
|
|
+ if (!selectValue.value.gyittTwo) {
|
|
|
+ return message.warning("请先选择固液气-替碳");
|
|
|
+ }
|
|
|
+
|
|
|
+ const codeSet = getCodeSetInfo({
|
|
|
+ key: 'gyittOptions',
|
|
|
+ code: selectValue.value.gyittTwo
|
|
|
+ });
|
|
|
+
|
|
|
+ option = {
|
|
|
+ columns: ['替代的燃料名称', '污泥厌氧消化沼气发电量', '厌氧消化沼气富余热能用量', '沼气提纯并网的天然气量', '操作'],
|
|
|
+ data: [
|
|
|
+ { type: 'name', value: codeSet.dictLabel },
|
|
|
+ { type: 'input', value: null, unit: 'kW·h/月' },
|
|
|
+ { type: 'input', value: null, unit: 'TJ/月' },
|
|
|
+ { type: 'input', value: null, unit: 'm³ CH₄/月' },
|
|
|
+ { type: 'text' }
|
|
|
+ ],
|
|
|
+ codeSet,
|
|
|
+ type: 4
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (key === 'carbonFourth') {
|
|
|
+
|
|
|
+ if (!selectValue.value.gyittThree) {
|
|
|
+ return message.warning("请先选择固液气-替碳");
|
|
|
+ }
|
|
|
+
|
|
|
+ const codeSet = getCodeSetInfo({
|
|
|
+ key: 'gyittOptions',
|
|
|
+ code: selectValue.value.gyittThree
|
|
|
+ });
|
|
|
+
|
|
|
+ option = {
|
|
|
+ // 沼气提纯并网的天然气量
|
|
|
+ columns: ['替代的燃料名称', '污泥焚烧或热解电力利用量', '污泥焚烧或热解热能利用量', '操作'],
|
|
|
+ data: [
|
|
|
+ { type: 'name', value: codeSet.dictLabel },
|
|
|
+ { type: 'input', value: null, unit: 'kW·h/月' },
|
|
|
+ { type: 'input', value: null, unit: 'GJ/月' },
|
|
|
+ // { type: 'input', value: null, unit: 'mKJ/Kg' },
|
|
|
+ { type: 'text' }
|
|
|
+ ],
|
|
|
+ codeSet,
|
|
|
+ type: 5
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ tableData.value[key].isEmpty = false;
|
|
|
+
|
|
|
+ addTable(key, option);
|
|
|
+}
|
|
|
+
|
|
|
+// 格式化数据
|
|
|
+const formatData = () => {
|
|
|
+ const { provinceId, addYearMonth, wsSjclCh4Tsb, wsSjclCh4Csc } = unref(formValue);
|
|
|
+ const provinceName = selectCodeSet.value.areaOptions.find(item => item.dictCode === provinceId)?.dictLabel;
|
|
|
+ const tempObj = {};
|
|
|
+
|
|
|
+ const extraList = Object.keys(tableData.value).map(key => {
|
|
|
+ const whiteList = ['sewageCo2First', 'energyFirst', 'energySecond', 'carbonFirst', 'carbonThird', 'carbonFourth'];
|
|
|
+ const tempArr = [];
|
|
|
+ const commonItem = unref(tableData)[key];
|
|
|
+ if (whiteList.includes(key)) {
|
|
|
+ const result = commonItem.map(({ codeSet, data, type }) => {
|
|
|
+ const [_, amount, lyl, hz] = data || [];
|
|
|
+ return {
|
|
|
+ dictCode: codeSet.dictCode,
|
|
|
+ dictLabel: codeSet.dictLabel,
|
|
|
+ type,
|
|
|
+ amount: amount?.value,
|
|
|
+ lyl: lyl?.value,
|
|
|
+ hz: hz?.value
|
|
|
+ }
|
|
|
+ });
|
|
|
+ tempArr.push(result)
|
|
|
+ } else {
|
|
|
+ const [item] = commonItem;
|
|
|
+ item.data.forEach(child => tempObj[child.key] = child.value);
|
|
|
+ }
|
|
|
+ return tempArr;
|
|
|
+ }).filter(item => item.length).flat(Infinity);
|
|
|
+
|
|
|
+ return {
|
|
|
+ ...formValue.value,
|
|
|
+ ...tempObj,
|
|
|
+ wsSjclCh4Tsb: switchCo2State.value === 0 ? wsSjclCh4Tsb : null,
|
|
|
+ wsSjclCh4Csc: switchCo2State.value === 0 ? wsSjclCh4Csc : null,
|
|
|
+ addYearMonth: dayjs(addYearMonth).format('YYYY-MM'),
|
|
|
+ provinceName,
|
|
|
+ extraList
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+const validateTableData = () => {
|
|
|
+ let result = true;
|
|
|
+ const whiteList = ['sewageCo2First', 'energySecond'];
|
|
|
+ const otherWhiteList = ['energyFirst', 'energySecond',];
|
|
|
+ const onlyWhiteList = ['mudFirst', 'mudSecond', 'carbonSecond',];
|
|
|
+ const tableInnerInpWhiteList = ['sewageCo2First', 'energyFirst', 'energySecond', 'carbonFirst', 'carbonThird', 'carbonFourth']
|
|
|
+
|
|
|
+ Object.keys(tableData.value).forEach(key => {
|
|
|
+ const item = tableData.value[key];
|
|
|
+ if (!item.length && whiteList.includes(key)) {
|
|
|
+ item.isEmpty = true;
|
|
|
+ result = false;
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if (item.length && tableInnerInpWhiteList.includes(key)) {
|
|
|
+
|
|
|
+ item.forEach(item => {
|
|
|
+ item.data.forEach((child) => {
|
|
|
+ if ((child.type === 'input' || child.type === 'select') && !child.value && child.value !== 0) {
|
|
|
+ child.isEmpty = true;
|
|
|
+ result = false
|
|
|
+ } else {
|
|
|
+ child.isEmpty = false;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ if (item.length && otherWhiteList.includes(key)) {
|
|
|
+ item.forEach(item => {
|
|
|
+ item.data.forEach(child => {
|
|
|
+ if (child.type === 'input' && !child.value && child.value !== 0) {
|
|
|
+ child.isEmpty = true;
|
|
|
+ result = false
|
|
|
+ } else {
|
|
|
+ child.isEmpty = false;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ if (onlyWhiteList.includes(key)) {
|
|
|
+ const { data } = tableData.value[key][0];
|
|
|
+ const isExists = data.filter(({ value }) => value || value === 0).length;
|
|
|
+ if (isExists && isExists < data.length) {
|
|
|
+ data.forEach(child => {
|
|
|
+ if ((child.type === 'input' || child.type === 'select') && !child.value && child.value !== 0) {
|
|
|
+ child.isEmpty = true;
|
|
|
+ result = false
|
|
|
+ } else {
|
|
|
+ child.isEmpty = false;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ data.forEach(child => child.isEmpty = false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+const onReset = () => {
|
|
|
+ formRef.value?.restoreValidation();
|
|
|
+ Object.keys(formValue.value).forEach(key => {
|
|
|
+ formValue.value[key] = null;
|
|
|
+ })
|
|
|
+ Object.keys(tableData.value).forEach(key => {
|
|
|
+ const item = tableData.value[key];
|
|
|
+ item.isEmpty = false;
|
|
|
+ })
|
|
|
+ Object.keys(selectValue.value).forEach(key => {
|
|
|
+ selectValue.value[key] = null;
|
|
|
+ })
|
|
|
+ tableData.value = {
|
|
|
+ sewageCo2First: [],
|
|
|
+ energyFirst: [],
|
|
|
+ energySecond: [],
|
|
|
+ mudFirst: [
|
|
|
+ {
|
|
|
+ columns: ['燃烧类型', '污泥处理焚烧量', '污泥焚烧过程N₂O的排放因子'],
|
|
|
+ data: [
|
|
|
+ { type: 'select', value: '', key: 'wnclBwqrsRslx' },
|
|
|
+ { type: 'input', value: null, unit: 't干污泥/月', key: 'wnclBwqrsFsl' },
|
|
|
+ { type: 'input', value: null, unit: 'tkg N₂O/t 干污泥', key: 'wnclBwqrsPfyz', tips: '若无实测,填写0.99' }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ mudSecond: [
|
|
|
+ {
|
|
|
+ columns: ['反应堆类型', '污泥热解消耗量'],
|
|
|
+ data: [
|
|
|
+ { type: 'select', value: '', key: 'wnclWnrjQtLx' },
|
|
|
+ { type: 'input', value: null, unit: 't干污泥/月', key: 'wnclWnrjQtXhl' },
|
|
|
+ // { type: 'input', value: null, unit: 'tkg N₂O/t 干污泥', key: 'wnclWnrjQtPfyz' }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ carbonFirst: [],
|
|
|
+ carbonSecond: [
|
|
|
+ {
|
|
|
+ columns: ['替代的供水厂规模', '回用水供应量'],
|
|
|
+ data: [
|
|
|
+ { type: 'select', value: '', key: 'thZssScgm' },
|
|
|
+ { type: 'input', value: null, unit: 'm³/月', key: '', key: 'thZssGyl' },
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ carbonThird: [],
|
|
|
+ carbonFourth: []
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const onSubmit = (e) => {
|
|
|
+ e.preventDefault();
|
|
|
+ const isVerifying = !validateTableData();
|
|
|
+ formRef.value?.validate(async (errors) => {
|
|
|
+ if (!errors) {
|
|
|
+ if (isVerifying) {
|
|
|
+ return message.error("提交失败, 请检查");
|
|
|
+ }
|
|
|
+ const params = formatData();
|
|
|
+ try {
|
|
|
+ await carbonApi.postCarbonSmart(params);
|
|
|
+ onReset();
|
|
|
+ emit('on-submit');
|
|
|
+ message.success("提交成功");
|
|
|
+ } catch (e) {
|
|
|
+ message.error(e.msg, { duration: 3500 });
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ message.error("提交失败, 请检查");
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+// 获取值集
|
|
|
+const getAllCodeSet = async () => {
|
|
|
+
|
|
|
+ const { data: areaOptions } = await carbonApi.getCodeSet('ss_hl');
|
|
|
+ const { data: tymcOptions } = await carbonApi.getCodeSet('wjtykh_tymc');
|
|
|
+ const { data: hsrlOptions } = await carbonApi.getCodeSet('gyq_hsrl');
|
|
|
+ const { data: yjmcOptions } = await carbonApi.getCodeSet('wscljd_yjxh_yjmc');
|
|
|
+ const { data: gyittOptions } = await carbonApi.getCodeSet('gyq_tt');
|
|
|
+
|
|
|
+ selectCodeSet.value = {
|
|
|
+ areaOptions: areaOptions,
|
|
|
+ tymcOptions,
|
|
|
+ hsrlOptions,
|
|
|
+ yjmcOptions,
|
|
|
+ gyittOptions,
|
|
|
+ fireOptions: [
|
|
|
+ { label: '选择', value: "" },
|
|
|
+ { label: '半连续-加煤机', value: 0 },
|
|
|
+ { label: '半连续-流化床', value: 1 },
|
|
|
+ { label: '间歇性-加煤机', value: 2 },
|
|
|
+ { label: '间歇性-流化床', value: 3 },
|
|
|
+ { label: '连续燃烧', value: 4 }
|
|
|
+ ],
|
|
|
+ reactOptions: [
|
|
|
+ { label: '选择', value: "" },
|
|
|
+ { label: '竖井类型', value: 0 },
|
|
|
+ { label: '流化床式', value: 1 },
|
|
|
+ { label: '回转窑式', value: 2 }
|
|
|
+ ],
|
|
|
+ scgmOptions: [
|
|
|
+ { label: '选择', value: "" },
|
|
|
+ { label: '< 5万,为小型', value: 0 },
|
|
|
+ { label: '5万 ~ 10万,为中型', value: 1 },
|
|
|
+ { label: '>10万,为大型', value: 2 }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+const disabledDate = (t) => {
|
|
|
+ console.log( );
|
|
|
+
|
|
|
+ return props.allMonth?.includes(dayjs(t).format('YYYY-MM')) || !dayjs(t).isBefore(firstDayOfMonth)
|
|
|
+}
|
|
|
+
|
|
|
+const handleInpFocus = () => {
|
|
|
+ elementDatePicker.value.focus();
|
|
|
+}
|
|
|
+
|
|
|
+const onInput = ({ value, name }) => {
|
|
|
+ if ( name === 'nyyjGrrlZq' ) {
|
|
|
+ if ( value === 0 ) {
|
|
|
+ formValue.value.nyyjGrrlDyhz = null;
|
|
|
+ disableEnthalpyValue.value = true;
|
|
|
+ } else {
|
|
|
+ disableEnthalpyValue.value = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+onMounted(async () => {
|
|
|
+ getAllCodeSet();
|
|
|
+})
|
|
|
+
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <NDrawer class="drawer-wrapper" placement="right" :width="1220" :close-on-esc="false" v-model:show="isVisibleDrawer"
|
|
|
+ :auto-focus="false" :mask-closable="false" :block-scroll="false">
|
|
|
+ <n-drawer-content closable title="新建核算" header-class="drawer-header" body-content-class="drawer-body"
|
|
|
+ footer-class="drawer-footer">
|
|
|
+
|
|
|
+ <div class="main-container space-y-[12px]">
|
|
|
+ <NScrollbar style="height: 100%;">
|
|
|
+
|
|
|
+ <BaseCard bgColorType="gradient" style="margin-bottom: 12px;">
|
|
|
+ <BaseStep></BaseStep>
|
|
|
+ </BaseCard>
|
|
|
+
|
|
|
+ <NForm class="space-y-[12px] from-wrapper" ref="formRef" :model="formValue" :show-feedback="false"
|
|
|
+ :rules="rules">
|
|
|
+ <BaseCard title="基础信息" sub-title="碳排放管理基础信息填写">
|
|
|
+ <div class="flex space-x-[24px]">
|
|
|
+ <NFormItem label="省/直辖市" path="provinceId" label-placement="left" class="w-[343px]">
|
|
|
+ <NSelect v-model:value="formValue.provinceId" :options="selectCodeSet.areaOptions"
|
|
|
+ value-field="dictCode" label-field="dictLabel" :rule="BASE_RULES" />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label="核算时间" path="addYearMonth" label-placement="left" class="w-[343px]"
|
|
|
+ style="position: relative;">
|
|
|
+ <NDatePicker type="month" placeholder="请选择" v-model:value="formValue.addYearMonth"
|
|
|
+ class="w-full custom-date-picker" :theme-overrides="inputHasBorderThemeOverrides" actions="confirm"
|
|
|
+ @click="handleInpFocus" :show="false" input-readonly style="position: relative; z-index: 100;">
|
|
|
+ </NDatePicker>
|
|
|
+ <el-config-provider :locale="zhCn">
|
|
|
+ <el-date-picker class="custom-date-picker" v-model="formValue.addYearMonth" type="month"
|
|
|
+ placeholder="请选择" :teleported="false" ref="elementDatePicker" style="position: absolute;"
|
|
|
+ :disabledDate="disabledDate" @change="handleDatePicker"/>
|
|
|
+ </el-config-provider>
|
|
|
+ </NFormItem>
|
|
|
+ </div>
|
|
|
+ </BaseCard>
|
|
|
+
|
|
|
+ <BaseCard title="污水处理" sub-title="生化反应碳排">
|
|
|
+ <BasePanel isXScroll required title="化石源碳矿化产生的碳排放量">
|
|
|
+ <NFormItem label-placement="top" :label="item.label" :path="item.key"
|
|
|
+ v-for="item, index in inpConfig.sewage.oneBlock" :key="index" :rule="BASE_RULES">
|
|
|
+ <BaseNumberInput :unit="item.unit" v-model:value="formValue[item.key]"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel required title="外加碳源矿化产生的化石源CO₂碳排放量">
|
|
|
+ <template #side>
|
|
|
+ <div class="flex items-center space-x-[14px]">
|
|
|
+ <NSelect v-model:value="selectValue.tymc" :options="selectCodeSet.tymcOptions" class="w-[200px]"
|
|
|
+ label-field="dictLabel" value-field="dictCode" />
|
|
|
+ <button class="add-btn space-x-[4px]" @click="handleAddTableRow('sewageCo2First')">
|
|
|
+ <SvgIcon name="tool-add-symbol"></SvgIcon>
|
|
|
+ <span>添加</span>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <BaseTable :data="tableData.sewageCo2First" name="sewageCo2First"
|
|
|
+ @on-remove="(name, index) => removeTable(name, index)"></BaseTable>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel isXScroll trigger="none" required title="污水收集提升和处理阶段排放的CH₄的CO₂当量">
|
|
|
+ <template #side>
|
|
|
+ <ul class="tabs space-x-[12px]">
|
|
|
+ <li v-for="item, index in tabCo2Data"
|
|
|
+ :class="['tab-item', { 'tab-actvie': index === switchCo2State }]" :key="index"
|
|
|
+ @click="switchTabs(index)">{{ item }}</li>
|
|
|
+ </ul>
|
|
|
+ </template>
|
|
|
+ <NFormItem label-placement="top" :label="item.label" :path="item.key"
|
|
|
+ v-for="item, index in inpConfig.sewage.twoBlock" :key="index">
|
|
|
+ <template #label>
|
|
|
+ <div class="flex items-center space-x-[2px]">
|
|
|
+ <span>{{ item.label }}</span>
|
|
|
+ <span class="w-[14px] h-[14px]" v-if="item.key === 'wsSjclCh4Pfyz'">
|
|
|
+ <NTooltip>
|
|
|
+ <template #trigger>
|
|
|
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"><path fill="none" d="M240 304h32l6-160h-44l6 160z"></path><path d="M256 48C141.31 48 48 141.31 48 256s93.31 208 208 208s208-93.31 208-208S370.69 48 256 48zm20 319.91h-40v-40h40zM272 304h-32l-6-160h44z" fill="currentColor"></path></svg>
|
|
|
+ </template>
|
|
|
+ <span>若未实测,请填写0.0075</span>
|
|
|
+ </NTooltip>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <BaseNumberInput :unit="item.unit" v-model:value="formValue[item.key]"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel isXScroll required title="污水生物处理脱氮过程排放的N₂O的CO₂当量">
|
|
|
+ <NFormItem label-placement="top" :path="item.key" :label="item.label"
|
|
|
+ v-for="item, index in inpConfig.sewage.threeBlock" :key="index">
|
|
|
+ <template #label>
|
|
|
+ <div class="flex items-center space-x-[2px]">
|
|
|
+ <span>{{ item.label }}</span>
|
|
|
+ <span class="w-[14px] h-[14px]" v-if="item.key === 'wsTdN2oPfyz'">
|
|
|
+ <NTooltip>
|
|
|
+ <template #trigger>
|
|
|
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"><path fill="none" d="M240 304h32l6-160h-44l6 160z"></path><path d="M256 48C141.31 48 48 141.31 48 256s93.31 208 208 208s208-93.31 208-208S370.69 48 256 48zm20 319.91h-40v-40h40zM272 304h-32l-6-160h44z" fill="currentColor"></path></svg>
|
|
|
+ </template>
|
|
|
+ <span>若未实测,请填写0.01</span>
|
|
|
+ </NTooltip>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <BaseNumberInput :unit="item.unit" v-model:value="formValue[item.key]"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ </BasePanel>
|
|
|
+ </BaseCard>
|
|
|
+
|
|
|
+ <BaseCard title="能源、药剂碳排" sub-title="能源、药剂碳排">
|
|
|
+ <BasePanel isXScroll required title="污水厂电力消耗产生的碳排放量" tips="*为必填项,若有各分项电量,请填写,若无,可不填">
|
|
|
+ <NFormItem label-placement="top" :path="item.key" :label="item.label"
|
|
|
+ v-for="item, index in inpConfig.energy.oneBlock" :key="index">
|
|
|
+ <template #label>
|
|
|
+ <div class="flex items-center space-x-[2px]">
|
|
|
+ <span>{{ item.label }}</span>
|
|
|
+ <span class="w-[14px] h-[14px]" v-if="item.key === 'nyyjDlxhQt'">
|
|
|
+ <NTooltip>
|
|
|
+ <template #trigger>
|
|
|
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"><path fill="none" d="M240 304h32l6-160h-44l6 160z"></path><path d="M256 48C141.31 48 48 141.31 48 256s93.31 208 208 208s208-93.31 208-208S370.69 48 256 48zm20 319.91h-40v-40h40zM272 304h-32l-6-160h44z" fill="currentColor"></path></svg>
|
|
|
+ </template>
|
|
|
+ <span>其他耗电量=总耗电量-各分项电量,若分项填写不全,则不填</span>
|
|
|
+ </NTooltip>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <BaseNumberInput :unit="item.unit" v-model:value="formValue[item.key]"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel isXScroll required title="净购入热力消耗产生的碳排放量">
|
|
|
+ <NFormItem label-placement="top" path="nyyjGrrlZq" label="蒸汽">
|
|
|
+ <BaseNumberInput unit="t/月" v-model:value="formValue.nyyjGrrlZq" @on-input="onInput" name="nyyjGrrlZq"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem label-placement="top" path="nyyjGrrlDyhz" label="对应焓值" required="">
|
|
|
+ <BaseNumberInput unit="KJ/Kg" v-model:value="formValue.nyyjGrrlDyhz" name="nyyjGrrlDyhz" :disabled="disableEnthalpyValue"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel title="固定式能源燃料消耗产生的碳排放量">
|
|
|
+ <template #side>
|
|
|
+ <div class="flex items-center space-x-[14px]">
|
|
|
+ <NSelect v-model:value="selectValue.hsrl" :options="selectCodeSet.hsrlOptions" class="w-[200px]"
|
|
|
+ label-field="dictLabel" value-field="dictCode" />
|
|
|
+ <button class="add-btn space-x-[4px]" @click="handleAddTableRow('energyFirst')">
|
|
|
+ <SvgIcon name="tool-add-symbol"></SvgIcon>
|
|
|
+ <span>添加</span>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <BaseTable :data="tableData.energyFirst" name="energyFirst"
|
|
|
+ @on-remove="(name, index) => removeTable(name, index)">
|
|
|
+ </BaseTable>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel required title="污水处理阶段药剂消耗产生的碳排放量">
|
|
|
+ <template #side>
|
|
|
+ <div class="flex items-center space-x-[14px]">
|
|
|
+ <NSelect v-model:value="selectValue.yjmc" :options="selectCodeSet.yjmcOptions" class="w-[200px]"
|
|
|
+ label-field="dictLabel" value-field="dictCode" />
|
|
|
+ <button class="add-btn space-x-[4px]" @click="handleAddTableRow('energySecond')">
|
|
|
+ <SvgIcon name="tool-add-symbol"></SvgIcon>
|
|
|
+ <span>添加</span>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <BaseTable :data="tableData.energySecond" name="energySecond"
|
|
|
+ @on-remove="(name, index) => removeTable(name, index)"></BaseTable>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ </BaseCard>
|
|
|
+
|
|
|
+ <BaseCard title="污泥处理" sub-title="生化反应总碳排" tips="污泥处理生化反应总碳排模块中,企业涉及的过程对应填写相应数据,不涉及的不填写">
|
|
|
+ <BasePanel isXScroll title="污泥厌氧消化沼气收集管路无意泄露的CH₄或沼气火炬燃烧不充分导致的碳排放">
|
|
|
+ <NFormItem label-placement="top" :path="item.key" :label="item.label"
|
|
|
+ v-for="item, index in inpConfig.sludge.oneBlock" :key="index" required>
|
|
|
+ <BaseNumberInput :unit="item.unit" v-model:value="formValue[item.key]"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel isXScroll title="单独处理污泥厌氧消化过程产生的碳排放量">
|
|
|
+ <NFormItem label-placement="top" :path="item.key" :label="item.label"
|
|
|
+ v-for="item, index in inpConfig.sludge.twoBlock" :key="index">
|
|
|
+ <template #label>
|
|
|
+ <div class="flex items-center space-x-[2px]">
|
|
|
+ <span>{{ item.label }}</span>
|
|
|
+ <span class="w-[14px] h-[14px]" v-if="item.key === 'wnclDdclPfyz'">
|
|
|
+ <NTooltip>
|
|
|
+ <template #trigger>
|
|
|
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"><path fill="none" d="M240 304h32l6-160h-44l6 160z"></path><path d="M256 48C141.31 48 48 141.31 48 256s93.31 208 208 208s208-93.31 208-208S370.69 48 256 48zm20 319.91h-40v-40h40zM272 304h-32l-6-160h44z" fill="currentColor"></path></svg>
|
|
|
+ </template>
|
|
|
+ <span>若未实测,请填写0.01</span>
|
|
|
+ </NTooltip>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <BaseNumberInput :unit="item.unit" v-model:value="formValue[item.key]"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel isXScroll title="污泥好氧发酵过程生化反应的碳排放">
|
|
|
+ <NFormItem label-placement="top" :path="item.key" :label="item.label"
|
|
|
+ v-for="item, index in inpConfig.sludge.threeBlock" :key="index" required>
|
|
|
+ <BaseNumberInput :unit="item.unit" v-model:value="formValue[item.key]"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel isXScroll title="污泥干化焚烧或协同焚烧过程,化石源碳被氧化产生的化石源CO₂碳排放量">
|
|
|
+ <NFormItem label-placement="top" :path="item.key" :label="item.label"
|
|
|
+ v-for="item, index in inpConfig.sludge.fourBlock" :key="index" required>
|
|
|
+ <BaseNumberInput :unit="item.unit" v-model:value="formValue[item.key]"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel title="污泥焚烧过程不完全燃烧产生的CH₄和N₂O的CO₂排放当量">
|
|
|
+ <BaseTable :data="tableData.mudFirst" name="mudFirst" avg-column :options="selectCodeSet.fireOptions">
|
|
|
+ </BaseTable>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel isXScroll title="污泥热解碳化或气化过程化石源CO₂碳排放量">
|
|
|
+ <NFormItem label-placement="top" :path="item.key" :label="item.label"
|
|
|
+ v-for="item, index in inpConfig.sludge.fiveBlock" :key="index" required>
|
|
|
+ <BaseNumberInput :unit="item.unit" v-model:value="formValue[item.key]"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel title="污泥热解碳化或气化过程产生的CH₄和N₂O的CO₂排放当量">
|
|
|
+ <BaseTable :data="tableData.mudSecond" name="mudSecond" avg-column
|
|
|
+ :options="selectCodeSet.reactOptions">
|
|
|
+ </BaseTable>
|
|
|
+ </BasePanel>
|
|
|
+ </BaseCard>
|
|
|
+
|
|
|
+ <BaseCard title="替碳、碳汇" sub-title="替碳、碳汇基础信息填写" tips="替碳、碳汇模块中,企业涉及的过程对应填写相应数据,不涉及的不填写">
|
|
|
+ <BasePanel title="热泵技术-替碳量">
|
|
|
+ <template #side>
|
|
|
+ <div class="flex items-center space-x-[14px]">
|
|
|
+ <NSelect v-model:value="selectValue.gyittOne" :options="selectCodeSet.gyittOptions"
|
|
|
+ class="w-[200px]" label-field="dictLabel" value-field="dictCode" />
|
|
|
+ <button class="add-btn space-x-[4px]" @click="handleAddTableRow('carbonFirst')">
|
|
|
+ <SvgIcon name="tool-add-symbol"></SvgIcon>
|
|
|
+ <span>添加</span>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <BaseTable :data="tableData.carbonFirst" name="carbonFirst"
|
|
|
+ @on-remove="(name, index) => removeTable(name, index)">
|
|
|
+ </BaseTable>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel isXScroll title="光伏-替碳量">
|
|
|
+ <NFormItem label-placement="top" :path="item.key" :label="item.label"
|
|
|
+ v-for="item, index in inpConfig.carbon.oneBlock" :key="index" required>
|
|
|
+ <BaseNumberInput :unit="item.unit" v-model:value="formValue[item.key]"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel title="再生水回用的替碳量(宜按替代的商业供水的取水、生产和输送的碳排放量计算)">
|
|
|
+ <BaseTable :data="tableData.carbonSecond" name="carbonSecond" avg-column
|
|
|
+ :options="selectCodeSet.scgmOptions">
|
|
|
+ </BaseTable>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel title="污泥厌氧消化沼气利用的替碳量">
|
|
|
+ <template #side>
|
|
|
+ <div class="flex items-center space-x-[14px]">
|
|
|
+ <NSelect v-model:value="selectValue.gyittTwo" :options="selectCodeSet.gyittOptions"
|
|
|
+ class="w-[200px]" label-field="dictLabel" value-field="dictCode" />
|
|
|
+ <button class="add-btn space-x-[4px]" @click="handleAddTableRow('carbonThird')">
|
|
|
+ <SvgIcon name="tool-add-symbol"></SvgIcon>
|
|
|
+ <span>添加</span>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <BaseTable :data="tableData.carbonThird" name="carbonThird"
|
|
|
+ @on-remove="(name, index) => removeTable(name, index)">
|
|
|
+ </BaseTable>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel title="污泥焚烧或热解热能利用的替碳量">
|
|
|
+ <template #side>
|
|
|
+ <div class="flex items-center space-x-[14px]">
|
|
|
+ <NSelect v-model:value="selectValue.gyittThree" :options="selectCodeSet.gyittOptions"
|
|
|
+ class="w-[200px]" label-field="dictLabel" value-field="dictCode" />
|
|
|
+ <button class="add-btn space-x-[4px]" @click="handleAddTableRow('carbonFourth')">
|
|
|
+ <SvgIcon name="tool-add-symbol"></SvgIcon>
|
|
|
+ <span>添加</span>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <BaseTable :data="tableData.carbonFourth" name="carbonFourth"
|
|
|
+ @on-remove="(name, index) => removeTable(name, index)">
|
|
|
+ </BaseTable>
|
|
|
+ </BasePanel>
|
|
|
+
|
|
|
+ <BasePanel isXScroll title="污泥经过厌氧、好氧或碳化处理后,产生的替碳量">
|
|
|
+ <NFormItem label-placement="top" :path="item.key" :label="item.label"
|
|
|
+ v-for="item, index in inpConfig.carbon.twoBlock" :key="index" required>
|
|
|
+ <BaseNumberInput :unit="item.unit" v-model:value="formValue[item.key]"></BaseNumberInput>
|
|
|
+ </NFormItem>
|
|
|
+ </BasePanel>
|
|
|
+ </BaseCard>
|
|
|
+ </NForm>
|
|
|
+ </NScrollbar>
|
|
|
+ </div>
|
|
|
+ <template #footer>
|
|
|
+ <div class="w-full space-x-[8px] flex justify-center">
|
|
|
+ <button class="btn btn_primary" @click="onSubmit">提交并核算</button>
|
|
|
+ <!-- <button class="btn btn_default">暂存</button> -->
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </n-drawer-content>
|
|
|
+ </NDrawer>
|
|
|
+ <div>
|
|
|
+
|
|
|
+ <!-- <NInput class="input" :theme-overrides="buttonThemeOverrides"></NInput> -->
|
|
|
+
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.drawer-picker {
|
|
|
+ position: relative;
|
|
|
+}
|
|
|
+
|
|
|
+.custom-input {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ bottom: 0;
|
|
|
+ z-index: 10;
|
|
|
+}
|
|
|
+
|
|
|
+.main-container {
|
|
|
+ height: 100%;
|
|
|
+ padding: 21px 24px;
|
|
|
+ border-radius: 20px;
|
|
|
+ border: 1px solid #FFF;
|
|
|
+ background: linear-gradient(180deg, rgba(238, 253, 255, 0.50) 0%, rgba(231, 243, 252, 0.50) 100%);
|
|
|
+ backdrop-filter: blur(8px);
|
|
|
+
|
|
|
+ .from-wrapper {
|
|
|
+
|
|
|
+ .form-item_inner {
|
|
|
+ padding-top: 16px;
|
|
|
+
|
|
|
+ .inner {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: nowrap;
|
|
|
+ }
|
|
|
+
|
|
|
+ .n-form-item {
|
|
|
+ width: 214px;
|
|
|
+ flex-shrink: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .tabs {
|
|
|
+ @include flex(x, center, center);
|
|
|
+
|
|
|
+ .tab-item {
|
|
|
+ padding: 5px 16px;
|
|
|
+ border-radius: 100px;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+
|
|
|
+ .tab-actvie {
|
|
|
+ color: #2454FF;
|
|
|
+ background: #EBF0FF;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .sub-title_inner {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ padding-bottom: 16px;
|
|
|
+
|
|
|
+ .add-btn {
|
|
|
+ flex-shrink: 0;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ width: 68px;
|
|
|
+ height: 30px;
|
|
|
+ border: 1px solid #2454FF;
|
|
|
+ border-radius: 4px;
|
|
|
+ font-size: 13px;
|
|
|
+ color: #2454FF;
|
|
|
+ }
|
|
|
+
|
|
|
+ .title {
|
|
|
+ width: 368px;
|
|
|
+ height: 30px;
|
|
|
+ padding-left: 10px;
|
|
|
+ border-radius: 4px;
|
|
|
+ background: linear-gradient(90deg, #F6F7F9 0%, #FFFFFF 100%);
|
|
|
+ line-height: 30px;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #1A2029;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/** common css **/
|
|
|
+.btn {
|
|
|
+ padding: 5px 16px;
|
|
|
+ text-align: center;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+ line-height: 22px;
|
|
|
+ border-radius: 4px;
|
|
|
+}
|
|
|
+
|
|
|
+.btn.btn_primary {
|
|
|
+ padding: 6px 16px;
|
|
|
+ background: linear-gradient(270deg, #3BD6E3 0%, #019AFE 100%);
|
|
|
+ color: #FFF;
|
|
|
+}
|
|
|
+
|
|
|
+.btn.btn_default {
|
|
|
+ border: 1px solid #D3D7DD;
|
|
|
+ background-color: #fff;
|
|
|
+ color: #1A2029;
|
|
|
+}
|
|
|
+
|
|
|
+/** reset drawer css**/
|
|
|
+.drawer-wrapper {
|
|
|
+ .n-drawer-content {
|
|
|
+ :deep(.drawer-body) {
|
|
|
+ padding: 20px;
|
|
|
+ background: linear-gradient(180deg, #F3F7FC 0%, #E4EAF7 100%);
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.drawer-header) {
|
|
|
+ padding: 16px !important;
|
|
|
+ border: 0;
|
|
|
+ line-height: 24px;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.drawer-footer) {
|
|
|
+ justify-content: center !important;
|
|
|
+ align-items: center;
|
|
|
+ padding: 12px 24px;
|
|
|
+ border: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|
|
|
+
|
|
|
+<style lang="scss">
|
|
|
+.custom-date-picker {
|
|
|
+
|
|
|
+ .el-input__wrapper,
|
|
|
+ .el-input__wrapper.is-focus {
|
|
|
+ box-shadow: none;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ box-shadow: none;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.drawer-picker {
|
|
|
+ .el-input__wrapper {
|
|
|
+ height: 34px;
|
|
|
+ border-radius: 8px;
|
|
|
+ background: transparent;
|
|
|
+
|
|
|
+ .el-input__prefix {
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ transition: all 0.3s;
|
|
|
+ box-shadow: 0 0 0px 1px rgba(36, 84, 255, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ input::focus {
|
|
|
+ background: red;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .el-input__wrapper.is-focus {
|
|
|
+ box-shadow: 0px 0px 1px 1px rgba(36, 84, 255, 1);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.n-drawer-mask {
|
|
|
+ background-color: rgba(0, 0, 0, .7);
|
|
|
+}
|
|
|
+</style>
|