import { http } from '/nerv-lib/util'; import { group, device } from '/@/api/deviceManage'; import { carbonEmissionFactorLibrary, quickCalculation } from '/@/api/carbonEmissionFactorLibrary'; import { dict } from '/@/api'; import { ref } from 'vue'; const tableCalKeyMap = [ { title: '来源企业', dataIndex: 'linkOrgName', textEllipsis: true, textNumber: 10, }, { title: '设备id', textNumber: 10, dataIndex: 'deviceCode', textEllipsis: true, }, { title: '设备编号', dataIndex: 'deviceNum', textNumber: 10, }, { textNumber: 10, title: '分组名称', dataIndex: 'groupName', }, { title: '设备品牌/型号', textNumber: 10, dataIndex: 'deviceNameType', }, { textNumber: 10, title: '设备状态', dataIndex: 'deviceStatus', customRender: ({ value }) => { return value === '0' ? '启用' : '停用'; }, }, ]; const tableCarbonKeyMap = [ { title: '能源类型', dataIndex: 'energyTypeName', // textEllipsis: true, textNumber: 5, }, { title: '设备id', dataIndex: 'deviceInfoCode', textNumber: 10, }, { title: '设备编号', textNumber: 10, dataIndex: 'deviceName', // textEllipsis: true, }, { textNumber: 5, title: '碳排因子值', dataIndex: 'emissionFactor', }, { title: '设备品牌/型号', textNumber: 10, dataIndex: 'deviceModel', }, { title: '来源企业', textNumber: 10, dataIndex: 'manufacturer', }, { title: '分组名称', textNumber: 10, dataIndex: 'groupName', }, { textNumber: 5, title: '设备状态', dataIndex: 'status', customRender: ({ value }) => { if (value) { if (value === '0') { return '启用'; } else if (value === '1') { return '停用'; } } else { return ''; } }, }, ]; const tableKeyMap = [ { title: '来源企业', dataIndex: 'orgName', }, { title: '节点编号', dataIndex: 'pointNum', }, { title: '节点路径', dataIndex: 'routeName', }, ]; const doWnload = (url) => { const a = document.createElement('a'); document.body.appendChild(a); a.href = encodeURI(url); //设置下载的文件名 // a.download = fileName.value; //触发a标签的点击事件,进行下载 a.click(); }; export const formSchema = [ { field: 'isCreate', component: 'NsCheck', show: false, }, { field: 'isCreatSon', component: 'NsCheck', show: false, }, { field: 'orgId', component: 'NsInput', show: false, }, { field: 'energyType', component: 'NsInput', show: false, }, { field: 'id', component: 'NsInput', show: false, }, { field: 'pid', component: 'NsInput', show: false, }, { label: '节点名称', field: 'pointName', component: 'NsInput', componentProps: { placeholder: '请输入', maxLength: 20, }, rules: [ { required: true, message: '请输入节点名称', }, ], }, { label: '节点类型', field: 'pointType', component: 'NsSelectApi', componentProps: { placeholder: '请选择', api: () => dict({ params: { dicKey: 'COUNT_POINT' } }), // params: { dicKey: 'COUNT_POINT' }, immediate: true, // resultField: 'data.COUNT_POINT', labelField: 'cnValue', valueField: 'dicKey', }, rules: [ { required: true, message: '请输入节点类型', }, ], }, ]; export const editTreeConfig = (orgId) => ({ selectedKeys: ['0-0'], defaultExpandAll: true, api: group.queryEditGroup, params: { orgId }, resultField: 'data.orgInfos', fieldNames: { title: 'orgName', key: 'orgId' }, formConfig: { schemas: [ { field: 'orgName', component: 'NsInput', autoSubmit: true, componentProps: { placeholder: '请输入企业名称', }, }, ], }, }); export const editCalTreeConfig = (orgId) => ({ selectedKeys: ['0-0'], defaultExpandAll: true, api: group.queryEditCompute, params: { orgId }, resultField: 'data.orgInfos', fieldNames: { title: 'orgName', key: 'orgId' }, formConfig: { schemas: [ { field: 'orgName', component: 'NsInput', autoSubmit: true, componentProps: { placeholder: '请输入企业名称', }, }, ], }, }); export const treeConfig = (orgId, editCarbonEquipmentRef, tableRef) => { return { defaultExpandAll: true, header: { icon: 'orgLink', title: '能耗分组', }, params: { orgId }, api: group.queryDeviceGroupTree, transform: (data) => { return [{ pointName: '全部', id: 'all', selectable: false, children: data }]; }, formConfig: { callList: true, // 刷新列表 // defaultSelection: true, //树默认选择第一个 schemas: [ { field: 'energyType', label: '', component: 'NsSelectApi', autoSubmit: true, componentProps: { api: () => dict({ params: { dicKey: 'ENERGY_TYPE' } }), // params: { dicKey: 'ENERGY_TYPE' }, immediate: true, // resultField: 'data.ENERGY_TYPE', labelField: 'cnValue', valueField: 'dicKey', placeholder: '请选择能耗种类', autoSelectFirst: true, onSelect: async (cur, record) => { editCarbonEquipmentRef.value.changeEnergyType(cur); tableRef.value?.nsTableRef.clearCheck(); tableRef.value?.nsTableRef.reload(); // value.value = cur; }, }, }, { field: 'pointName', label: '', component: 'NsInput', autoSubmit: true, componentProps: { placeholder: '请输入节点名称', }, }, ], }, }; }; export const tableConfig = (el, elGroup, elFormula, defaultParams) => { return { title: '点位信息', api: group.queryGroupPage, params: defaultParams.value, headerActions: [ { label: '编辑', name: 'GroupEdit', type: 'primary', dynamicDisabled: () => !defaultParams.value?.id, handle: (a, b) => { el.value.toggle(); }, }, { label: '批量删除', name: 'GroupDelete', type: 'primary', dynamicDisabled: (data: any) => { return data.list.length === 0; }, dynamicParams: { linkIds: 'linkId[]' }, confirm: true, isClearCheck: true, isReload: true, api: group.delGroupList, }, { label: '批量导出', name: 'GroupPointExports', type: 'primary', dynamicDisabled: (data: any) => { return data.list.length === 0; }, extra: { xlsxMap: tableKeyMap, xlsxName: '分组信息YYYY-MM-DD', }, }, { label: '批量导入', name: 'GroupPointImport', type: 'primary', extra: { // api: props.postImportApi, // 导入接口名 title: '设备信息', // 弹窗title templateName: 'whiteListUser', // 所使用的文件名称 indexName: '设备id', // 匹配类型字段 message: [ { label: '1、若必填项未填写,则不能进行导入操作' }, { label: `2、当重复时,则更新数据。` }, { label: '3、数据将从模版的第五行进行导入。' }, { label: '4、文件导入勿超过5MB。' }, ], }, }, { label: '模板下载', name: 'GroupTempDownload', type: 'primary', handle: () => { // http.get('/asset/file/whiteListUser.xlsx'); doWnload('/hx-ai-intelligent/asset/file/whiteListUser.xlsx'); }, }, ], columns: tableKeyMap, columnActions: { title: '操作', actions: [ { label: '删除', name: 'GroupDelete', dynamicParams: { linkIds: 'linkId[]' }, confirm: true, isClearCheck: true, isReload: true, api: group.delGroupList, }, ], }, formConfig: { schemas: [ { field: 'orgName', component: 'NsSelectApi', defaultParams: defaultParams.value, componentProps: { placeholder: '请选择公司', mode: 'multiple', api: group.dropGroupFilter, resultField: 'data', params: { filterField: 'ORG' }, labelField: 'orgName', valueField: 'orgId', filterOption: (input: string, option: any) => { return option.deviceName.toLowerCase().indexOf(input.toLowerCase()) >= 0; }, showSearch: true, dropdownReload: true, allowClear: true, }, }, { field: 'pointNum', component: 'NsInput', componentProps: { placeholder: '请输入节点编号', }, }, ], }, // pagination: { pageSizeOptions: false }, rowKey: 'id', }; }; export const tableConfigCal = ( el, elGroup, elFormula, defaultParams, isCarbon, editCarbonEquipmentRef, setFactorRef, ) => { // 计算节点 return { title: '点位信息', api: isCarbon ? group.getCarbonGroupList : group.queryGroupInfoPage, params: defaultParams.value, headerActions: [ { label: '编辑', name: 'GroupPointEdit', type: 'primary', handle: async (a, b) => { // if (isCarbon) { editCarbonEquipmentRef.value.toggle(); // } else { // el.value.toggle(); // } }, }, { label: '关联因子值', name: 'SetFactor', type: 'primary', dynamicDisabled: (data: any) => { return data.list.length === 0; }, ifShow: (data: any) => { return isCarbon; }, handle: ({ list }) => { // 过滤出 id 大于 0 的项 const filteredList = list.filter(({ id }) => id > 0); // 提取出 id 值 const ids = filteredList.map(({ id }) => id); setFactorRef.value.toggle(ids); }, }, { label: '批量删除', name: 'GroupPointDelete', type: 'primary', dynamicDisabled: (data: any) => { return data.list.length === 0; }, dynamicParams: isCarbon ? { deviceInfoCodeList: 'id[]', } : { ids: 'id[]', }, confirm: true, isReload: true, isClearCheck: true, api: isCarbon ? group.deleteCarbonDevice : group.delComputeList, }, { label: '批量导出', name: 'GroupPointExports', type: 'primary', dynamicDisabled: (data: any) => { return data.list.length === 0; }, extra: { xlsxMap: isCarbon ? tableCarbonKeyMap : tableCalKeyMap, xlsxName: '分组信息YYYY-MM-DD', }, }, { label: '批量导入', name: 'GroupPointImport', type: 'primary', extra: { // api: props.postImportApi, // 导入接口名 title: '设备信息', // 弹窗title templateName: 'whiteListUser', // 所使用的文件名称 indexName: '设备id', // 匹配类型字段 message: [ { label: '1、若必填项未填写,则不能进行导入操作' }, { label: `2、当重复时,则更新数据。` }, { label: '3、数据将从模版的第五行进行导入。' }, { label: '4、文件导入勿超过5MB。' }, ], }, }, { label: '模板下载', name: 'GroupTempDownload', type: 'primary', handle: () => { // http.get('/asset/file/whiteListUser.xlsx'); doWnload('/hx-ai-intelligent/asset/file/whiteListUser.xlsx'); }, }, { label: '批量分组', name: 'GroupBatchGroup', type: 'primary', dynamicDisabled: (data: any) => { return data.list.length === 0; }, handle: ({ list }) => { const ids = list.map(({ id }) => id); defaultParams.value['saveDeviceInfoIds'] = ids; elGroup.value.toggle(); }, }, { label: '公式编辑', name: 'GroupFormulaEdit', type: 'primary', handle: () => { elFormula.value.toggle(); }, }, ], scroll: { x: 1400 }, columns: isCarbon ? tableCarbonKeyMap : tableCalKeyMap, columnActions: { title: '操作', actions: [ { label: '关联因子', // label: (record) => { // // 根据record的某个字段值判断显示'关联因子'或'修改因子' // return record.emissionFactor ? '修改因子' : '关联因子'; // }, name: 'SetFactor', ifShow: (record) => { // 这里根据record的某个字段值判断是否禁用删除按钮 return isCarbon && record.id >= 0 && !record.emissionFactor; }, handle: (row) => { setFactorRef.value.toggle([row.id]); }, }, { label: '修改关联', // label: (record) => { // // 根据record的某个字段值判断显示'关联因子'或'修改因子' // return record.emissionFactor ? '修改因子' : '关联因子'; // }, name: 'SetFactor', ifShow: (record) => { // 这里根据record的某个字段值判断是否禁用删除按钮 return isCarbon && record.id >= 0 && record.emissionFactor; }, handle: (row) => { setFactorRef.value.toggle([row.id]); }, }, { label: '删除', name: 'GroupPointDelete', ifShow: (record) => { // 这里根据record的某个字段值判断是否禁用删除按钮 return record.id >= 0; }, dynamicParams: isCarbon ? { deviceInfoCodeList: 'id[]', } : { ids: 'id[]', }, confirm: true, isReload: true, isClearCheck: true, api: isCarbon ? group.deleteCarbonDevice : group.delComputeList, }, ], }, formConfig: { schemas: [ { field: 'orgIds', component: 'NsSelectApi', defaultParams: defaultParams.value, componentProps: { placeholder: '请选择公司', mode: 'multiple', api: group.dropGroupInfoFilter, resultField: 'data', params: { filterField: 'ORG' }, labelField: 'orgName', valueField: 'orgId', filterOption: (input: string, option: any) => { return option.deviceName.toLowerCase().indexOf(input.toLowerCase()) >= 0; }, showSearch: true, dropdownReload: true, allowClear: true, }, }, { field: 'deviceCode', component: 'NsInput', componentProps: { placeholder: '请输入设备id', }, }, { field: 'deviceNum', component: 'NsInput', componentProps: { placeholder: '请输入设备编号', }, }, { field: 'deviceStatus', component: 'NsSelectApi', componentProps: { placeholder: '请选择设备状态', api: () => dict({ params: { dicKey: 'DEVICE_STATUS' } }), immediate: true, labelField: 'cnValue', valueField: 'dicKey', }, }, { field: 'deviceNameType', component: 'NsSelectApi', defaultParams: defaultParams.value, componentProps: { placeholder: '请选择设备型号', api: (params: any) => { return http.post(group.dropGroupInfoFilter, params).then((res: any) => { const result = [...new Set(res.data)]; return { data: result }; }); }, resultField: 'data', params: { filterField: 'DEVICE_TYPE' }, // labelField: 'orgName', // valueField: 'orgId', filterOption: (input: string, option: any) => { return option.deviceName.toLowerCase().indexOf(input.toLowerCase()) >= 0; }, showSearch: true, dropdownReload: true, allowClear: true, }, }, { field: 'groupName', component: 'NsInput', componentProps: { placeholder: '请输入分组名称', }, }, ], }, pagination: isCarbon ? false : true, rowKey: 'id', rowSelection: { checkStrictly: false }, }; }; export const editCarbonEquipmentConfig = (orgId, props) => { return ref({ title: '设备信息', api: device.queryDevicePage, params: { orgId }, treeConfig: { header: { icon: 'deviceType', title: '设备类别', }, params: { orgId }, dynamicParams: { deviceCode: 'code' }, defaultExpandAll: true, api: device.queryDeviceTree, fieldNames: { title: 'deviceType', key: 'code' }, formConfig: { schemas: [ { field: 'deviceType', label: '设备名称', component: 'NsInput', autoSubmit: true, componentProps: { placeholder: '请输入设备类型', }, }, ], }, }, // rowSelection: null, rowSelection: true, // scroll: { x: 2000 }, columns: [ { title: '设备名称', dataIndex: 'deviceName', }, { title: '设备型号', dataIndex: 'deviceModel', }, { title: 'SN码', dataIndex: 'snCode', textNumber: 5, textEllipsis: true, }, { title: '设备一级区域', dataIndex: 'device1Area', textWidth: 88, // width: 130, textEllipsis: true, }, { title: '设备二级区域', dataIndex: 'device2Area', textWidth: 88, // width: 130, textEllipsis: true, }, { title: '设备详细位置', dataIndex: 'deviceAddress', textNumber: 5, textEllipsis: true, }, ], formConfig: { schemas: [ { field: 'energyType', label: '', component: 'NsSelectApi', // autoSubmit: true, defaultValue: props.params.energyType, componentProps: { api: () => dict({ params: { dicKey: 'ENERGY_TYPE' } }), // params: { dicKey: 'ENERGY_TYPE' }, immediate: true, // resultField: 'data.ENERGY_TYPE', labelField: 'cnValue', valueField: 'dicKey', placeholder: '请选择能耗种类', // autoSelectFirst: true, }, dynamicDisabled: (data: any) => { return props.params.energyType !== 'CARBON_EMISSIONS'; }, }, { field: 'areas', label: '设备区域', component: 'NsCascader', format: (record) => { console.log(record); return record?.reduce( (pre, cur) => { const len = cur?.length - 1; pre[len].push(cur[len]); return pre; }, [[], []], ); }, fieldMap: ['area1', 'area2'], componentProps: { placeholder: '请选择设备区域', multiple: true, loadData: (selectedOptions, options) => { const targetOption = selectedOptions[selectedOptions.length - 1]; if (!selectedOptions.length) { http.post(device.dropArea, { orgId, filterField: 'DEVICE_AREA' }).then((res) => { options.value = res.data?.map((item) => { return { label: item, value: item, children: [], isLeaf: false }; }); }); } const value = targetOption?.value; if (targetOption) { targetOption.loading = true; http .post(device.dropArea, { device1Area: value, orgId, filterField: 'DEVICE_AREA' }) .then((res) => { targetOption.loading = false; targetOption.children = res.data?.map((item) => { return { label: item, value: item, children: [], isLeaf: true }; }); }); } }, }, }, { field: 'deviceName', label: '设备名称', component: 'NsSelectApi', componentProps: { placeholder: '请选择设备名称', api: (params) => { return http.post(device.dropArea, params).then((res) => { const result = res.data?.reduce((pre, cur) => { !pre.includes(cur.deviceName) && pre.push(cur.deviceName); return pre; }, []); return { data: result }; }); }, resultField: 'data', params: { orgId, filterField: 'DEVICE_NAME_FACTORY' }, // labelField: 'deviceName', // valueField: 'deviceName', filterOption: (input: string, option: any) => { return option.deviceName?.toLowerCase().indexOf(input.toLowerCase()) >= 0; }, showSearch: true, immediate: true, dropdownReload: true, allowClear: true, }, }, ], params: {}, }, pagination: true, rowKey: 'deviceInfoCode', }); }; export const setFactorConfig = (orgId) => { return ref({ title: '排放因子库', // api: carbonEmissionFactorLibrary.getTableList, api: quickCalculation.queryCarbonEmissionPage, params: { orgId, pageNum: 1, pageSize: 9999 }, treeConfig: { header: { icon: 'deviceType', title: '因子分类', }, params: { orgId }, dynamicParams: { energyType: 'id' }, defaultExpandAll: true, // api: carbonEmissionFactorLibrary.getCarbonFactorTree, api: quickCalculation.carbonQuickTree, fieldNames: { title: 'energyType', key: 'id' }, formConfig: { schemas: [ { field: 'deviceType', label: '设备名称', component: 'NsInput', autoSubmit: true, componentProps: { placeholder: '请输入关键字', }, }, ], }, }, // rowSelection: null, rowSelection: { type: 'radio' }, // scroll: { x: 2000 }, columns: [ { title: '序号', textNumber: 2, dataIndex: 'address', customRender: (text: any) => { return text.index + 1; }, }, { title: '因子值', dataIndex: 'emissionFactors', textNumber: 3, }, { title: '计量单位', dataIndex: 'carbonEmissionSuffix', textNumber: 4, textEllipsis: true, }, { title: '更新时间', dataIndex: 'updateTime', textWidth: 88, // width: 130, textEllipsis: true, }, { title: '启用时间', dataIndex: 'startTime', textWidth: 88, // width: 130, textEllipsis: true, }, { title: '结束时间', dataIndex: 'endTime', textNumber: 5, textEllipsis: true, }, { title: '数据来源', dataIndex: 'dataSources', textNumber: 5, textEllipsis: true, }, ], // formConfig: { // schemas: [ // { // field: 'areas', // label: '设备区域', // component: 'NsCascader', // format: (record) => { // console.log(record); // return record?.reduce( // (pre, cur) => { // const len = cur?.length - 1; // pre[len].push(cur[len]); // return pre; // }, // [[], []], // ); // }, // fieldMap: ['area1', 'area2'], // componentProps: { // placeholder: '请选择设备区域', // multiple: true, // loadData: (selectedOptions, options) => { // const targetOption = selectedOptions[selectedOptions.length - 1]; // if (!selectedOptions.length) { // http.post(device.dropArea, { orgId, filterField: 'DEVICE_AREA' }).then((res) => { // options.value = res.data?.map((item) => { // return { label: item, value: item, children: [], isLeaf: false }; // }); // }); // } // const value = targetOption?.value; // if (targetOption) { // targetOption.loading = true; // http // .post(device.dropArea, { device1Area: value, orgId, filterField: 'DEVICE_AREA' }) // .then((res) => { // targetOption.loading = false; // targetOption.children = res.data?.map((item) => { // return { label: item, value: item, children: [], isLeaf: true }; // }); // }); // } // }, // }, // }, // { // field: 'deviceName', // label: '设备名称', // component: 'NsSelectApi', // componentProps: { // placeholder: '请选择设备名称', // api: (params) => { // return http.post(device.dropArea, params).then((res) => { // const result = res.data?.reduce((pre, cur) => { // !pre.includes(cur.deviceName) && pre.push(cur.deviceName); // return pre; // }, []); // return { data: result }; // }); // }, // resultField: 'data', // params: { orgId, filterField: 'DEVICE_NAME_FACTORY' }, // // labelField: 'deviceName', // // valueField: 'deviceName', // filterOption: (input: string, option: any) => { // return option.deviceName?.toLowerCase().indexOf(input.toLowerCase()) >= 0; // }, // showSearch: true, // immediate: true, // dropdownReload: true, // allowClear: true, // }, // }, // ], // params: {}, // }, // pagination: { pageSizeOptions: false }, rowKey: 'id', }); };