Browse Source

Merge branch 'master' of ssh://www.yixzm.cn:22022/Dim5-ideal/bj-maritime-dcds-web

Luka 4 days ago
parent
commit
a09f8e02fb

+ 201 - 201
src/router/index.ts

@@ -24,219 +24,219 @@ import Layout from '@/layout/index.vue';
   }
  */
 declare module 'vue-router' {
-    interface RouteMeta {
-        hidden?: boolean;
-        title?: string;
-        icon?: string;
-        elSvgIcon?: string;
-        permissions?: string[];
-    }
-    interface _RouteRecordBase {
-        hidden?: boolean;
-        parentPath?: string;
-        permissions?: string[];
-    }
-    interface _RouteLocationBase {
-        title?: string;
-    }
+	interface RouteMeta {
+		hidden?: boolean;
+		title?: string;
+		icon?: string;
+		elSvgIcon?: string;
+		permissions?: string[];
+	}
+	interface _RouteRecordBase {
+		hidden?: boolean;
+		parentPath?: string;
+		permissions?: string[];
+	}
+	interface _RouteLocationBase {
+		title?: string;
+	}
 }
 
 // 公共路由
 export const constantRoutes: RouteRecordRaw[] = [
-    {
-        path: '/redirect',
-        component: Layout,
-        hidden: true,
-        children: [
-            {
-                path: '/redirect/:path(.*)',
-                component: () => import('@/views/redirect/index.vue'),
-            },
-        ],
-    },
-    {
-        path: '/login',
-        component: () => import('@/views/login.vue'),
-        hidden: true,
-    },
-    {
-        path: '/register',
-        component: () => import('@/views/register.vue'),
-        hidden: true,
-    },
-    {
-        path: '/:pathMatch(.*)*',
-        component: () => import('@/views/error/404.vue'),
-        hidden: true,
-    },
-    {
-        path: '/401',
-        component: () => import('@/views/error/401.vue'),
-        hidden: true,
-    },
-    {
-        path: '',
-        component: Layout,
-        redirect: '/index',
-        children: [
-            {
-                path: '/index',
-                component: () => import('@/views/index.vue'),
-                name: 'index',
-                meta: { title: '首页', activeMenu: '/index', icon: 'user' },
-            },
-        ],
-    },
-    {
-        path: '/user',
-        component: Layout,
-        hidden: true,
-        redirect: 'noredirect',
-        children: [
-            {
-                path: 'profile',
-                component: () => import('@/views/system/user/profile/index.vue'),
-                name: 'Profile',
-                meta: { title: '个人中心', icon: 'user' },
-            },
-        ],
-    },
-    // TODO 临时路由建立,仅供静态页面搭建使用
-    {
-        path: '/illegalInformation',
-        component: Layout,
-        children: [
-            {
-                path: 'address',
-                component: () => import('@/views/addressBook/index.vue'),
-                name: 'address',
-                meta: { title: '违法信息通报通讯录', icon: 'user' },
-            },
-        ],
-    },
-    {
-        path: '/matters',
-        component: Layout,
-        children: [
-            {
-                path: 'notification',
-                component: () => import('@/views/notificationListManage/index.vue'),
-                name: 'notification',
-                meta: { title: '违法信息通报事项清单管理', icon: 'user' },
-            },
-        ],
-    },
-    {
-        path: '/illegalSwitch',
-        component: Layout,
-        children: [
-            {
-                path: 'switch',
-                component: () => import('@/views/illegalInfoSwitch/index.vue'),
-                name: 'switch',
-                meta: { title: '违法信息发布和关闭管理', icon: 'user' },
-            },
-        ],
-    },
-    {
-        path: '/notificationListManage',
-        component: Layout,
-        children: [
-            {
-                path: 'notificationList',
-                component: () => import('@/views/notificationListManage/index.vue'),
-                name: 'notificationList',
-                meta: { title: '信息处置管理', icon: 'user' },
-            },
-        ],
-    },
+	{
+		path: '/redirect',
+		component: Layout,
+		hidden: true,
+		children: [
+			{
+				path: '/redirect/:path(.*)',
+				component: () => import('@/views/redirect/index.vue'),
+			},
+		],
+	},
+	{
+		path: '/login',
+		component: () => import('@/views/login.vue'),
+		hidden: true,
+	},
+	{
+		path: '/register',
+		component: () => import('@/views/register.vue'),
+		hidden: true,
+	},
+	{
+		path: '/:pathMatch(.*)*',
+		component: () => import('@/views/error/404.vue'),
+		hidden: true,
+	},
+	{
+		path: '/401',
+		component: () => import('@/views/error/401.vue'),
+		hidden: true,
+	},
+	{
+		path: '',
+		component: Layout,
+		redirect: '/index',
+		children: [
+			{
+				path: '/index',
+				component: () => import('@/views/index.vue'),
+				name: 'index',
+				meta: { title: '首页', activeMenu: '/index', icon: 'user' },
+			},
+		],
+	},
+	{
+		path: '/user',
+		component: Layout,
+		hidden: true,
+		redirect: 'noredirect',
+		children: [
+			{
+				path: 'profile',
+				component: () => import('@/views/system/user/profile/index.vue'),
+				name: 'Profile',
+				meta: { title: '个人中心', icon: 'user' },
+			},
+		],
+	},
+	// TODO 临时路由建立,仅供静态页面搭建使用
+	{
+		path: '/illegalInformation',
+		component: Layout,
+		children: [
+			{
+				path: 'address',
+				component: () => import('@/views/addressBook/index.vue'),
+				name: 'address',
+				meta: { title: '违法信息通报通讯录', icon: 'user' },
+			},
+		],
+	},
+	{
+		path: '/matters',
+		component: Layout,
+		children: [
+			{
+				path: 'notification',
+				component: () => import('@/views/notificationListManage/index.vue'),
+				name: 'notification',
+				meta: { title: '违法信息通报事项清单管理', icon: 'user' },
+			},
+		],
+	},
+	{
+		path: '/illegalSwitch',
+		component: Layout,
+		children: [
+			{
+				path: 'switch',
+				component: () => import('@/views/illegalInfoSwitch/index.vue'),
+				name: 'switch',
+				meta: { title: '违法信息发布和关闭管理', icon: 'user' },
+			},
+		],
+	},
+	{
+		path: '/notificationListManage',
+		component: Layout,
+		children: [
+			{
+				path: 'notificationList',
+				component: () => import('@/views/InformationDisposalManage/index.vue'),
+				name: 'notificationList',
+				meta: { title: '信息处置管理', icon: 'user' },
+			},
+		],
+	},
 ];
 
 // 动态路由,基于用户权限动态去加载
 export const dynamicRoutes: RouteRecordRaw[] = [
-    {
-        path: '/system/user-auth',
-        component: Layout,
-        hidden: true,
-        permissions: ['system:user:edit'],
-        children: [
-            {
-                path: 'role/:userId(\\d+)',
-                component: () => import('@/views/system/user/authRole.vue'),
-                name: 'AuthRole',
-                meta: { title: '分配角色', activeMenu: '/system/user' },
-            },
-        ],
-    },
-    {
-        path: '/system/role-auth',
-        component: Layout,
-        hidden: true,
-        permissions: ['system:role:edit'],
-        children: [
-            {
-                path: 'user/:roleId(\\d+)',
-                component: () => import('@/views/system/role/authUser.vue'),
-                name: 'AuthUser',
-                meta: { title: '分配用户', activeMenu: '/system/role' },
-            },
-        ],
-    },
-    {
-        path: '/system/dict-data',
-        component: Layout,
-        hidden: true,
-        permissions: ['system:dict:list'],
-        children: [
-            {
-                path: 'index/:dictId(\\d+)',
-                component: () => import('@/views/system/dict/data.vue'),
-                name: 'Data',
-                meta: { title: '字典数据', activeMenu: '/system/dict' },
-            },
-        ],
-    },
-    {
-        path: '/monitor/job-log',
-        component: Layout,
-        hidden: true,
-        permissions: ['monitor:job:list'],
-        children: [
-            {
-                path: 'index/:jobId(\\d+)',
-                component: () => import('@/views/monitor/job/log.vue'),
-                name: 'JobLog',
-                meta: { title: '调度日志', activeMenu: '/monitor/job' },
-            },
-        ],
-    },
+	{
+		path: '/system/user-auth',
+		component: Layout,
+		hidden: true,
+		permissions: ['system:user:edit'],
+		children: [
+			{
+				path: 'role/:userId(\\d+)',
+				component: () => import('@/views/system/user/authRole.vue'),
+				name: 'AuthRole',
+				meta: { title: '分配角色', activeMenu: '/system/user' },
+			},
+		],
+	},
+	{
+		path: '/system/role-auth',
+		component: Layout,
+		hidden: true,
+		permissions: ['system:role:edit'],
+		children: [
+			{
+				path: 'user/:roleId(\\d+)',
+				component: () => import('@/views/system/role/authUser.vue'),
+				name: 'AuthUser',
+				meta: { title: '分配用户', activeMenu: '/system/role' },
+			},
+		],
+	},
+	{
+		path: '/system/dict-data',
+		component: Layout,
+		hidden: true,
+		permissions: ['system:dict:list'],
+		children: [
+			{
+				path: 'index/:dictId(\\d+)',
+				component: () => import('@/views/system/dict/data.vue'),
+				name: 'Data',
+				meta: { title: '字典数据', activeMenu: '/system/dict' },
+			},
+		],
+	},
+	{
+		path: '/monitor/job-log',
+		component: Layout,
+		hidden: true,
+		permissions: ['monitor:job:list'],
+		children: [
+			{
+				path: 'index/:jobId(\\d+)',
+				component: () => import('@/views/monitor/job/log.vue'),
+				name: 'JobLog',
+				meta: { title: '调度日志', activeMenu: '/monitor/job' },
+			},
+		],
+	},
 
-    {
-        path: '/tool/gen-edit',
-        component: Layout,
-        hidden: true,
-        permissions: ['tool:gen:edit'],
-        children: [
-            {
-                path: 'index/:tableId(\\d+)',
-                component: () => import('@/views/tool/gen/editTable.vue'),
-                name: 'GenEdit',
-                meta: { title: '修改生成配置', activeMenu: '/tool/gen' },
-            },
-        ],
-    },
+	{
+		path: '/tool/gen-edit',
+		component: Layout,
+		hidden: true,
+		permissions: ['tool:gen:edit'],
+		children: [
+			{
+				path: 'index/:tableId(\\d+)',
+				component: () => import('@/views/tool/gen/editTable.vue'),
+				name: 'GenEdit',
+				meta: { title: '修改生成配置', activeMenu: '/tool/gen' },
+			},
+		],
+	},
 ];
 
 const router = createRouter({
-    history: createWebHistory(),
-    routes: constantRoutes,
-    scrollBehavior(to, from, savedPosition) {
-        if (savedPosition) {
-            return savedPosition;
-        } else {
-            return { top: 0 };
-        }
-    },
+	history: createWebHistory(),
+	routes: constantRoutes,
+	scrollBehavior(to, from, savedPosition) {
+		if (savedPosition) {
+			return savedPosition;
+		} else {
+			return { top: 0 };
+		}
+	},
 });
 
 export default router;

+ 441 - 0
src/views/InformationDisposalManage/components/detail.vue

@@ -0,0 +1,441 @@
+<template>
+    <div class="modal">
+        <el-dialog v-model="dialogVisible" :title="dialogTitle" :width="modalConfig.dialogWidth || '40%'" center
+            @close="handleExcel(ruleFormRef)" :close-on-click-modal="false">
+            <div class="form">
+                <el-form ref="ruleFormRef" :rules="modalConfig.formRules" :model="formData"
+                    :label-width="modalConfig.labelWidth || '100px'" size="large">
+                    <template v-for="item in modalConfig.formItems" :key="item.prop">
+                        <el-form-item :label="item.label" :prop="item.prop">
+                            <template v-if="item.type === 'input'">
+                                <el-input :disabled="item.disabled" v-model="formData[item.prop]"
+                                    :placeholder="item.placeholder" />
+                            </template>
+                            <template v-if="item.type === 'number'">
+                                <el-input v-model="formData[item.prop]" type="number" :min="0" :max="999999999999"
+                                    :disabled="item.disabled" :placeholder="item.placeholder"
+                                    @blur="onBlur(formData[item.prop], item.prop, item.numberType)" />
+                            </template>
+                            <template v-if="item.type === 'select'">
+                                <el-select v-model="formData[item.prop]" :placeholder="item.placeholder"
+                                    style="width: 100%" :disabled="item.disabled">
+                                    <template v-for="(val, index) in item.options" :key="index">
+                                        <el-option :value="val.value" :label="val.label" />
+                                    </template>
+                                </el-select>
+                            </template>
+                            <template v-if="item.type === 'date-picker'">
+                                <el-date-picker :type="item.dateType || 'daterange'" range-separator="-"
+                                    start-placeholder="开始时间" end-placeholder="结束时间" v-model="formData[item.prop]"
+                                    :disabled="item.disabled" />
+                            </template>
+                            <!-- 关联部门 -->
+                            <template v-if="item.type === 'deptId'">
+                                <el-tree-select v-model="formData.deptId" :data="deptOptions"
+                                    @change="dapartTreeChange(formData.deptId)"
+                                    :props="{ value: 'deptId', label: 'deptName', children: 'children' }"
+                                    value-key="deptId" placeholder="选择上级部门" style="width: 100%" check-strictly
+                                    clearable />
+                            </template>
+                            <!-- 能源单价标志 -->
+                            <template v-if="item.type === 'unitPriceSign'">
+                                <el-radio-group v-model="formData.unitPriceSign"
+                                    @change="unitPriceChange(formData.unitPriceSign)">
+                                    <el-radio v-for="item in unitPriceOptions" :value="item.value"
+                                        :label="item.value">{{ item.label }}</el-radio>
+                                </el-radio-group>
+                            </template>
+                            <!-- 能源列表 -->
+                            <template v-if="item.type === 'energyList'">
+                                <!-- 能源单价标志为否的时候 -->
+                                <el-tabs v-if="formData.unitPriceSign === '2'" v-model="customEnergy" type="card"
+                                    class="demo-tabs">
+                                    <el-tab-pane v-for="item in formData.energyList" :key="item.energyUnitPriceId"
+                                        :label="item.energyName" :name="item.energyUnitPriceId">
+                                        <!-- <el-input
+                                            v-model="item.valleyValueUnitPrice"
+                                            placeholder="请输入谷值单价"
+                                            type="number"
+                                            :min="0"
+                                            :max="999999999999"
+                                        >
+                                            <template #prepend>谷值单价(元)</template>
+</el-input>
+<el-input v-model="item.peakUnitPrice" placeholder="请输入峰值单价" type="number" :min="0" :max="999999999999">
+    <template #prepend>峰值单价(元)</template>
+</el-input> -->
+                                        <el-input v-model="item.averageUnitPrice" placeholder="请输入平均单价" type="number"
+                                            :min="0" :max="999999999999">
+                                            <template #prepend>平段单价(元)</template>
+                                        </el-input>
+                                    </el-tab-pane>
+                                </el-tabs>
+
+                                <!-- 能源单价标志为是的时候 -->
+                                <el-tabs v-else v-model="initEnergy" type="card" class="demo-tabs">
+                                    <el-tab-pane v-for="item in initEnergyList" :key="item.energyUnitPriceId"
+                                        :label="item.energyName" :name="item.energyUnitPriceId">
+                                        <!-- <el-input
+                                            v-model="item.valleyValueUnitPrice"
+                                            placeholder="请输入谷值单价"
+                                            :disabled="true"
+                                        >
+                                            <template #prepend>谷值单价(元)</template>
+                                        </el-input>
+                                        <el-input v-model="item.peakUnitPrice" placeholder="请输入峰值单价" :disabled="true">
+                                            <template #prepend>峰值单价(元)</template>
+                                        </el-input> -->
+                                        <el-input v-model="item.averageUnitPrice" placeholder="请输入平均单价"
+                                            :disabled="true">
+                                            <template #prepend>平段单价(元)</template>
+                                        </el-input>
+                                    </el-tab-pane>
+                                </el-tabs>
+                            </template>
+                            <!-- 计算公式 -->
+                            <template v-if="item.type === 'calculationFormulaName'">
+                                <Formula :dictType="dictType" @getValue="getValue"></Formula>
+                            </template>
+                            <!-- 电能耗系统ID(加) -->
+                            <template v-if="item.type === 'energyElectricIds'">
+                                <el-select v-model="formData[item.prop]" multiple filterable remote reserve-keyword
+                                    :disabled="item.disabled" style="width: 100%">
+                                    <el-option v-for="item in elecEnerty" :key="item.value" :label="item.label"
+                                        :value="item.value" />
+                                </el-select>
+                            </template>
+                            <!-- 电能耗系统ID(减) -->
+                            <template v-if="item.type === 'energyElectricIdsMin'">
+                                <el-select v-model="formData[item.prop]" multiple filterable remote reserve-keyword
+                                    :disabled="item.disabled" style="width: 100%">
+                                    <el-option v-for="item in elecEnerty" :key="item.value" :label="item.label"
+                                        :value="item.value" />
+                                </el-select>
+                            </template>
+                            <!-- 气能耗系统ID(加) -->
+                            <template v-if="item.type === 'energyGasIds'">
+                                <el-select v-model="formData[item.prop]" multiple filterable remote reserve-keyword
+                                    :disabled="item.disabled" style="width: 100%">
+                                    <el-option v-for="item in gasEnerty" :key="item.value" :label="item.label"
+                                        :value="item.value" />
+                                </el-select>
+                            </template>
+                            <!-- 气能耗系统ID(减) -->
+                            <template v-if="item.type === 'energyGasIdsMin'">
+                                <el-select v-model="formData[item.prop]" multiple filterable remote reserve-keyword
+                                    :disabled="item.disabled" style="width: 100%">
+                                    <el-option v-for="item in gasEnerty" :key="item.value" :label="item.label"
+                                        :value="item.value" />
+                                </el-select>
+                            </template>
+                            <!-- 水能耗系统ID(加) -->
+                            <template v-if="item.type === 'energyWaterIds'">
+                                <el-select v-model="formData[item.prop]" multiple filterable remote reserve-keyword
+                                    :disabled="item.disabled" style="width: 100%">
+                                    <el-option v-for="item in waterEnerty" :key="item.value" :label="item.label"
+                                        :value="item.value" />
+                                </el-select>
+                            </template>
+                            <!-- 水能耗系统ID(减) -->
+                            <template v-if="item.type === 'energyWaterIdsMin'">
+                                <el-select v-model="formData[item.prop]" multiple filterable remote reserve-keyword
+                                    :disabled="item.disabled" style="width: 100%">
+                                    <el-option v-for="item in waterEnerty" :key="item.value" :label="item.label"
+                                        :value="item.value" />
+                                </el-select>
+                            </template>
+                        </el-form-item>
+                    </template>
+                </el-form>
+            </div>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button @click="handleExcel(ruleFormRef)">取消</el-button>
+                    <el-button type="primary" @click="handleConfirmClick(ruleFormRef)">确定</el-button>
+                    <slot name="button"></slot>
+                </span>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup lang="ts" name="modal">
+import { reactive, ref } from 'vue';
+import type { FormInstance, FormRules } from 'element-plus';
+import useSystemStore from '@/store/main';
+import { listDept } from '@/api/system/dept';
+import { ComponentInternalInstance } from 'vue';
+import cache from '@/plugins/cache';
+import Formula from '@/components/Formula/index.vue';
+import { outTypeList } from '@/libs/commonMeth';
+const elecEnerty = outTypeList('dh_ec_electricity');
+const gasEnerty = outTypeList('dh_ec_gas');
+const waterEnerty = outTypeList('dh_ec_water');
+// 定义props
+interface IProps {
+    modalConfig: {
+        pageName: string;
+        addTitle: string;
+        editTitle: string;
+        detailTitle: string;
+        dialogWidth: string;
+        labelWidth: string;
+        formItems: any[];
+        formRules: object;
+        pageListParams?: object; //新增一个对象,用来传给特殊的列表接口刷新页面(非必传)
+    };
+    otherInfo?: any;
+}
+
+const props = defineProps<IProps>();
+
+const dialogVisible = ref(false);
+const isEdit = ref(false);
+
+const ruleFormRef = ref<FormInstance>();
+
+const systemStore = useSystemStore();
+
+const { pageDetailInfo, pageOperateType } = storeToRefs(systemStore);
+import { energyUnitPrice } from '@/api/leasingCompany';
+import { matchStringAndFormat } from '@/utils/commonMeth';
+
+// 获取字段
+const dictType = 'dh_company_independent_energy_costs_calculation_formula_value';
+// 组合两个字典数组
+let fieldNameList = ref([] as any);
+// 获取费用计算公式组件的数据
+const getValue = (calculationFormulaName, dictList, globalList) => {
+    formData.value.calculationFormulaName = calculationFormulaName;
+    fieldNameList.value = [...dictList.value, ...globalList.value];
+};
+// 父组件的值
+const formulaValue = ref('初始值') as any;
+provide('calculationFormulaName', formulaValue);
+
+// 重置数据
+const handleClearDate = () => {
+    // 重置父组件的值
+    formData.value.calculationFormulaName = '';
+    // 重置子组件的值
+    formulaValue.value = +new Date();
+};
+// ---------------------费用总计 结束----------------------
+
+onMounted(async () => {
+    await getListDept();
+    await getEnergyUnitPrice();
+});
+
+// 获取能源单价
+const getEnergyUnitPrice = () => {
+    energyUnitPrice().then((res: any) => {
+        initEnergyList.value = res.rows;
+        initEnergy.value = res.rows[0].energyUnitPriceId;
+    });
+};
+
+// 部门树形数据
+const deptOptions = ref<any[]>([]);
+const departTree = ref([]);
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const getListDept = async () => {
+    // 获取关联部门列表
+    await listDept().then(response => {
+        departTree.value = response.data;
+        deptOptions.value = proxy!.handleTree(response.data, 'deptId');
+    });
+};
+// 部门树形的chang事件
+const dapartTreeChange = id => {
+    departTree.value.forEach((item: any) => {
+        if (item.deptId === id) {
+            formData.value.numberOfPersonnel = item.numberOfPersonnel;
+        }
+    });
+    console.log(formData.value.numberOfPersonnel);
+};
+// 能源单价标志
+const unitPriceOptions = [
+    {
+        label: '是',
+        value: '0',
+    },
+    {
+        label: '否',
+        value: '2',
+    },
+];
+// 水电燃气单价
+const customEnergy = ref('1');
+const initEnergyList = ref([] as any);
+const initEnergy = ref('1');
+// 能源单价标志的change事件
+const unitPriceChange = async (e: string) => {
+    customEnergy.value = '1';
+    initEnergy.value = '1';
+    console.log(formData.value.energyList);
+
+    await getEnergyUnitPrice();
+};
+// ----------------------------------------------------------------
+// 定义数据绑定
+const initialForm: any = {};
+for (const item of props.modalConfig.formItems) {
+    initialForm[item.prop] = item.initialValue ?? '';
+}
+
+let formData = ref(JSON.parse(JSON.stringify(initialForm)));
+
+const dialogTitle = ref();
+const initData = ref({});
+// 新建或者编辑
+async function setDialogVisible(isNew: boolean = true, check: boolean = false) {
+    await getEnergyUnitPrice();
+    dialogVisible.value = true;
+    ruleFormRef.value?.resetFields();
+    // 清空数据
+    handleClearDate();
+    await nextTick();
+    if (!isNew) {
+        watch(pageDetailInfo, newVal => {
+            formData.value = pageDetailInfo.value;
+            console.log(formData.value);
+            // 赋值
+            formulaValue.value = formData.value.calculationFormulaName;
+        });
+
+        customEnergy.value = '1';
+        initEnergy.value = '1';
+
+        // 判断如果不是新增的话就获取store中的详情
+        if (check) {
+            dialogTitle.value = props.modalConfig.detailTitle;
+            systemStore.getDetailType('detail');
+        } else {
+            dialogTitle.value = props.modalConfig.editTitle;
+            systemStore.getDetailType('edit');
+        }
+    } else {
+        props.modalConfig.formItems.map((m: any) => {
+            if (m.numberType === '2') {
+                if (m.porp === initialForm[m.porp]) {
+                    initialForm[m.prop] = (0.0).toFixed(2);
+                }
+            } else if (m.numberType === '1') {
+                if (m.porp === initialForm[m.porp]) {
+                    initialForm[m.prop] = Math.trunc(0);
+                }
+            }
+        });
+        formData.value = JSON.parse(JSON.stringify(initialForm));
+        await nextTick();
+        setTimeout(() => {
+            formData.value.energyList = initEnergyList.value;
+        }, 500);
+        customEnergy.value = '1';
+        initEnergy.value = '1';
+        dialogTitle.value = props.modalConfig.addTitle;
+        systemStore.detailPageEval(initialForm);
+        systemStore.getDetailType('add');
+    }
+    isEdit.value = !isNew;
+}
+// 点击确定
+function handleConfirmClick(formEl: FormInstance | undefined) {
+    if (!formEl) return;
+    formEl.validate((valid, fields) => {
+        if (valid) {
+            // 费用计算公式数据处理
+            // formData.value.calculationFormula = formData.value.calculationFormulaName
+            formData.value.calculationFormula = matchStringAndFormat(
+                formData.value.calculationFormulaName,
+                fieldNameList.value
+            );
+            dialogVisible.value = false;
+            let data = { ...formData.value };
+            data.energyList.forEach((item, index) => {
+                initEnergyList.value.forEach((row, d) => {
+                    if (index === d) {
+                        item.energyUnitPriceId = row.energyUnitPriceId;
+                    }
+                });
+            });
+            if (props.otherInfo) {
+                data = { ...data, ...props.otherInfo };
+            }
+            if (!isEdit.value) {
+                systemStore.newPageDataAction(
+                    props.modalConfig.pageName,
+                    data,
+                    props.modalConfig.pageListParams
+                );
+            } else {
+                if (pageOperateType.value === 'edit') {
+                    systemStore.editPageDataAction(
+                        props.modalConfig.pageName,
+                        data,
+                        props.modalConfig.pageListParams
+                    );
+                }
+            }
+        } else {
+            console.log('error submit!', fields);
+        }
+    });
+}
+// 取消
+function handleExcel(formEl: FormInstance | undefined) {
+    dialogVisible.value = false;
+    if (!formEl) return;
+    formEl.resetFields();
+}
+
+// 获取详情
+function onPageDetail(urlId: number | [] | string) {
+    systemStore.detailPageDataAction(props.modalConfig.pageName, urlId);
+}
+
+function onBlur(e: any, prop: any, type: any) {
+    let a = 0;
+    if (type === '1') {
+        if (e < 0) {
+            e = 0;
+        } else if (e > 999999999999999) {
+            e = 999999999999999;
+        }
+        a = Math.trunc(e);
+        for (const item of props.modalConfig.formItems) {
+            if (item.type === 'number') {
+                if (prop === item.prop) {
+                    formData.value[item.prop] = a;
+                }
+            }
+        }
+    } else if (type === '2') {
+        if (e < 0) {
+            e = 0.0;
+        } else if (e > 999999999999999) {
+            e = 999999999999999.0;
+        }
+        a = Number(Number(e).toFixed(2));
+        for (const item of props.modalConfig.formItems) {
+            if (item.type === 'number') {
+                if (prop === item.prop) {
+                    formData.value[item.prop] = a;
+                }
+            }
+        }
+    }
+}
+defineExpose({
+    setDialogVisible,
+    onPageDetail,
+});
+</script>
+
+<style scoped lang="scss">
+.form {
+    padding: 10px 30px;
+}
+</style>

+ 32 - 0
src/views/InformationDisposalManage/config/content.config.ts

@@ -0,0 +1,32 @@
+const contentConfig = {
+    pageName: 'rentalCompany',
+    header: {
+        title: '费用输入列表',
+    },
+    propsList: [
+        // { type: 'index', label: '序号' },
+        { type: 'normal', label: '公司编码', prop: 'rentalCompanyCode', fixed: true },
+        { type: 'normal', label: '公司名称', prop: 'rentalCompanyName', width: 140 },
+        { type: 'normal', label: '关联部门', prop: 'deptName', width: 140 },
+        // { type: 'normal', label: '人员数', prop: 'numberOfPersonnel', width: 80 },
+        // { type: 'normal', label: '密集架节数', prop: 'shelving', width: 90 },
+        // { type: 'custom', label: '水单价(元)', slotName: 'water', prop: 'water', width: 220 },
+        // { type: 'custom', label: '电单价(元)', slotName: 'electric', prop: 'electric', width: 220 },
+        // { type: 'custom', label: '燃气单价(元)', slotName: 'coal', prop: 'coal', width: 220 },
+        { type: 'normal', label: '电能耗系统(加)', prop: 'energyElectricName', width: 140 },
+        { type: 'normal', label: '电能耗系统(减)', prop: 'energyElectricNameMin', width: 140 },
+        // { type: 'normal', label: '电能耗占比(%)', prop: 'energyElectricExpense', width: 140 },
+        { type: 'normal', label: '气能耗系统(加)', prop: 'energyGasName', width: 140 },
+        { type: 'normal', label: '气能耗系统(减)', prop: 'energyGasNameMin', width: 140 },
+        // { type: 'normal', label: '气能耗占比(%)', prop: 'energyGasExpense', width: 140 },
+        { type: 'normal', label: '水能耗系统(加)', prop: 'energyWaterName', width: 140 },
+        { type: 'normal', label: '水能耗系统(减)', prop: 'energyWaterNameMin', width: 140 },
+        // { type: 'normal', label: '水能耗占比(%)', prop: 'energyWaterExpense', width: 140 },
+        { type: 'normal', label: '创建时间', prop: 'createTime', width: 180 },
+        { type: 'normal', label: '修改时间', prop: 'updateTime', width: 180 },
+        { type: 'normal', label: '备注', prop: 'notes', width: 140 },
+        { type: 'handler', label: '操作', slotName: 'operate', width: 180 },
+    ],
+};
+
+export default contentConfig;

+ 134 - 0
src/views/InformationDisposalManage/config/detail.config.ts

@@ -0,0 +1,134 @@
+const modalConfig = {
+    pageName: 'rentalCompany',
+    addTitle: '新建租赁公司',
+    editTitle: '编辑租赁公司',
+    labelWidth: '150px',
+    formRules: {
+        rentalCompanyCode: [{ required: true, message: '请输入公司编码', trigger: 'change' }],
+        rentalCompanyName: [{ required: true, message: '请输入公司名称', trigger: 'change' }],
+        deptId: [{ required: true, message: '请选择关联部门', trigger: 'change' }],
+        calculationFormulaName: [{ required: true, message: '请输入费用计算公式', trigger: 'change' }],
+        // energyElectricIds: [{ required: true, message: '电能耗系统ID不能为空', trigger: 'select' }],
+        // energyGasIds: [{ required: true, message: '气能耗系统ID不能为空', trigger: 'select' }],
+        // energyWaterIds: [{ required: true, message: '水能耗系统ID不能为空', trigger: 'select' }],
+    },
+    formItems: [
+        {
+            label: '公司编码',
+            prop: 'rentalCompanyCode',
+            type: 'input',
+            placeholder: '请输入公司编码',
+        },
+        {
+            label: '公司名称',
+            prop: 'rentalCompanyName',
+            type: 'input',
+            placeholder: '请输入公司名称',
+        },
+        {
+            label: '关联部门',
+            prop: 'deptId',
+            type: 'deptId',
+            placeholder: '请选择关联部门',
+        },
+        // {
+        //     label: '公司人员数',
+        //     prop: 'numberOfPersonnel',
+        //     type: 'number',
+        //     numberType: '1',
+        //     placeholder: '请输入人员数',
+        // },
+        // {
+        //     label: '密集架节数',
+        //     prop: 'shelving',
+        //     type: 'number',
+        //     numberType: '1',
+        //     initialValue: 0,
+        //     placeholder: '请输入密集架节数',
+        // },
+        // {
+        //     label: '能源单价标志',
+        //     prop: 'unitPriceSign',
+        //     type: 'unitPriceSign',
+        //     initialValue: '0',
+        // },
+        // {
+        //     label: '能源列表',
+        //     prop: 'energyList',
+        //     type: 'energyList',
+        // },
+        {
+            label: '电能耗系统ID(加)',
+            prop: 'energyElectricIds',
+            type: 'energyElectricIds',
+            placeholder: '请输入电能耗系统ID',
+        },
+        {
+            label: '电能耗系统ID(减)',
+            prop: 'energyElectricIdsMin',
+            type: 'energyElectricIdsMin',
+            placeholder: '请输入电能耗系统ID',
+        },
+        // {
+        //     label: '电能耗占比(%)',
+        //     prop: 'energyElectricExpense',
+        //     type: 'number',
+        //     numberType: '1',
+        //     initialValue: 100,
+        //     placeholder: '请输入电能耗占比',
+        // },
+        {
+            label: '气能耗系统ID(加)',
+            prop: 'energyGasIds',
+            type: 'energyGasIds',
+            placeholder: '请输入气能耗系统ID',
+        },
+        {
+            label: '气能耗系统ID(减)',
+            prop: 'energyGasIdsMin',
+            type: 'energyGasIdsMin',
+            placeholder: '请输入气能耗系统ID',
+        },
+        // {
+        //     label: '气能耗占比(%)',
+        //     prop: 'energyGasExpense',
+        //     type: 'number',
+        //     initialValue: 100,
+        //     numberType: '1',
+        //     placeholder: '请输入气能耗占比',
+        // },
+        {
+            label: '水能耗系统ID(加)',
+            prop: 'energyWaterIds',
+            type: 'energyWaterIds',
+            placeholder: '请输入水能耗系统ID',
+        },
+        {
+            label: '水能耗系统ID(减)',
+            prop: 'energyWaterIdsMin',
+            type: 'energyWaterIdsMin',
+            placeholder: '请输入水能耗系统ID',
+        },
+        // {
+        //     label: '水能耗占比(%)',
+        //     prop: 'energyWaterExpense',
+        //     type: 'number',
+        //     numberType: '1',
+        //     initialValue: 100,
+        //     placeholder: '请输入水能耗占比',
+        // },
+        {
+            label: '备注',
+            prop: 'notes',
+            type: 'input',
+            placeholder: '请输入备注',
+        },
+        {
+            label: '天费用计算公式',
+            prop: 'calculationFormulaName',
+            type: 'calculationFormulaName',
+        },
+    ],
+};
+
+export default modalConfig;

+ 44 - 0
src/views/InformationDisposalManage/config/search.config.ts

@@ -0,0 +1,44 @@
+interface Inew {
+    label: string;
+    value: string;
+}
+
+const searchConfig = {
+    pageName: 'rentalCompany',
+    formItems: [
+        // {
+        //     label: '状态',
+        //     prop: 'status',
+        //     type: 'select',
+        //     options: [] as Array<Inew>,
+        //     placeholder: '请选择状态',
+        // },
+        {
+            label: '公司编码',
+            prop: 'rentalCompanyCode',
+            type: 'input',
+            placeholder: '请输入公司编码',
+        },
+        {
+            label: '公司名称',
+            prop: 'rentalCompanyName',
+            type: 'input',
+            placeholder: '请输入公司名称',
+        },
+        {
+            label: '关联部门',
+            prop: 'deptName',
+            type: 'input',
+            placeholder: '请输入关联部门',
+        },
+        {
+            label: '创建时间',
+            prop: 'createDate',
+            type: 'date-picker',
+            placeholder: '请选择创建时间',
+        },
+   
+    ],
+};
+
+export default searchConfig;

+ 160 - 0
src/views/InformationDisposalManage/index.vue

@@ -0,0 +1,160 @@
+<template>
+    <div class="sensitive-words">
+        <pageSearch ref="searchTableRef" :searchConfig="searchConfig" />
+
+        <pageContent ref="tableListRef" :total="total" :contentConfig="contentConfig" :pageList="tableData">
+            <template #button>
+                <el-button type="primary" @click="handleAdd()"
+                    v-hasPermi="['business:rentalCompany:add']">新增</el-button>
+            </template>
+            <!-- 水 -->
+            <template #water="scope">
+                <div class="flex">
+                    <!-- <div class="mr5">
+                        谷值:<span>{{ scope.row.energyList[0].peakUnitPrice }}</span>
+                    </div>
+                    <div class="mr5">
+                        峰值:<span>{{ scope.row.energyList[0].valleyValueUnitPrice }}</span>
+                    </div> -->
+                    <div>
+                        平段单价:<span>{{ scope.row.energyList[0].averageUnitPrice }}</span>
+                    </div>
+                </div>
+            </template>
+            <!-- 电 -->
+            <template #electric="scope">
+                <div class="flex">
+                    <!-- <div class="mr5">
+                        谷值:<span>{{ scope.row.energyList[1].peakUnitPrice }}</span>
+                    </div>
+                    <div class="mr5">
+                        峰值:<span>{{ scope.row.energyList[1].valleyValueUnitPrice }}</span>
+                    </div> -->
+                    <div>
+                        平段单价:<span>{{ scope.row.energyList[1].averageUnitPrice }}</span>
+                    </div>
+                </div>
+            </template>
+            <!-- 燃气 -->
+            <template #coal="scope">
+                <div class="flex">
+                    <!-- <div class="mr5">
+                        谷值:<span>{{ scope.row.energyList[2].peakUnitPrice }}</span>
+                    </div>
+                    <div class="mr5">
+                        峰值:<span>{{ scope.row.energyList[2].valleyValueUnitPrice }}</span>
+                    </div> -->
+                    <div>
+                        平段单价:<span>{{ scope.row.energyList[2].averageUnitPrice }}</span>
+                    </div>
+                </div>
+            </template>
+            <template #operate="scope">
+                <el-button type="primary" link @click="handleEdit(scope.row.rentalCompanyId)"
+                    v-hasPermi="['business:rentalCompany:edit']">
+                    编辑
+                </el-button>
+                <el-button type="primary" link @click="handleDelete(scope.row.rentalCompanyId)"
+                    v-hasPermi="['business:rentalCompany:remove']">
+                    删除
+                </el-button>
+            </template>
+        </pageContent>
+        <pageDetail :modalConfig="detailConfig" ref="modalRef"> </pageDetail>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { ComponentInternalInstance } from 'vue';
+// import { useRouter } from 'vue-router';
+import router from '@/router';
+import contentConfig from './config/content.config';
+import pageContent from '@/components/components/pageContent.vue';
+import searchConfig from './config/search.config';
+import pageSearch from '@/components/components/pageSearch.vue';
+import detailConfig from './config/detail.config';
+import pageDetail from './components/detail.vue';
+import useSystemStore from '@/store/main';
+// 使用pinia数据
+const systemStore = useSystemStore();
+const { pageDetailInfo } = storeToRefs(systemStore);
+
+const total = ref(0);
+const pageSize = ref([10, 20, 30]);
+const tableData = ref([]);
+const tableListRef = ref();
+
+// 操作弹框
+import usePageModal from '@/components/components/hooks/usePageDetails';
+const { modalRef, handleNewDataClick, handleEditDataClick, handleCheckDataClick, handlePageDetail } =
+    usePageModal();
+
+const handleEdit = async (id: string) => {
+    await handlePageDetail(id);
+    await handleEditDataClick();
+};
+
+// 新增按钮
+const handleAdd = () => {
+    handleNewDataClick();
+};
+const searchTableRef = ref();
+const onClickDeleta = async (row: any) => {
+    ElMessageBox.confirm('确认删除此条数据吗?', '删除', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning',
+    }).then(() => {
+        // 删除后的回调
+    });
+};
+// 删除按钮
+function handleDelete(value: any) {
+    ElMessageBox.confirm('是否删除这条数据?', '删除提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+    })
+        .then(() => {
+            systemStore.deletePageDataAction(contentConfig.pageName, value);
+        })
+        .catch(() => {
+            ElMessage({
+                type: 'info',
+                message: '取消删除',
+            });
+        });
+}
+
+// 筛选-状态赋值
+async function searchItem() {
+    searchConfig.formItems.forEach(item => {
+        if (item.prop === 'status') {
+            // item.options = searchList.value;
+        }
+    });
+}
+searchItem();
+</script>
+
+<style scoped lang="scss">
+.sensitive-words {
+    margin: 20px;
+    // background-color: #fff;
+}
+
+.status {
+    cursor: pointer;
+    position: relative;
+
+    .status-tip {
+        position: absolute;
+        top: 2px;
+        left: 60px;
+    }
+}
+
+.dialog-tip {
+    text-align: center;
+}
+</style>