瀏覽代碼

feat(gysyfgl): 新增电力和燃气管理模块

- 添加了电力管理页面,包含用电类型、价值等级、风险等级等筛选功能
- 实现了电力用户的增删改查功能,支持导入导出操作
- 添加了燃气管理页面,包含企业信息、用户信息、欠费状态等管理功能
- 实现了燃气用户的增删改查功能,支持分页和批量操作
- 配置了开发和生产环境的API基础URL和MinIO存储地址
- 更新了组件类型声明文件,移除了未使用的Element Plus组件声明
- 修复了路由中页面名称的随机生成问题,确保页面唯一性
- 统一了上传组件的API地址配置,使用环境变量进行动态设置
nahida 5 月之前
父節點
當前提交
ea3cd85950

+ 1 - 1
.env.development

@@ -1,4 +1,4 @@
 # 变量必须以 VITE_ 为前缀才能暴露给外部读取
 NODE_ENV = 'development'
 VITE_APP_BASE_API = '/api'
-VITE_MINIO_BASE_URL = 'http://192.168.110.235:8801'域之盾一个月多少钱
+VITE_MINIO_BASE_URL = 'http://192.168.110.235:8801'

+ 2 - 1
.env.production

@@ -1,3 +1,4 @@
 # 变量必须以 VITE_ 为前缀才能暴露给外部读取
 NODE_ENV = 'production'
-VITE_APP_BASE_API = 'http://192.168.110.235:8801'
+VITE_APP_BASE_API = 'http://172.16.102.52:8801'
+VITE_MINIO_BASE_URL = 'http://172.16.102.52:9000/zksy-file'

+ 1 - 14
components.d.ts

@@ -8,16 +8,12 @@ export {}
 /* prettier-ignore */
 declare module 'vue' {
   export interface GlobalComponents {
-    ElAlert: typeof import('element-plus/es')['ElAlert']
-    ElAside: typeof import('element-plus/es')['ElAside']
     ElButton: typeof import('element-plus/es')['ElButton']
+    ElCard: typeof import('element-plus/es')['ElCard']
     ElCol: typeof import('element-plus/es')['ElCol']
     ElContainer: typeof import('element-plus/es')['ElContainer']
     ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
     ElDialog: typeof import('element-plus/es')['ElDialog']
-    ElDropdown: typeof import('element-plus/es')['ElDropdown']
-    ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
-    ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
     ElForm: typeof import('element-plus/es')['ElForm']
     ElFormItem: typeof import('element-plus/es')['ElFormItem']
     ElHeader: typeof import('element-plus/es')['ElHeader']
@@ -27,17 +23,11 @@ declare module 'vue' {
     ElMain: typeof import('element-plus/es')['ElMain']
     ElMenu: typeof import('element-plus/es')['ElMenu']
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
-    ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup']
     ElOption: typeof import('element-plus/es')['ElOption']
     ElPagination: typeof import('element-plus/es')['ElPagination']
-    ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm']
-    ElRadio: typeof import('element-plus/es')['ElRadio']
-    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElRow: typeof import('element-plus/es')['ElRow']
-    ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
     ElSelect: typeof import('element-plus/es')['ElSelect']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
-    ElSwitch: typeof import('element-plus/es')['ElSwitch']
     ElTable: typeof import('element-plus/es')['ElTable']
     ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
     ElTag: typeof import('element-plus/es')['ElTag']
@@ -50,9 +40,6 @@ declare module 'vue' {
     RecursiveMenuItem: typeof import('./src/components/RecursiveMenuItem.vue')['default']
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']
-    TheWelcome: typeof import('./src/components/TheWelcome.vue')['default']
-    VideoPlayer: typeof import('./src/components/VideoPlayer.vue')['default']
-    WelcomeItem: typeof import('./src/components/WelcomeItem.vue')['default']
   }
   export interface GlobalDirectives {
     vLoading: typeof import('element-plus/es')['ElLoadingDirective']

+ 1 - 1
src/router/index.ts

@@ -49,7 +49,7 @@ dynamicRoutesList.forEach((item) => {
 
   router.addRoute('layout', {
     path: item.path,
-    name: item.name,
+    name: item.name + Math.random(),
     component: modules[componentPath],
   })
 

+ 52 - 15
src/router/route.ts

@@ -3,21 +3,30 @@ export interface RouterType {
   name:string,
   addr?:string,
   icon?:string,
+  meta?: { hide?: boolean, disable?: boolean },
   children?:RouterType[]
 }
 
-export const buildTree =(routes: RouterType[]): RouterType[]=> {
+export const buildTree = (routes: RouterType[]): RouterType[] => {
+  // 先过滤掉需要隐藏的路由项
+  const filteredRoutes = routes.filter(route => !route.meta?.hide)
+
   const map: { [key: string]: RouterType } = {}
   const tree: RouterType[] = []
-  routes.forEach(route => {
+
+  // 初始化 map
+  filteredRoutes.forEach(route => {
     map[route.path] = { ...route, children: [] }
   })
 
-  for (const route of routes) {
+  // 构建父子关系
+  for (const route of filteredRoutes) {
     const parentPath = route.path.substring(0, route.path.lastIndexOf('/'))
     if (map[parentPath]) {
-      map[parentPath].children?.push(map[route.path])
+      // 如果父节点存在,则将当前节点加入其子节点数组
+      map[parentPath].children!.push(map[route.path])
     } else {
+      // 否则作为根节点加入树中
       tree.push(map[route.path])
     }
   }
@@ -49,32 +58,56 @@ export const routeList:RouterType[] = [
     icon: 'Management',
     addr: 'qygl/qyzzgl/index'
   },
-
   {
     path: 'ggsyfgl',
     name: '公用事业费管理',
-    icon: 'WalletFilled'
+    icon: 'WalletFilled',
+    meta: { hide: true }
   },
   {
     path: 'ggsyfgl/sfgl',
     name: '水费管理',
     icon: 'Histogram',
-    addr: 'ggsyfgl/sfgl/index'
+    addr: 'ggsyfgl/sfgl/index',
+    meta: { hide: true }
   },
   {
     path: 'ggsyfgl/dfgl',
     name: '电费管理',
     icon: 'TrendCharts',
-    addr: 'ggsyfgl/dfgl/index'
+    addr: 'ggsyfgl/dfgl/index',
+    meta: { hide: true }
   },
   {
     path: 'ggsyfgl/rqgl',
     name: '燃气费管理',
     icon: 'MagicStick',
-    addr: 'ggsyfgl/rqgl/index'
+    addr: 'ggsyfgl/rqgl/index',
+    meta: { hide: true }
+  },
+  {
+    path: 'gysyfgl',
+    name: '公用事业费管理',
+    icon: 'WalletFilled',
+  },
+  {
+    path: 'gysyfgl/sfgl',
+    name: '水费管理',
+    icon: 'Histogram',
+    addr: 'gysyfgl/sfgl/index'
+  },
+  {
+    path: 'gysyfgl/dfgl',
+    name: '电费管理',
+    icon: 'TrendCharts',
+    addr: 'gysyfgl/dfgl/index'
+  },
+  {
+    path: 'gysyfgl/rqgl',
+    name: '燃气费管理',
+    icon: 'MagicStick',
+    addr: 'gysyfgl/rqgl/index'
   },
-
-
   // {
   //   path: 'yggl',
   //   name: '员工管理',
@@ -112,10 +145,14 @@ export const routeList:RouterType[] = [
   // },
 ]
 export const useDynamicRoutes: () => RouterType[] = () => {
-  routeList.forEach(item => {
+  // 过滤掉 meta.disable === true 的路由
+  const filteredList = routeList.filter(item => !item.meta?.disable)
+
+  // 设置组件地址
+  filteredList.forEach(item => {
     item.addr = `views/${item.addr}.vue`
   })
-  return [
-    ...routeList
-  ]
+
+  return [...filteredList]
 }
+

+ 102 - 82
src/views/ggsyfgl/dfgl/index.vue

@@ -34,9 +34,12 @@
         </el-form-item>
         <el-form-item>
           <span slot="label" class="font-size-4.5">年度:</span>
-          <el-select v-model="searchForm.year"
-                     style="width: 240px"
-                     size="default" placeholder="请选择年度">
+          <el-select
+            v-model="searchForm.year"
+            style="width: 240px"
+            size="default"
+            placeholder="请选择年度"
+          >
             <el-option
               v-for="item in annualOptions"
               :key="item.value"
@@ -46,13 +49,14 @@
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" :icon="Search" @click="handleSearch" size="search">查询
+          <el-button type="primary" :icon="Search" @click="handleSearch" size="search"
+            >查询
           </el-button>
           <el-button :icon="Refresh" @click="handleResetSearch" size="search">重置</el-button>
         </el-form-item>
       </el-form>
 
-      <div class="flex gap-1" style="justify-content:flex-end">
+      <div class="flex gap-1" style="justify-content: flex-end">
         <el-button type="primary" :icon="Plus" @click="handleAdd" size="search">新增</el-button>
         <el-button
           type="danger"
@@ -60,13 +64,14 @@
           @click="handleBatchDelete"
           :disabled="selectedIds.length === 0"
           size="search"
-        >批量删除
-        </el-button
+          >批量删除
+        </el-button>
+        <el-button type="success" :icon="Download" @click="exportExcel" size="search"
+          >导出</el-button
         >
-        <el-button type="success" :icon="Download" @click="exportExcel" size="search">导出</el-button>
         <el-upload
           class="inline-block ml-2"
-          action="/api/eenterpriseElectricityAnnualStatistics/importData"
+          :action="base_url + '/eenterpriseElectricityAnnualStatistics/importData'"
           :show-file-list="false"
           :on-success="handleUploadSuccess"
           :on-error="handleUploadError"
@@ -89,40 +94,39 @@
         :header-cell-style="{ fontSize: '14px' }"
         :row-style="{ fontSize: '14px' }"
       >
-        <el-table-column type="selection" width="55" fixed="left"/>
-        <el-table-column prop="enterpriseName" label="企业名称" align="center"/>
-        <el-table-column prop="unifiedSocialCreditCode" label="统一社会信用代码" align="center"/>
-        <el-table-column prop="accountNumber" label="户号信息" align="center"/>
-        <el-table-column prop="year" label="年度" align="center"/>
-        <el-table-column prop="openingDate" label="开户日期" align="center"/>
+        <el-table-column type="selection" width="55" fixed="left" />
+        <el-table-column prop="enterpriseName" label="企业名称" align="center" />
+        <el-table-column prop="unifiedSocialCreditCode" label="统一社会信用代码" align="center" />
+        <el-table-column prop="accountNumber" label="户号信息" align="center" />
+        <el-table-column prop="year" label="年度" align="center" />
+        <el-table-column prop="openingDate" label="开户日期" align="center" />
 
         <el-table-column label="第一季度" align="center">
-          <el-table-column prop="q1Degree" label="用电量(度)" align="center"/>
-          <el-table-column prop="q1Cost" label="费用" align="center"/>
+          <el-table-column prop="q1Degree" label="用电量(度)" align="center" />
+          <el-table-column prop="q1Cost" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="第二季度" align="center">
-          <el-table-column prop="q2Degree" label="用电量(度)" align="center"/>
-          <el-table-column prop="q2Degree" label="费用" align="center"/>
+          <el-table-column prop="q2Degree" label="用电量(度)" align="center" />
+          <el-table-column prop="q2Degree" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="第三季度" align="center">
-          <el-table-column prop="q3Degree" label="用电量(度)" align="center"/>
-          <el-table-column prop="q3Degree" label="费用" align="center"/>
+          <el-table-column prop="q3Degree" label="用电量(度)" align="center" />
+          <el-table-column prop="q3Degree" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="第四季度" align="center">
-          <el-table-column prop="q4Degree" label="用电量(度)" align="center"/>
-          <el-table-column prop="q4Degree" label="费用" align="center"/>
+          <el-table-column prop="q4Degree" label="用电量(度)" align="center" />
+          <el-table-column prop="q4Degree" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="年度总量" align="center">
-          <el-table-column prop="annualTotalDegree" label="用电量(度)" align="center"/>
-          <el-table-column prop="annualTotalCost" label="费用" align="center"/>
+          <el-table-column prop="annualTotalDegree" label="用电量(度)" align="center" />
+          <el-table-column prop="annualTotalCost" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="操作" fixed="right" align="center">
           <template #default="{ row }">
             <el-button :icon="Edit" size="small" @click="handleEdit(row)">编辑</el-button>
             <el-button type="danger" :icon="Delete" size="small" @click="handleDelete(row.id)"
-            >删除
-            </el-button
-            >
+              >删除
+            </el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -160,7 +164,7 @@
           prop="enterpriseName"
           :rules="[{ required: true, message: '请输入企业名称', trigger: 'blur' }]"
         >
-          <el-input v-model="formData.enterpriseName" placeholder="请输入企业名称"/>
+          <el-input v-model="formData.enterpriseName" placeholder="请输入企业名称" />
         </el-form-item>
         <el-form-item
           label="信用代码"
@@ -177,17 +181,19 @@
           prop="accountNumber"
           :rules="[{ required: true, message: '请输入户号信息', trigger: 'blur' }]"
         >
-          <el-input
-            v-model="formData.accountNumber"
-            placeholder="请输入户号信息"
-          />
+          <el-input v-model="formData.accountNumber" placeholder="请输入户号信息" />
         </el-form-item>
         <el-form-item
           label="开户日期"
           prop="openingDate"
           :rules="[{ required: true, message: '请选择开户日期', trigger: 'change' }]"
         >
-          <el-date-picker v-model="formData.openingDate" type="date" format="YYYY/MM/DD" value-format="YYYY-MM-DD"/>
+          <el-date-picker
+            v-model="formData.openingDate"
+            type="date"
+            format="YYYY/MM/DD"
+            value-format="YYYY-MM-DD"
+          />
         </el-form-item>
         <el-form-item
           label="年度"
@@ -212,7 +218,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q1Cost" placeholder="请输入第一季度费用"/>
+          <el-input v-model.number="formData.q1Cost" placeholder="请输入第一季度费用" />
         </el-form-item>
         <el-form-item
           label="第一季度度数"
@@ -222,10 +228,9 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q1Degree" placeholder="请输入第一季度度数"/>
+          <el-input v-model.number="formData.q1Degree" placeholder="请输入第一季度度数" />
         </el-form-item>
 
-
         <el-form-item
           label="第二季度费用"
           prop="q2Cost"
@@ -234,7 +239,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q2Cost" placeholder="请输入第二季度费用"/>
+          <el-input v-model.number="formData.q2Cost" placeholder="请输入第二季度费用" />
         </el-form-item>
         <el-form-item
           label="第二季度度数"
@@ -244,10 +249,9 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q2Degree" placeholder="请输入第二季度度数"/>
+          <el-input v-model.number="formData.q2Degree" placeholder="请输入第二季度度数" />
         </el-form-item>
 
-
         <el-form-item
           label="第三季度费用"
           prop="q3Cost"
@@ -256,7 +260,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q3Cost" placeholder="请输入第三季度费用"/>
+          <el-input v-model.number="formData.q3Cost" placeholder="请输入第三季度费用" />
         </el-form-item>
         <el-form-item
           label="第三季度度数"
@@ -266,10 +270,9 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q3Degree" placeholder="请输入第三季度度数"/>
+          <el-input v-model.number="formData.q3Degree" placeholder="请输入第三季度度数" />
         </el-form-item>
 
-
         <el-form-item
           label="第四季度费用"
           prop="q4Cost"
@@ -278,7 +281,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q4Cost" placeholder="请输入第四季度费用"/>
+          <el-input v-model.number="formData.q4Cost" placeholder="请输入第四季度费用" />
         </el-form-item>
         <el-form-item
           label="第四季度度数"
@@ -288,10 +291,9 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q4Degree" placeholder="请输入第四季度度数"/>
+          <el-input v-model.number="formData.q4Degree" placeholder="请输入第四季度度数" />
         </el-form-item>
 
-
         <el-form-item
           label="年度总费用"
           prop="annualTotalCost"
@@ -300,7 +302,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.annualTotalCost" placeholder="请输入年度总费用"/>
+          <el-input v-model.number="formData.annualTotalCost" placeholder="请输入年度总费用" />
         </el-form-item>
         <el-form-item
           label="年度总度数"
@@ -310,7 +312,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.annualTotalTon" placeholder="请输入年度总度数"/>
+          <el-input v-model.number="formData.annualTotalTon" placeholder="请输入年度总度数" />
         </el-form-item>
       </el-form>
       <template #footer>
@@ -324,11 +326,11 @@
 </template>
 
 <script setup lang="ts">
-import {onMounted, reactive, ref} from 'vue'
-import {clientDownloadExcel, clientGet, clientPost} from '@/utils/request.ts'
-import type {FormInstance, UploadProps} from 'element-plus'
-import {ElForm, ElLoading, ElMessage, ElMessageBox} from 'element-plus'
-import {Delete, Download, Edit, Plus, Refresh, Search, Upload} from '@element-plus/icons-vue'
+import { onMounted, reactive, ref } from 'vue'
+import { clientDownloadExcel, clientGet, clientPost } from '@/utils/request.ts'
+import type { FormInstance, UploadProps } from 'element-plus'
+import { ElForm, ElLoading, ElMessage, ElMessageBox } from 'element-plus'
+import { Delete, Download, Edit, Plus, Refresh, Search, Upload } from '@element-plus/icons-vue'
 
 // 假设 BaseResponse 和 PageType 在全局或 request.ts 中已定义
 interface BaseResponse {
@@ -432,25 +434,29 @@ const isEdit = ref(false)
 const formData = reactive<Property>({})
 const formRef = ref<FormInstance>()
 const selectedIds = ref<string[]>([])
+const base_url = import.meta.env.VITE_APP_BASE_API
 
 // 欠缴状态选项
 const arrearsOptions = [
-  {label: '是', value: '是'},
-  {label: '否', value: '否'},
+  { label: '是', value: '是' },
+  { label: '否', value: '否' },
 ]
 
 // 年度选项(动态生成最近5年)
 const currentYear = new Date().getFullYear()
 
-const annualOptions = Array.from({length: 10}, (_, i) => ({
+const annualOptions = Array.from({ length: 10 }, (_, i) => ({
   label: `${currentYear - i}年`,
   value: `${currentYear - i}`,
 }))
 // 新增
 const add = async (data: AddProperty) => {
-  const res = await clientPost<AddProperty, BaseResponse>('/eenterpriseElectricityAnnualStatistics/save', {
-    ...data,
-  })
+  const res = await clientPost<AddProperty, BaseResponse>(
+    '/eenterpriseElectricityAnnualStatistics/save',
+    {
+      ...data,
+    },
+  )
 
   if (res.code !== 200) {
     ElMessage.error(res.msg)
@@ -463,7 +469,9 @@ const add = async (data: AddProperty) => {
 
 // 根据id获取数据
 const getById = async (id: string) => {
-  const res = await clientGet<null, PropertyOneResponse>('/eenterpriseElectricityAnnualStatistics/getById/' + id)
+  const res = await clientGet<null, PropertyOneResponse>(
+    '/eenterpriseElectricityAnnualStatistics/getById/' + id,
+  )
   if (res.code !== 200) {
     ElMessage.error(res.msg)
     return null
@@ -477,21 +485,25 @@ const getList = async () => {
   const params = {
     pageNum: pageNum.value,
     pageSize: pageSize.value,
-    ...(searchForm.accountNumber ? {accountNumber: searchForm.accountNumber} : {}),
-    ...(searchForm.unifiedSocialCreditCode ? {unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode} : {}),
-    ...(searchForm.enterpriseName ? {enterpriseName: searchForm.enterpriseName} : {}),
-    ...(searchForm.year ? {year: searchForm.year} : {}),
+    ...(searchForm.accountNumber ? { accountNumber: searchForm.accountNumber } : {}),
+    ...(searchForm.unifiedSocialCreditCode
+      ? { unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode }
+      : {}),
+    ...(searchForm.enterpriseName ? { enterpriseName: searchForm.enterpriseName } : {}),
+    ...(searchForm.year ? { year: searchForm.year } : {}),
   }
 
-  const res = await clientGet<{
-    pageNum: number
-    pageSize: number
-    accountNumber?: string
-    unifiedSocialCreditCode?: string
-    enterpriseName?: string
-    year?: string
-  },
-    PropertyListResponse>('/eenterpriseElectricityAnnualStatistics/findByPage', {
+  const res = await clientGet<
+    {
+      pageNum: number
+      pageSize: number
+      accountNumber?: string
+      unifiedSocialCreditCode?: string
+      enterpriseName?: string
+      year?: string
+    },
+    PropertyListResponse
+  >('/eenterpriseElectricityAnnualStatistics/findByPage', {
     params,
   })
 
@@ -505,7 +517,10 @@ const getList = async () => {
 
 // 批量删除
 const delBatch = async (ids: string[]) => {
-  const res = await clientPost<string[], BaseResponse>('/eenterpriseElectricityAnnualStatistics/deleteBatch', ids)
+  const res = await clientPost<string[], BaseResponse>(
+    '/eenterpriseElectricityAnnualStatistics/deleteBatch',
+    ids,
+  )
   if (res.code !== 200) {
     ElMessage.error(res.msg)
     return false
@@ -516,9 +531,12 @@ const delBatch = async (ids: string[]) => {
 
 // 修改
 const update = async (data: UpdateProperty) => {
-  const res = await clientPost<UpdateProperty, BaseResponse>('/eenterpriseElectricityAnnualStatistics/update', {
-    ...data,
-  })
+  const res = await clientPost<UpdateProperty, BaseResponse>(
+    '/eenterpriseElectricityAnnualStatistics/update',
+    {
+      ...data,
+    },
+  )
   if (res.code !== 200) {
     ElMessage.error(res.msg)
     return false
@@ -539,10 +557,12 @@ const exportExcel = async () => {
   try {
     // 构建参数对象,只包含有值的搜索条件
     const params = {
-      ...(searchForm.accountNumber ? {accountNumber: searchForm.accountNumber} : {}),
-      ...(searchForm.unifiedSocialCreditCode ? {unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode} : {}),
-      ...(searchForm.enterpriseName ? {enterpriseName: searchForm.enterpriseName} : {}),
-      ...(searchForm.year ? {year: searchForm.year} : {}),
+      ...(searchForm.accountNumber ? { accountNumber: searchForm.accountNumber } : {}),
+      ...(searchForm.unifiedSocialCreditCode
+        ? { unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode }
+        : {}),
+      ...(searchForm.enterpriseName ? { enterpriseName: searchForm.enterpriseName } : {}),
+      ...(searchForm.year ? { year: searchForm.year } : {}),
     }
 
     await clientDownloadExcel('/eenterpriseElectricityAnnualStatistics/exportData', {
@@ -660,7 +680,7 @@ const handleConfirm = async () => {
   await formRef.value.validate(async (valid) => {
     if (valid) {
       let success = false
-      const dataToSend = {...formData}
+      const dataToSend = { ...formData }
 
       if (isEdit.value) {
         success = await update(dataToSend)

+ 102 - 81
src/views/ggsyfgl/rqgl/index.vue

@@ -34,9 +34,12 @@
         </el-form-item>
         <el-form-item>
           <span slot="label" class="font-size-4.5">年度:</span>
-          <el-select v-model="searchForm.year"
-                     style="width: 240px"
-                     size="default" placeholder="请选择年度">
+          <el-select
+            v-model="searchForm.year"
+            style="width: 240px"
+            size="default"
+            placeholder="请选择年度"
+          >
             <el-option
               v-for="item in annualOptions"
               :key="item.value"
@@ -46,13 +49,14 @@
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" :icon="Search" @click="handleSearch" size="search">查询
+          <el-button type="primary" :icon="Search" @click="handleSearch" size="search"
+            >查询
           </el-button>
           <el-button :icon="Refresh" @click="handleResetSearch" size="search">重置</el-button>
         </el-form-item>
       </el-form>
 
-      <div class="flex gap-1" style="justify-content:flex-end">
+      <div class="flex gap-1" style="justify-content: flex-end">
         <el-button type="primary" :icon="Plus" @click="handleAdd" size="search">新增</el-button>
         <el-button
           type="danger"
@@ -60,13 +64,14 @@
           @click="handleBatchDelete"
           :disabled="selectedIds.length === 0"
           size="search"
-        >批量删除
-        </el-button
+          >批量删除
+        </el-button>
+        <el-button type="success" :icon="Download" @click="exportExcel" size="search"
+          >导出</el-button
         >
-        <el-button type="success" :icon="Download" @click="exportExcel" size="search">导出</el-button>
         <el-upload
           class="inline-block ml-2"
-          action="/api/eenterpriseGasAnnualStatistics/importData"
+          :action="base_url + '/eenterpriseGasAnnualStatistics/importData'"
           :show-file-list="false"
           :on-success="handleUploadSuccess"
           :on-error="handleUploadError"
@@ -89,40 +94,39 @@
         :header-cell-style="{ fontSize: '14px' }"
         :row-style="{ fontSize: '14px' }"
       >
-        <el-table-column type="selection" width="55" fixed="left"/>
-        <el-table-column prop="enterpriseName" label="企业名称" align="center"/>
-        <el-table-column prop="unifiedSocialCreditCode" label="统一社会信用代码" align="center"/>
-        <el-table-column prop="accountNumber" label="户号信息" align="center"/>
-        <el-table-column prop="year" label="年度" align="center"/>
-        <el-table-column prop="openingDate" label="开户日期" align="center"/>
+        <el-table-column type="selection" width="55" fixed="left" />
+        <el-table-column prop="enterpriseName" label="企业名称" align="center" />
+        <el-table-column prop="unifiedSocialCreditCode" label="统一社会信用代码" align="center" />
+        <el-table-column prop="accountNumber" label="户号信息" align="center" />
+        <el-table-column prop="year" label="年度" align="center" />
+        <el-table-column prop="openingDate" label="开户日期" align="center" />
 
         <el-table-column label="第一季度" align="center">
-          <el-table-column prop="q1CubicMeter" label="用气量(m³)" align="center"/>
-          <el-table-column prop="q1Cost" label="费用" align="center"/>
+          <el-table-column prop="q1CubicMeter" label="用气量(m³)" align="center" />
+          <el-table-column prop="q1Cost" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="第二季度" align="center">
-          <el-table-column prop="q2CubicMeter" label="用气量(m³)" align="center"/>
-          <el-table-column prop="q2CubicMeter" label="费用" align="center"/>
+          <el-table-column prop="q2CubicMeter" label="用气量(m³)" align="center" />
+          <el-table-column prop="q2CubicMeter" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="第三季度" align="center">
-          <el-table-column prop="q3CubicMeter" label="用气量(m³)" align="center"/>
-          <el-table-column prop="q3CubicMeter" label="费用" align="center"/>
+          <el-table-column prop="q3CubicMeter" label="用气量(m³)" align="center" />
+          <el-table-column prop="q3CubicMeter" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="第四季度" align="center">
-          <el-table-column prop="q4CubicMeter" label="用气量(m³)" align="center"/>
-          <el-table-column prop="q4CubicMeter" label="费用" align="center"/>
+          <el-table-column prop="q4CubicMeter" label="用气量(m³)" align="center" />
+          <el-table-column prop="q4CubicMeter" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="年度总量" align="center">
-          <el-table-column prop="annualTotalCubicMeter" label="用气量(m³)" align="center"/>
-          <el-table-column prop="annualTotalCost" label="费用" align="center"/>
+          <el-table-column prop="annualTotalCubicMeter" label="用气量(m³)" align="center" />
+          <el-table-column prop="annualTotalCost" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="操作" fixed="right" align="center">
           <template #default="{ row }">
             <el-button :icon="Edit" size="small" @click="handleEdit(row)">编辑</el-button>
             <el-button type="danger" :icon="Delete" size="small" @click="handleDelete(row.id)"
-            >删除
-            </el-button
-            >
+              >删除
+            </el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -160,7 +164,7 @@
           prop="enterpriseName"
           :rules="[{ required: true, message: '请输入企业名称', trigger: 'blur' }]"
         >
-          <el-input v-model="formData.enterpriseName" placeholder="请输入企业名称"/>
+          <el-input v-model="formData.enterpriseName" placeholder="请输入企业名称" />
         </el-form-item>
         <el-form-item
           label="信用代码"
@@ -177,22 +181,25 @@
           prop="accountNumber"
           :rules="[{ required: true, message: '请输入户号信息', trigger: 'blur' }]"
         >
-          <el-input
-            v-model="formData.accountNumber"
-            placeholder="请输入户号信息"
-          />
+          <el-input v-model="formData.accountNumber" placeholder="请输入户号信息" />
         </el-form-item>
         <el-form-item
           label="开户日期"
           prop="openingDate"
           :rules="[{ required: true, message: '请选择开户日期', trigger: 'change' }]"
         >
-          <el-date-picker v-model="formData.openingDate" type="date" format="YYYY/MM/DD" value-format="YYYY-MM-DD"/>
+          <el-date-picker
+            v-model="formData.openingDate"
+            type="date"
+            format="YYYY/MM/DD"
+            value-format="YYYY-MM-DD"
+          />
         </el-form-item>
         <el-form-item
           label="年度"
           prop="year"
-          :rules="[{ required: true, message: '请选择年度', trigger: 'change' }]"部门
+          :rules="[{ required: true, message: '请选择年度', trigger: 'change' }]"
+          部门
         >
           <el-select v-model="formData.year" placeholder="请选择年度" style="width: 100%">
             <el-option
@@ -212,7 +219,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q1Cost" placeholder="请输入第一季度费用"/>
+          <el-input v-model.number="formData.q1Cost" placeholder="请输入第一季度费用" />
         </el-form-item>
         <el-form-item
           label="第一季度用气数"
@@ -222,10 +229,9 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q1CubicMeter" placeholder="请输入第一季度用气数"/>
+          <el-input v-model.number="formData.q1CubicMeter" placeholder="请输入第一季度用气数" />
         </el-form-item>
 
-
         <el-form-item
           label="第二季度费用"
           prop="q2Cost"
@@ -234,7 +240,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q2Cost" placeholder="请输入第二季度费用"/>
+          <el-input v-model.number="formData.q2Cost" placeholder="请输入第二季度费用" />
         </el-form-item>
         <el-form-item
           label="第二季度用气数"
@@ -244,10 +250,9 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q2CubicMeter" placeholder="请输入第二季度用气数"/>
+          <el-input v-model.number="formData.q2CubicMeter" placeholder="请输入第二季度用气数" />
         </el-form-item>
 
-
         <el-form-item
           label="第三季度费用"
           prop="q3Cost"
@@ -256,7 +261,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q3Cost" placeholder="请输入第三季度费用"/>
+          <el-input v-model.number="formData.q3Cost" placeholder="请输入第三季度费用" />
         </el-form-item>
         <el-form-item
           label="第三季度用气数"
@@ -266,10 +271,9 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q3CubicMeter" placeholder="请输入第三季度用气数"/>
+          <el-input v-model.number="formData.q3CubicMeter" placeholder="请输入第三季度用气数" />
         </el-form-item>
 
-
         <el-form-item
           label="第四季度费用"
           prop="q4Cost"
@@ -278,7 +282,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q4Cost" placeholder="请输入第四季度费用"/>
+          <el-input v-model.number="formData.q4Cost" placeholder="请输入第四季度费用" />
         </el-form-item>
         <el-form-item
           label="第四季度用气数"
@@ -288,10 +292,9 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q4CubicMeter" placeholder="请输入第四季度用气数"/>
+          <el-input v-model.number="formData.q4CubicMeter" placeholder="请输入第四季度用气数" />
         </el-form-item>
 
-
         <el-form-item
           label="年度总费用"
           prop="annualTotalCost"
@@ -300,7 +303,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.annualTotalCost" placeholder="请输入年度总费用"/>
+          <el-input v-model.number="formData.annualTotalCost" placeholder="请输入年度总费用" />
         </el-form-item>
         <el-form-item
           label="年度总度数"
@@ -310,7 +313,10 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.annualTotalCubicMeter" placeholder="请输入年度总度数"/>
+          <el-input
+            v-model.number="formData.annualTotalCubicMeter"
+            placeholder="请输入年度总度数"
+          />
         </el-form-item>
       </el-form>
       <template #footer>
@@ -324,11 +330,11 @@
 </template>
 
 <script setup lang="ts">
-import {onMounted, reactive, ref} from 'vue'
-import {clientDownloadExcel, clientGet, clientPost} from '@/utils/request.ts'
-import type {FormInstance, UploadProps} from 'element-plus'
-import {ElForm, ElLoading, ElMessage, ElMessageBox} from 'element-plus'
-import {Delete, Download, Edit, Plus, Refresh, Search, Upload} from '@element-plus/icons-vue'
+import { onMounted, reactive, ref } from 'vue'
+import { clientDownloadExcel, clientGet, clientPost } from '@/utils/request.ts'
+import type { FormInstance, UploadProps } from 'element-plus'
+import { ElForm, ElLoading, ElMessage, ElMessageBox } from 'element-plus'
+import { Delete, Download, Edit, Plus, Refresh, Search, Upload } from '@element-plus/icons-vue'
 
 // 假设 BaseResponse 和 PageType 在全局或 request.ts 中已定义
 interface BaseResponse {
@@ -432,17 +438,18 @@ const isEdit = ref(false)
 const formData = reactive<Property>({})
 const formRef = ref<FormInstance>()
 const selectedIds = ref<string[]>([])
+const base_url = import.meta.env.VITE_APP_BASE_API
 
 // 欠缴状态选项
 const arrearsOptions = [
-  {label: '是', value: '是'},
-  {label: '否', value: '否'},
+  { label: '是', value: '是' },
+  { label: '否', value: '否' },
 ]
 
 // 年度选项(动态生成最近5年)
 const currentYear = new Date().getFullYear()
 
-const annualOptions = Array.from({length: 10}, (_, i) => ({
+const annualOptions = Array.from({ length: 10 }, (_, i) => ({
   label: `${currentYear - i}年`,
   value: `${currentYear - i}`,
 }))
@@ -463,7 +470,9 @@ const add = async (data: AddProperty) => {
 
 // 根据id获取数据
 const getById = async (id: string) => {
-  const res = await clientGet<null, PropertyOneResponse>('/eenterpriseGasAnnualStatistics/getById/' + id)
+  const res = await clientGet<null, PropertyOneResponse>(
+    '/eenterpriseGasAnnualStatistics/getById/' + id,
+  )
   if (res.code !== 200) {
     ElMessage.error(res.msg)
     return null
@@ -477,21 +486,25 @@ const getList = async () => {
   const params = {
     pageNum: pageNum.value,
     pageSize: pageSize.value,
-    ...(searchForm.accountNumber ? {accountNumber: searchForm.accountNumber} : {}),
-    ...(searchForm.unifiedSocialCreditCode ? {unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode} : {}),
-    ...(searchForm.enterpriseName ? {enterpriseName: searchForm.enterpriseName} : {}),
-    ...(searchForm.year ? {year: searchForm.year} : {}),
+    ...(searchForm.accountNumber ? { accountNumber: searchForm.accountNumber } : {}),
+    ...(searchForm.unifiedSocialCreditCode
+      ? { unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode }
+      : {}),
+    ...(searchForm.enterpriseName ? { enterpriseName: searchForm.enterpriseName } : {}),
+    ...(searchForm.year ? { year: searchForm.year } : {}),
   }
 
-  const res = await clientGet<{
-    pageNum: number
-    pageSize: number
-    accountNumber?: string
-    unifiedSocialCreditCode?: string
-    enterpriseName?: string
-    year?: string
-  },
-    PropertyListResponse>('/eenterpriseGasAnnualStatistics/findByPage', {
+  const res = await clientGet<
+    {
+      pageNum: number
+      pageSize: number
+      accountNumber?: string
+      unifiedSocialCreditCode?: string
+      enterpriseName?: string
+      year?: string
+    },
+    PropertyListResponse
+  >('/eenterpriseGasAnnualStatistics/findByPage', {
     params,
   })
 
@@ -505,7 +518,10 @@ const getList = async () => {
 
 // 批量删除
 const delBatch = async (ids: string[]) => {
-  const res = await clientPost<string[], BaseResponse>('/eenterpriseGasAnnualStatistics/deleteBatch', ids)
+  const res = await clientPost<string[], BaseResponse>(
+    '/eenterpriseGasAnnualStatistics/deleteBatch',
+    ids,
+  )
   if (res.code !== 200) {
     ElMessage.error(res.msg)
     return false
@@ -516,9 +532,12 @@ const delBatch = async (ids: string[]) => {
 
 // 修改
 const update = async (data: UpdateProperty) => {
-  const res = await clientPost<UpdateProperty, BaseResponse>('/eenterpriseGasAnnualStatistics/update', {
-    ...data,
-  })
+  const res = await clientPost<UpdateProperty, BaseResponse>(
+    '/eenterpriseGasAnnualStatistics/update',
+    {
+      ...data,
+    },
+  )
   if (res.code !== 200) {
     ElMessage.error(res.msg)
     return false
@@ -539,10 +558,12 @@ const exportExcel = async () => {
   try {
     // 构建参数对象,只包含有值的搜索条件
     const params = {
-      ...(searchForm.accountNumber ? {accountNumber: searchForm.accountNumber} : {}),
-      ...(searchForm.unifiedSocialCreditCode ? {unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode} : {}),
-      ...(searchForm.enterpriseName ? {enterpriseName: searchForm.enterpriseName} : {}),
-      ...(searchForm.year ? {year: searchForm.year} : {}),
+      ...(searchForm.accountNumber ? { accountNumber: searchForm.accountNumber } : {}),
+      ...(searchForm.unifiedSocialCreditCode
+        ? { unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode }
+        : {}),
+      ...(searchForm.enterpriseName ? { enterpriseName: searchForm.enterpriseName } : {}),
+      ...(searchForm.year ? { year: searchForm.year } : {}),
     }
 
     await clientDownloadExcel('/eenterpriseGasAnnualStatistics/exportData', {
@@ -660,7 +681,7 @@ const handleConfirm = async () => {
   await formRef.value.validate(async (valid) => {
     if (valid) {
       let success = false
-      const dataToSend = {...formData}
+      const dataToSend = { ...formData }
 
       if (isEdit.value) {
         success = await update(dataToSend)
@@ -718,7 +739,7 @@ const handleBeforeUpload: UploadProps['beforeUpload'] = (rawFile) => {
 
 const init = () => {
   getList()
-};
+}
 
 onMounted(() => {
   init()

+ 110 - 90
src/views/ggsyfgl/sfgl/index.vue

@@ -34,9 +34,12 @@
         </el-form-item>
         <el-form-item>
           <span slot="label" class="font-size-4.5">年度:</span>
-          <el-select v-model="searchForm.year"
-                     style="width: 240px"
-                     size="default" placeholder="请选择年度">
+          <el-select
+            v-model="searchForm.year"
+            style="width: 240px"
+            size="default"
+            placeholder="请选择年度"
+          >
             <el-option
               v-for="item in annualOptions"
               :key="item.value"
@@ -46,13 +49,14 @@
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" :icon="Search" @click="handleSearch" size="search">查询
+          <el-button type="primary" :icon="Search" @click="handleSearch" size="search"
+            >查询
           </el-button>
           <el-button :icon="Refresh" @click="handleResetSearch" size="search">重置</el-button>
         </el-form-item>
       </el-form>
 
-      <div class="flex gap-1" style="justify-content:flex-end">
+      <div class="flex gap-1" style="justify-content: flex-end">
         <el-button type="primary" :icon="Plus" @click="handleAdd" size="search">新增</el-button>
         <el-button
           type="danger"
@@ -60,13 +64,14 @@
           @click="handleBatchDelete"
           :disabled="selectedIds.length === 0"
           size="search"
-        >批量删除
-        </el-button
+          >批量删除
+        </el-button>
+        <el-button type="success" :icon="Download" @click="exportExcel" size="search"
+          >导出</el-button
         >
-        <el-button type="success" :icon="Download" @click="exportExcel" size="search">导出</el-button>
         <el-upload
           class="inline-block ml-2"
-          action="/api/eenterpriseWaterAnnualStatistics/importData"
+          :action="base_url + '/eenterpriseWaterAnnualStatistics/importData'"
           :show-file-list="false"
           :on-success="handleUploadSuccess"
           :on-error="handleUploadError"
@@ -89,41 +94,40 @@
         :header-cell-style="{ fontSize: '14px' }"
         :row-style="{ fontSize: '14px' }"
       >
-        <el-table-column type="selection" width="55" fixed="left"/>
-        <el-table-column prop="enterpriseName" label="企业名称" align="center"/>
-        <el-table-column prop="unifiedSocialCreditCode" label="统一社会信用代码" align="center"/>
-        <el-table-column prop="accountNumber" label="户号信息" align="center"/>
-        <el-table-column prop="year" label="年度" align="center"/>
+        <el-table-column type="selection" width="55" fixed="left" />
+        <el-table-column prop="enterpriseName" label="企业名称" align="center" />
+        <el-table-column prop="unifiedSocialCreditCode" label="统一社会信用代码" align="center" />
+        <el-table-column prop="accountNumber" label="户号信息" align="center" />
+        <el-table-column prop="year" label="年度" align="center" />
 
-        <el-table-column prop="openingDate" label="开户日期" align="center"/>
+        <el-table-column prop="openingDate" label="开户日期" align="center" />
 
         <el-table-column label="第一季度" align="center">
-          <el-table-column prop="q1Ton" label="用水量(吨)" align="center"/>
-          <el-table-column prop="q1Cost" label="费用" align="center"/>
+          <el-table-column prop="q1Ton" label="用水量(吨)" align="center" />
+          <el-table-column prop="q1Cost" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="第二季度" align="center">
-          <el-table-column prop="q2Ton" label="用水量(吨)" align="center"/>
-          <el-table-column prop="q2Cost" label="费用" align="center"/>
+          <el-table-column prop="q2Ton" label="用水量(吨)" align="center" />
+          <el-table-column prop="q2Cost" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="第三季度" align="center">
-          <el-table-column prop="q3Ton" label="用水量(吨)" align="center"/>
-          <el-table-column prop="q3Cost" label="费用" align="center"/>
+          <el-table-column prop="q3Ton" label="用水量(吨)" align="center" />
+          <el-table-column prop="q3Cost" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="第四季度" align="center">
-          <el-table-column prop="q4Ton" label="用水量(吨)" align="center"/>
-          <el-table-column prop="q4Cost" label="费用" align="center"/>
+          <el-table-column prop="q4Ton" label="用水量(吨)" align="center" />
+          <el-table-column prop="q4Cost" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="年度总量" align="center">
-          <el-table-column prop="annualTotalTon" label="用水量(吨)" align="center"/>
-          <el-table-column prop="annualTotalCost" label="费用" align="center"/>
+          <el-table-column prop="annualTotalTon" label="用水量(吨)" align="center" />
+          <el-table-column prop="annualTotalCost" label="费用" align="center" />
         </el-table-column>
         <el-table-column label="操作" fixed="right" align="center">
           <template #default="{ row }">
             <el-button :icon="Edit" size="small" @click="handleEdit(row)">编辑</el-button>
             <el-button type="danger" :icon="Delete" size="small" @click="handleDelete(row.id)"
-            >删除
-            </el-button
-            >
+              >删除
+            </el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -161,7 +165,7 @@
           prop="enterpriseName"
           :rules="[{ required: true, message: '请输入企业名称', trigger: 'blur' }]"
         >
-          <el-input v-model="formData.enterpriseName" placeholder="请输入企业名称"/>
+          <el-input v-model="formData.enterpriseName" placeholder="请输入企业名称" />
         </el-form-item>
         <el-form-item
           label="信用代码"
@@ -178,25 +182,27 @@
           prop="accountNumber"
           :rules="[{ required: true, message: '请输入户号信息', trigger: 'blur' }]"
         >
-          <el-input
-            v-model="formData.accountNumber"
-            placeholder="请输入户号信息"
-          />
+          <el-input v-model="formData.accountNumber" placeholder="请输入户号信息" />
         </el-form-item>
         <el-form-item
           label="开户日期"
           prop="openingDate"
           :rules="[{ required: true, message: '请选择开户日期', trigger: 'change' }]"
         >
-          <el-date-picker v-model="formData.openingDate" type="date" format="YYYY/MM/DD" value-format="YYYY-MM-DD"/>
-<!--          <el-select v-model="formData.openingDate" placeholder="请选择开户日期" style="width: 100%">-->
-<!--            <el-option-->
-<!--              v-for="item in annualOptionsYMD"-->
-<!--              :key="item.value"-->
-<!--              :label="item.label"-->
-<!--              :value="item.value"-->
-<!--            />-->
-<!--          </el-select>-->
+          <el-date-picker
+            v-model="formData.openingDate"
+            type="date"
+            format="YYYY/MM/DD"
+            value-format="YYYY-MM-DD"
+          />
+          <!--          <el-select v-model="formData.openingDate" placeholder="请选择开户日期" style="width: 100%">-->
+          <!--            <el-option-->
+          <!--              v-for="item in annualOptionsYMD"-->
+          <!--              :key="item.value"-->
+          <!--              :label="item.label"-->
+          <!--              :value="item.value"-->
+          <!--            />-->
+          <!--          </el-select>-->
         </el-form-item>
         <el-form-item
           label="年度"
@@ -221,7 +227,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q1Cost" placeholder="请输入第一季度费用"/>
+          <el-input v-model.number="formData.q1Cost" placeholder="请输入第一季度费用" />
         </el-form-item>
         <el-form-item
           label="第一季度吨数"
@@ -231,10 +237,9 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q1Ton" placeholder="请输入第一季度吨数"/>
+          <el-input v-model.number="formData.q1Ton" placeholder="请输入第一季度吨数" />
         </el-form-item>
 
-
         <el-form-item
           label="第二季度费用"
           prop="q2Cost"
@@ -243,7 +248,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q2Cost" placeholder="请输入第二季度费用"/>
+          <el-input v-model.number="formData.q2Cost" placeholder="请输入第二季度费用" />
         </el-form-item>
         <el-form-item
           label="第二季度吨数"
@@ -253,10 +258,9 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q2Ton" placeholder="请输入第二季度吨数"/>
+          <el-input v-model.number="formData.q2Ton" placeholder="请输入第二季度吨数" />
         </el-form-item>
 
-
         <el-form-item
           label="第三季度费用"
           prop="q3Cost"
@@ -265,7 +269,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q3Cost" placeholder="请输入第三季度费用"/>
+          <el-input v-model.number="formData.q3Cost" placeholder="请输入第三季度费用" />
         </el-form-item>
         <el-form-item
           label="第三季度吨数"
@@ -275,10 +279,9 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q3Ton" placeholder="请输入第三季度吨数"/>
+          <el-input v-model.number="formData.q3Ton" placeholder="请输入第三季度吨数" />
         </el-form-item>
 
-
         <el-form-item
           label="第四季度费用"
           prop="q4Cost"
@@ -287,7 +290,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q4Cost" placeholder="请输入第四季度费用"/>
+          <el-input v-model.number="formData.q4Cost" placeholder="请输入第四季度费用" />
         </el-form-item>
         <el-form-item
           label="第四季度吨数"
@@ -297,10 +300,9 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.q4Ton" placeholder="请输入第四季度吨数"/>
+          <el-input v-model.number="formData.q4Ton" placeholder="请输入第四季度吨数" />
         </el-form-item>
 
-
         <el-form-item
           label="年度总费用"
           prop="annualTotalCost"
@@ -309,7 +311,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.annualTotalCost" placeholder="请输入年度总费用"/>
+          <el-input v-model.number="formData.annualTotalCost" placeholder="请输入年度总费用" />
         </el-form-item>
         <el-form-item
           label="年度总吨数"
@@ -319,7 +321,7 @@
             { type: 'number', message: '请输入数字', trigger: 'blur' },
           ]"
         >
-          <el-input v-model.number="formData.annualTotalTon" placeholder="请输入年度总吨数"/>
+          <el-input v-model.number="formData.annualTotalTon" placeholder="请输入年度总吨数" />
         </el-form-item>
       </el-form>
       <template #footer>
@@ -333,11 +335,11 @@
 </template>
 
 <script setup lang="ts">
-import {onMounted, reactive, ref} from 'vue'
-import {clientDownloadExcel, clientGet, clientPost} from '@/utils/request.ts'
-import type {FormInstance, UploadProps} from 'element-plus'
-import {ElForm, ElLoading, ElMessage, ElMessageBox} from 'element-plus'
-import {Delete, Download, Edit, Plus, Refresh, Search, Upload} from '@element-plus/icons-vue'
+import { onMounted, reactive, ref } from 'vue'
+import { clientDownloadExcel, clientGet, clientPost } from '@/utils/request.ts'
+import type { FormInstance, UploadProps } from 'element-plus'
+import { ElForm, ElLoading, ElMessage, ElMessageBox } from 'element-plus'
+import { Delete, Download, Edit, Plus, Refresh, Search, Upload } from '@element-plus/icons-vue'
 
 // 假设 BaseResponse 和 PageType 在全局或 request.ts 中已定义
 interface BaseResponse {
@@ -441,25 +443,29 @@ const isEdit = ref(false)
 const formData = reactive<Property>({})
 const formRef = ref<FormInstance>()
 const selectedIds = ref<string[]>([])
+const base_url = import.meta.env.VITE_APP_BASE_API
 
 // 欠缴状态选项
 const arrearsOptions = [
-  {label: '是', value: '是'},
-  {label: '否', value: '否'},
+  { label: '是', value: '是' },
+  { label: '否', value: '否' },
 ]
 
 // 年度选项(动态生成最近5年)
 const currentYear = new Date().getFullYear()
 
-const annualOptions = Array.from({length: 10}, (_, i) => ({
+const annualOptions = Array.from({ length: 10 }, (_, i) => ({
   label: `${currentYear - i}年`,
   value: `${currentYear - i}`,
 }))
 // 新增
 const add = async (data: AddProperty) => {
-  const res = await clientPost<AddProperty, BaseResponse>('/eenterpriseWaterAnnualStatistics/save', {
-    ...data,
-  })
+  const res = await clientPost<AddProperty, BaseResponse>(
+    '/eenterpriseWaterAnnualStatistics/save',
+    {
+      ...data,
+    },
+  )
 
   if (res.code !== 200) {
     ElMessage.error(res.msg)
@@ -472,7 +478,9 @@ const add = async (data: AddProperty) => {
 
 // 根据id获取数据
 const getById = async (id: string) => {
-  const res = await clientGet<null, PropertyOneResponse>('/eenterpriseWaterAnnualStatistics/getById/' + id)
+  const res = await clientGet<null, PropertyOneResponse>(
+    '/eenterpriseWaterAnnualStatistics/getById/' + id,
+  )
   if (res.code !== 200) {
     ElMessage.error(res.msg)
     return null
@@ -486,21 +494,25 @@ const getList = async () => {
   const params = {
     pageNum: pageNum.value,
     pageSize: pageSize.value,
-    ...(searchForm.accountNumber ? {accountNumber: searchForm.accountNumber} : {}),
-    ...(searchForm.unifiedSocialCreditCode ? {unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode} : {}),
-    ...(searchForm.enterpriseName ? {enterpriseName: searchForm.enterpriseName} : {}),
-    ...(searchForm.year ? {year: searchForm.year} : {}),
+    ...(searchForm.accountNumber ? { accountNumber: searchForm.accountNumber } : {}),
+    ...(searchForm.unifiedSocialCreditCode
+      ? { unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode }
+      : {}),
+    ...(searchForm.enterpriseName ? { enterpriseName: searchForm.enterpriseName } : {}),
+    ...(searchForm.year ? { year: searchForm.year } : {}),
   }
 
-  const res = await clientGet<{
-    pageNum: number
-    pageSize: number
-    accountNumber?: string
-    unifiedSocialCreditCode?: string
-    enterpriseName?: string
-    year?: string
-  },
-    PropertyListResponse>('/eenterpriseWaterAnnualStatistics/findByPage', {
+  const res = await clientGet<
+    {
+      pageNum: number
+      pageSize: number
+      accountNumber?: string
+      unifiedSocialCreditCode?: string
+      enterpriseName?: string
+      year?: string
+    },
+    PropertyListResponse
+  >('/eenterpriseWaterAnnualStatistics/findByPage', {
     params,
   })
 
@@ -514,7 +526,10 @@ const getList = async () => {
 
 // 批量删除
 const delBatch = async (ids: string[]) => {
-  const res = await clientPost<string[], BaseResponse>('/eenterpriseWaterAnnualStatistics/deleteBatch', ids)
+  const res = await clientPost<string[], BaseResponse>(
+    '/eenterpriseWaterAnnualStatistics/deleteBatch',
+    ids,
+  )
   if (res.code !== 200) {
     ElMessage.error(res.msg)
     return false
@@ -525,9 +540,12 @@ const delBatch = async (ids: string[]) => {
 
 // 修改
 const update = async (data: UpdateProperty) => {
-  const res = await clientPost<UpdateProperty, BaseResponse>('/eenterpriseWaterAnnualStatistics/update', {
-    ...data,
-  })
+  const res = await clientPost<UpdateProperty, BaseResponse>(
+    '/eenterpriseWaterAnnualStatistics/update',
+    {
+      ...data,
+    },
+  )
   if (res.code !== 200) {
     ElMessage.error(res.msg)
     return false
@@ -548,10 +566,12 @@ const exportExcel = async () => {
   try {
     // 构建参数对象,只包含有值的搜索条件
     const params = {
-      ...(searchForm.accountNumber ? {accountNumber: searchForm.accountNumber} : {}),
-      ...(searchForm.unifiedSocialCreditCode ? {unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode} : {}),
-      ...(searchForm.enterpriseName ? {enterpriseName: searchForm.enterpriseName} : {}),
-      ...(searchForm.year ? {year: searchForm.year} : {}),
+      ...(searchForm.accountNumber ? { accountNumber: searchForm.accountNumber } : {}),
+      ...(searchForm.unifiedSocialCreditCode
+        ? { unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode }
+        : {}),
+      ...(searchForm.enterpriseName ? { enterpriseName: searchForm.enterpriseName } : {}),
+      ...(searchForm.year ? { year: searchForm.year } : {}),
     }
 
     await clientDownloadExcel('/eenterpriseWaterAnnualStatistics/exportData', {
@@ -669,7 +689,7 @@ const handleConfirm = async () => {
   await formRef.value.validate(async (valid) => {
     if (valid) {
       let success = false
-      const dataToSend = {...formData}
+      const dataToSend = { ...formData }
 
       if (isEdit.value) {
         success = await update(dataToSend)

+ 764 - 0
src/views/gysyfgl/dfgl/index.vue

@@ -0,0 +1,764 @@
+<template>
+  <div class="p-4">
+    <!-- 搜索表单 -->
+    <el-card class="mb-4">
+      <el-form :model="searchForm" inline>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">用电类型:</span>
+          </template>
+          <el-select
+            size="default"
+            v-model="searchForm.electricityType"
+            placeholder="请选择"
+            clearable
+            class="w-200px"
+          >
+            <el-option label="居民用电" value="居民用电" />
+            <el-option label="工业用电" value="工业用电" />
+            <el-option label="商业用电" value="商业用电" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">价值等级:</span>
+          </template>
+          <el-select
+            size="default"
+            v-model="searchForm.valueLevel"
+            placeholder="请选择"
+            clearable
+            class="w-200px"
+          >
+            <el-option label="高" value="高" />
+            <el-option label="中" value="中" />
+            <el-option label="低" value="低" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">风险等级:</span>
+          </template>
+          <el-select
+            size="default"
+            v-model="searchForm.riskLevel"
+            placeholder="请选择"
+            clearable
+            class="w-200px"
+          >
+            <el-option label="高" value="高" />
+            <el-option label="中" value="中" />
+            <el-option label="低" value="低" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">当前是否欠费:</span>
+          </template>
+          <el-select
+            size="default"
+            v-model="searchForm.isArrearsNow"
+            placeholder="请选择"
+            clearable
+            class="w-200px"
+          >
+            <el-option label="是" value="是" />
+            <el-option label="否" value="否" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button size="default" type="primary" :icon="Search" @click="handleSearch"
+            >搜索</el-button
+          >
+          <el-button size="default" :icon="Refresh" @click="handleReset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+
+    <!-- 操作按钮 -->
+    <el-card class="mb-4">
+      <div class="flex justify-between items-center">
+        <div class="flex gap-2">
+          <el-button size="default" type="primary" :icon="Plus" @click="handleAdd">新增</el-button>
+          <el-button
+            size="default"
+            type="danger"
+            :icon="Delete"
+            @click="handleBatchDelete"
+            :disabled="selectedIds.length === 0"
+          >
+            批量删除
+          </el-button>
+          <el-button size="default" type="success" :icon="Download" @click="handleExport"
+            >导出</el-button
+          >
+          <el-upload
+            :action="uploadUrl"
+            :headers="uploadHeaders"
+            :show-file-list="false"
+            :before-upload="beforeUpload"
+            :on-success="handleUploadSuccess"
+            :on-error="handleUploadError"
+            accept=".xlsx,.xls"
+            class="inline-block ml-2"
+          >
+            <el-button size="default" type="warning" :icon="Upload">导入</el-button>
+          </el-upload>
+        </div>
+      </div>
+    </el-card>
+
+    <!-- 数据表格 -->
+    <el-card>
+      <el-table
+        :data="tableData"
+        border
+        stripe
+        @selection-change="handleSelectionChange"
+        v-loading="loading"
+      >
+        <el-table-column type="selection" width="55" />
+        <!-- 移除 id 列和 createTime 列 -->
+        <el-table-column prop="electricityType" label="用电类型" width="120" />
+        <el-table-column prop="contractCapacity" label="合同容量(kW)" width="120" />
+        <el-table-column prop="firstPowerTime" label="首次供电时间" width="120" />
+        <el-table-column prop="electricityAccountStatus" label="账户状态" width="120" />
+        <el-table-column prop="arrearsAmount" label="欠费金额(元)" width="120">
+          <template #default="{ row }">
+            <span :class="row.arrearsAmount > 0 ? 'text-red-500' : ''">
+              {{ row.arrearsAmount || 0 }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="defaultTimesInTwoYears" label="近两年违约次数" width="140" />
+        <el-table-column prop="valueLevel" label="价值等级" width="100">
+          <template #default="{ row }">
+            <el-tag v-if="row.valueLevel === '高'" type="success">{{ row.valueLevel }}</el-tag>
+            <el-tag v-else-if="row.valueLevel === '中'" type="warning">{{ row.valueLevel }}</el-tag>
+            <el-tag v-else type="info">{{ row.valueLevel }}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="riskLevel" label="风险等级" width="100">
+          <template #default="{ row }">
+            <el-tag v-if="row.riskLevel === '高'" type="danger">{{ row.riskLevel }}</el-tag>
+            <el-tag v-else-if="row.riskLevel === '中'" type="warning">{{ row.riskLevel }}</el-tag>
+            <el-tag v-else type="success">{{ row.riskLevel }}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="avgElectricityAmountLast3Months"
+          label="近3月均用电金额"
+          width="150"
+        />
+        <el-table-column
+          prop="avgElectricityAmountLast6Months"
+          label="近6月均用电金额"
+          width="150"
+        />
+        <el-table-column prop="avgElectricityAmountLastYear" label="近一年均用电金额" width="150" />
+        <el-table-column prop="isArrearsNow" label="当前是否欠费" width="120">
+          <template #default="{ row }">
+            <el-tag v-if="row.isArrearsNow === '是'" type="danger">是</el-tag>
+            <el-tag v-else type="success">否</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="statisticsTime" label="统计时间" width="180" />
+        <el-table-column prop="statisticsBaselineDate" label="统计基准日期" width="120" />
+        <el-table-column prop="administrativeRegionCode" label="行政区域编码" width="140" />
+        <el-table-column prop="remarks" label="备注" width="200" show-overflow-tooltip />
+        <el-table-column label="操作" width="150" fixed="right">
+          <template #default="{ row }">
+            <el-button type="primary" link :icon="Edit" @click="handleEdit(row)">编辑</el-button>
+            <el-button type="danger" link :icon="Delete" @click="handleDelete(row)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 分页 -->
+      <div class="mt-4 flex justify-end">
+        <el-pagination
+          v-model:current-page="pagination.current"
+          v-model:page-size="pagination.size"
+          :page-sizes="[10, 20, 50, 100]"
+          :total="pagination.total"
+          layout="total, sizes, prev, pager, next, jumper"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+        />
+      </div>
+    </el-card>
+
+    <!-- 新增/编辑对话框 -->
+    <el-dialog
+      v-model="dialogVisible"
+      :title="dialogTitle"
+      width="800px"
+      @close="handleDialogClose"
+    >
+      <el-form ref="formRef" :model="formData" :rules="formRules" label-width="140px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="用电类型" prop="electricityType">
+              <el-select v-model="formData.electricityType" placeholder="请选择" class="w-full">
+                <el-option label="居民用电" value="居民用电" />
+                <el-option label="工业用电" value="工业用电" />
+                <el-option label="商业用电" value="商业用电" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="合同容量(kW)" prop="contractCapacity">
+              <el-input-number v-model="formData.contractCapacity" :min="0" class="w-full" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="首次供电时间" prop="firstPowerTime">
+              <el-date-picker
+                v-model="formData.firstPowerTime"
+                type="date"
+                placeholder="选择日期"
+                value-format="YYYY-MM-DD"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="账户状态" prop="electricityAccountStatus">
+              <el-select
+                v-model="formData.electricityAccountStatus"
+                placeholder="请选择"
+                class="w-full"
+              >
+                <el-option label="正常" value="正常" />
+                <el-option label="暂停" value="暂停" />
+                <el-option label="注销" value="注销" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="欠费金额(元)" prop="arrearsAmount">
+              <el-input-number v-model="formData.arrearsAmount" :min="0" class="w-full" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="近两年违约次数" prop="defaultTimesInTwoYears">
+              <el-input-number v-model="formData.defaultTimesInTwoYears" :min="0" class="w-full" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="价值等级" prop="valueLevel">
+              <el-select v-model="formData.valueLevel" placeholder="请选择" class="w-full">
+                <el-option label="高" value="高" />
+                <el-option label="中" value="中" />
+                <el-option label="低" value="低" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="风险等级" prop="riskLevel">
+              <el-select v-model="formData.riskLevel" placeholder="请选择" class="w-full">
+                <el-option label="高" value="高" />
+                <el-option label="中" value="中" />
+                <el-option label="低" value="低" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="近3月均用电金额" prop="avgElectricityAmountLast3Months">
+              <el-input-number
+                v-model="formData.avgElectricityAmountLast3Months"
+                :min="0"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="近6月均用电金额" prop="avgElectricityAmountLast6Months">
+              <el-input-number
+                v-model="formData.avgElectricityAmountLast6Months"
+                :min="0"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="近一年均用电金额" prop="avgElectricityAmountLastYear">
+              <el-input-number
+                v-model="formData.avgElectricityAmountLastYear"
+                :min="0"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="当前是否欠费" prop="isArrearsNow">
+              <el-select v-model="formData.isArrearsNow" placeholder="请选择" class="w-full">
+                <el-option label="是" value="是" />
+                <el-option label="否" value="否" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="统计时间" prop="statisticsTime">
+              <el-date-picker
+                v-model="formData.statisticsTime"
+                type="datetime"
+                placeholder="选择日期时间"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="统计基准日期" prop="statisticsBaselineDate">
+              <el-date-picker
+                v-model="formData.statisticsBaselineDate"
+                type="date"
+                placeholder="选择日期"
+                value-format="YYYY-MM-DD"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="行政区域编码" prop="administrativeRegionCode">
+              <el-input
+                v-model="formData.administrativeRegionCode"
+                placeholder="请输入行政区域编码"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="formData.remarks" type="textarea" :rows="3" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+
+      <template #footer>
+        <el-button @click="dialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="handleSubmit" :loading="submitLoading">确定</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { onMounted, reactive, ref } from 'vue'
+import { clientDownloadExcel, clientGet, clientPost } from '@/utils/request'
+import type { FormInstance } from 'element-plus'
+import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
+import { Delete, Download, Edit, Plus, Refresh, Search, Upload } from '@element-plus/icons-vue'
+
+interface BaseResponse {
+  code: number
+  msg: string
+}
+
+interface PageType<T> {
+  records: T[]
+  total: number
+  size: number
+  current: number
+  pages: number
+}
+
+interface Property {
+  id: string
+  contractCapacity?: number
+  firstPowerTime?: string
+  electricityAccountStatus?: string
+  arrearsAmount?: number
+  defaultTimesInTwoYears?: number
+  electricityType?: string
+  province?: string
+  city?: string
+  valueLevel?: string
+  riskLevel?: string
+  avgElectricityAmountLast3Months?: number
+  avgElectricityAmountLast6Months?: number
+  avgElectricityAmountLastYear?: number
+  isArrearsNow?: string
+  statisticsTime?: string
+  statisticsBaselineDate?: string
+  remarks?: string
+  administrativeRegionCode?: string
+  createTime?: string
+}
+
+interface PropertyOneResponse extends BaseResponse {
+  data: Property
+}
+
+interface PropertyListResponse extends BaseResponse {
+  data: PageType<Property>
+}
+
+interface AddProperty {
+  contractCapacity?: number
+  firstPowerTime?: string
+  electricityAccountStatus?: string
+  arrearsAmount?: number
+  defaultTimesInTwoYears?: number
+  electricityType?: string
+  province?: string
+  city?: string
+  valueLevel?: string
+  riskLevel?: string
+  avgElectricityAmountLast3Months?: number
+  avgElectricityAmountLast6Months?: number
+  avgElectricityAmountLastYear?: number
+  isArrearsNow?: string
+  statisticsTime?: string
+  statisticsBaselineDate?: string
+  remarks?: string
+  administrativeRegionCode?: string
+}
+
+interface UpdateProperty extends AddProperty {
+  id?: string
+}
+
+const base_url = import.meta.env.VITE_APP_BASE_API
+
+// 搜索表单
+const searchForm = reactive({
+  electricityType: '',
+  valueLevel: '',
+  riskLevel: '',
+  isArrearsNow: '',
+})
+
+// 表格数据
+const tableData = ref<Property[]>([])
+const loading = ref(false)
+const selectedIds = ref<string[]>([])
+
+// 分页
+const pagination = reactive({
+  current: 1,
+  size: 10,
+  total: 0,
+})
+
+// 对话框
+const dialogVisible = ref(false)
+const dialogTitle = ref('新增')
+const formRef = ref<FormInstance>()
+const submitLoading = ref(false)
+
+// 表单数据
+const formData = reactive<UpdateProperty>({
+  id: undefined,
+  contractCapacity: undefined,
+  firstPowerTime: '',
+  electricityAccountStatus: '',
+  arrearsAmount: undefined,
+  defaultTimesInTwoYears: undefined,
+  electricityType: '',
+  province: '',
+  city: '',
+  valueLevel: '',
+  riskLevel: '',
+  avgElectricityAmountLast3Months: undefined,
+  avgElectricityAmountLast6Months: undefined,
+  avgElectricityAmountLastYear: undefined,
+  isArrearsNow: '',
+  statisticsTime: '',
+  statisticsBaselineDate: '',
+  remarks: '',
+  administrativeRegionCode: '',
+})
+
+// 表单验证规则
+const formRules = {
+  electricityType: [{ required: true, message: '请选择用电类型', trigger: 'change' }],
+}
+
+// 上传配置
+const uploadUrl = ref(`${base_url}/eElectricityCustomer/importData`)
+const uploadHeaders = ref({
+  Authorization: localStorage.getItem('token') || '',
+})
+
+// 获取列表数据
+const getList = async () => {
+  loading.value = true
+  try {
+    const params: any = {
+      pageNum: pagination.current,
+      pageSize: pagination.size,
+    }
+
+    // 添加搜索条件
+    if (searchForm.electricityType) params.electricityType = searchForm.electricityType
+    if (searchForm.valueLevel) params.valueLevel = searchForm.valueLevel
+    if (searchForm.riskLevel) params.riskLevel = searchForm.riskLevel
+    if (searchForm.isArrearsNow) params.isArrearsNow = searchForm.isArrearsNow
+
+    const res = await clientGet<any, PropertyListResponse>('/eElectricityCustomer/findByPage', {
+      params,
+    })
+
+    if (res.code !== 200) {
+      ElMessage.error(res.msg)
+      return
+    }
+
+    tableData.value = res.data.records
+    pagination.total = res.data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+// 搜索
+const handleSearch = () => {
+  pagination.current = 1
+  getList()
+}
+
+// 重置
+const handleReset = () => {
+  Object.assign(searchForm, {
+    electricityType: '',
+    valueLevel: '',
+    riskLevel: '',
+    isArrearsNow: '',
+  })
+  handleSearch()
+}
+
+// 新增
+const handleAdd = () => {
+  dialogTitle.value = '新增'
+  dialogVisible.value = true
+}
+
+// 编辑
+const handleEdit = async (row: Property) => {
+  dialogTitle.value = '编辑'
+  dialogVisible.value = true
+
+  // 获取详情数据
+  const res = await clientGet<null, PropertyOneResponse>(`/eElectricityCustomer/getById/${row.id}`)
+  if (res.code !== 200) {
+    ElMessage.error(res.msg)
+    return
+  }
+
+  Object.assign(formData, res.data)
+}
+
+// 删除
+const handleDelete = (row: Property) => {
+  ElMessageBox.confirm('确定要删除该数据吗?', '提示', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning',
+  }).then(async () => {
+    const success = await delBatch([row.id])
+    if (success) {
+      getList()
+    }
+  })
+}
+
+// 批量删除
+const handleBatchDelete = () => {
+  ElMessageBox.confirm(`确定要删除选中的 ${selectedIds.value.length} 条数据吗?`, '提示', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning',
+  }).then(async () => {
+    const success = await delBatch(selectedIds.value)
+    if (success) {
+      selectedIds.value = []
+      getList()
+    }
+  })
+}
+
+// 删除接口
+const delBatch = async (ids: string[]) => {
+  const res = await clientPost<string[], BaseResponse>('/eElectricityCustomer/deleteBatch', ids)
+  if (res.code !== 200) {
+    ElMessage.error(res.msg)
+    return false
+  }
+  ElMessage.success(res.msg)
+  return true
+}
+
+// 导出
+const handleExport = async () => {
+  const loading = ElLoading.service({
+    lock: true,
+    text: '导出中,请稍候...',
+    background: 'rgba(0, 0, 0, 0.1)',
+    fullscreen: true,
+  })
+
+  try {
+    await clientDownloadExcel('/eElectricityCustomer/exportData')
+    ElMessage.success('导出成功')
+  } catch (error) {
+    console.error('导出失败:', error)
+    ElMessage.error('导出失败')
+  } finally {
+    loading.close()
+  }
+}
+
+// 上传前校验
+const beforeUpload = (file: File) => {
+  const isExcel =
+    file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
+    file.type === 'application/vnd.ms-excel'
+  if (!isExcel) {
+    ElMessage.error('只能上传 Excel 文件!')
+    return false
+  }
+  const isLt10M = file.size / 1024 / 1024 < 10
+  if (!isLt10M) {
+    ElMessage.error('文件大小不能超过 10MB!')
+    return false
+  }
+  return true
+}
+
+// 上传成功
+const handleUploadSuccess = (response: BaseResponse) => {
+  if (response.code === 200) {
+    ElMessage.success(response.msg || '导入成功')
+    getList()
+  } else {
+    ElMessage.error(response.msg || '导入失败')
+  }
+}
+
+// 上传失败
+const handleUploadError = () => {
+  ElMessage.error('导入失败')
+}
+
+// 表格选择
+const handleSelectionChange = (selection: Property[]) => {
+  selectedIds.value = selection.map((item) => item.id)
+}
+
+// 分页大小改变
+const handleSizeChange = (size: number) => {
+  pagination.size = size
+  getList()
+}
+
+// 当前页改变
+const handleCurrentChange = (current: number) => {
+  pagination.current = current
+  getList()
+}
+
+// 提交表单
+const handleSubmit = async () => {
+  if (!formRef.value) return
+
+  await formRef.value.validate(async (valid) => {
+    if (!valid) return
+
+    submitLoading.value = true
+    try {
+      let success = false
+      if (formData.id) {
+        // 编辑
+        const res = await clientPost<UpdateProperty, BaseResponse>(
+          '/eElectricityCustomer/update',
+          formData,
+        )
+        if (res.code !== 200) {
+          ElMessage.error(res.msg)
+          return
+        }
+        ElMessage.success(res.msg)
+        success = true
+      } else {
+        // 新增
+        const res = await clientPost<AddProperty, BaseResponse>(
+          '/eElectricityCustomer/save',
+          formData,
+        )
+        if (res.code !== 200) {
+          ElMessage.error(res.msg)
+          return
+        }
+        ElMessage.success(res.msg)
+        success = true
+      }
+
+      if (success) {
+        dialogVisible.value = false
+        getList()
+      }
+    } finally {
+      submitLoading.value = false
+    }
+  })
+}
+
+// 对话框关闭
+const handleDialogClose = () => {
+  formRef.value?.resetFields()
+  Object.assign(formData, {
+    id: undefined,
+    contractCapacity: undefined,
+    firstPowerTime: '',
+    electricityAccountStatus: '',
+    arrearsAmount: undefined,
+    defaultTimesInTwoYears: undefined,
+    electricityType: '',
+    province: '',
+    city: '',
+    valueLevel: '',
+    riskLevel: '',
+    avgElectricityAmountLast3Months: undefined,
+    avgElectricityAmountLast6Months: undefined,
+    avgElectricityAmountLastYear: undefined,
+    isArrearsNow: '',
+    statisticsTime: '',
+    statisticsBaselineDate: '',
+    remarks: '',
+    administrativeRegionCode: '',
+  })
+}
+
+onMounted(() => {
+  getList()
+})
+</script>
+
+<style scoped>
+.w-200px {
+  width: 200px;
+}
+</style>

+ 751 - 0
src/views/gysyfgl/rqgl/index.vue

@@ -0,0 +1,751 @@
+<script setup lang="ts">
+import { onMounted, reactive, ref } from 'vue'
+import { clientDownloadExcel, clientGet, clientPost } from '@/utils/request.ts'
+import type { FormInstance, UploadProps } from 'element-plus'
+import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
+import { Delete, Download, Edit, Plus, Refresh, Search, Upload } from '@element-plus/icons-vue'
+
+interface BaseResponse {
+  code: number
+  msg: string
+}
+
+interface PageType<T> {
+  records: T[]
+  total: number
+  size: number
+  current: number
+  pages: number
+}
+
+interface Property {
+  id: string
+  enterpriseName?: string
+  unifiedSocialCreditCode?: string
+  gasUserInfo?: string
+  openingDate?: string
+  userAddress?: string
+  prepaidAmount?: number
+  arrearsAmount?: number
+  isOneHouseholdTable?: string
+  gasFeeDetails?: string
+  paymentDeadline?: string
+  avgGasUsageLast3Months?: number
+  avgGasUsageLast6Months?: number
+  isArrearsNow?: string
+  statisticsDate?: string
+  statisticsBaselineDate?: string
+  remarks?: string
+  administrativeRegionCode?: string
+  town?: string
+  createTime?: string
+}
+
+interface PropertyOneResponse extends BaseResponse {
+  data: Property
+}
+
+interface PropertyListResponse extends BaseResponse {
+  data: PageType<Property>
+}
+
+interface AddProperty {
+  enterpriseName?: string
+  unifiedSocialCreditCode?: string
+  gasUserInfo?: string
+  openingDate?: string
+  userAddress?: string
+  prepaidAmount?: number
+  arrearsAmount?: number
+  isOneHouseholdTable?: string
+  gasFeeDetails?: string
+  paymentDeadline?: string
+  avgGasUsageLast3Months?: number
+  avgGasUsageLast6Months?: number
+  isArrearsNow?: string
+  statisticsDate?: string
+  statisticsBaselineDate?: string
+  remarks?: string
+  administrativeRegionCode?: string
+  town?: string
+}
+
+interface UpdateProperty extends AddProperty {
+  id?: string
+}
+
+// 搜索表单
+const searchForm = reactive({
+  enterpriseName: '',
+  unifiedSocialCreditCode: '',
+  isOneHouseholdTable: '',
+  isArrearsNow: '',
+})
+
+// 分页参数
+const pagination = reactive({
+  current: 1,
+  size: 10,
+  total: 0,
+})
+
+// 表格数据
+const tableData = ref<Property[]>([])
+const tableLoading = ref(false)
+
+// 选中的行
+const selectedRows = ref<Property[]>([])
+
+// 对话框
+const dialogVisible = ref(false)
+const dialogTitle = ref('新增')
+const formRef = ref<FormInstance>()
+const formData = reactive<UpdateProperty>({
+  id: '',
+  enterpriseName: '',
+  unifiedSocialCreditCode: '',
+  gasUserInfo: '',
+  openingDate: '',
+  userAddress: '',
+  prepaidAmount: undefined,
+  arrearsAmount: undefined,
+  isOneHouseholdTable: '',
+  gasFeeDetails: '',
+  paymentDeadline: '',
+  avgGasUsageLast3Months: undefined,
+  avgGasUsageLast6Months: undefined,
+  isArrearsNow: '',
+  statisticsDate: '',
+  statisticsBaselineDate: '',
+  remarks: '',
+  administrativeRegionCode: '',
+  town: '',
+})
+
+// 表单验证规则
+const formRules = {
+  openingDate: [{ required: true, message: '请选择开户日期', trigger: 'change' }],
+  paymentDeadline: [{ required: true, message: '请输入缴费所属期', trigger: 'blur' }],
+  statisticsDate: [{ required: true, message: '请选择统计日期', trigger: 'change' }],
+}
+
+// 获取列表数据
+const getList = async () => {
+  tableLoading.value = true
+  try {
+    const params: any = {
+      pageNum: pagination.current,
+      pageSize: pagination.size,
+    }
+
+    // 添加搜索条件
+    if (searchForm.enterpriseName) params.enterpriseName = searchForm.enterpriseName
+    if (searchForm.unifiedSocialCreditCode)
+      params.unifiedSocialCreditCode = searchForm.unifiedSocialCreditCode
+    if (searchForm.isOneHouseholdTable) params.isOneHouseholdTable = searchForm.isOneHouseholdTable
+    if (searchForm.isArrearsNow) params.isArrearsNow = searchForm.isArrearsNow
+
+    const res = await clientGet<any, PropertyListResponse>('/eGasCustomer/findByPage', { params })
+
+    if (res.code !== 200) {
+      ElMessage.error(res.msg)
+      return
+    }
+
+    tableData.value = res.data.records
+    pagination.total = res.data.total
+  } catch (error) {
+    console.error('获取列表失败:', error)
+    ElMessage.error('获取列表失败')
+  } finally {
+    tableLoading.value = false
+  }
+}
+
+// 搜索
+const handleSearch = () => {
+  pagination.current = 1
+  getList()
+}
+
+// 重置搜索
+const handleReset = () => {
+  searchForm.enterpriseName = ''
+  searchForm.unifiedSocialCreditCode = ''
+  searchForm.isOneHouseholdTable = ''
+  searchForm.isArrearsNow = ''
+  handleSearch()
+}
+
+// 分页改变
+const handlePageChange = (page: number) => {
+  pagination.current = page
+  getList()
+}
+
+const handleSizeChange = (size: number) => {
+  pagination.size = size
+  pagination.current = 1
+  getList()
+}
+
+// 表格选择改变
+const handleSelectionChange = (rows: Property[]) => {
+  selectedRows.value = rows
+}
+
+// 新增
+const handleAdd = () => {
+  dialogTitle.value = '新增'
+  dialogVisible.value = true
+  resetForm()
+}
+
+// 编辑
+const handleEdit = async (row: Property) => {
+  dialogTitle.value = '编辑'
+  dialogVisible.value = true
+
+  const data = await getById(row.id)
+  if (data) {
+    Object.assign(formData, data)
+  }
+}
+
+// 根据id获取数据
+const getById = async (id: string) => {
+  const res = await clientGet<null, PropertyOneResponse>('/eGasCustomer/getById/' + id)
+  if (res.code !== 200) {
+    ElMessage.error(res.msg)
+    return null
+  }
+  return res.data
+}
+
+// 删除
+const handleDelete = async (row: Property) => {
+  try {
+    await ElMessageBox.confirm('确定要删除该数据吗?', '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning',
+    })
+
+    const success = await delBatch([row.id])
+    if (success) {
+      getList()
+    }
+  } catch (error) {
+    // 用户取消删除
+  }
+}
+
+// 批量删除
+const handleBatchDelete = async () => {
+  if (selectedRows.value.length === 0) {
+    ElMessage.warning('请选择要删除的数据')
+    return
+  }
+
+  try {
+    await ElMessageBox.confirm(`确定要删除选中的 ${selectedRows.value.length} 条数据吗?`, '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning',
+    })
+
+    const ids = selectedRows.value.map((row) => row.id)
+    const success = await delBatch(ids)
+    if (success) {
+      getList()
+    }
+  } catch (error) {
+    // 用户取消删除
+  }
+}
+
+// 批量删除接口
+const delBatch = async (ids: string[]) => {
+  const res = await clientPost<string[], BaseResponse>('/eGasCustomer/deleteBatch', ids)
+  if (res.code !== 200) {
+    ElMessage.error(res.msg)
+    return false
+  }
+  ElMessage.success(res.msg)
+  return true
+}
+
+// 提交表单
+const handleSubmit = async () => {
+  if (!formRef.value) return
+
+  await formRef.value.validate(async (valid) => {
+    if (valid) {
+      let success = false
+      if (formData.id) {
+        // 编辑
+        success = await update(formData)
+      } else {
+        // 新增
+        success = await add(formData)
+      }
+
+      if (success) {
+        dialogVisible.value = false
+        getList()
+      }
+    }
+  })
+}
+
+// 新增接口
+const add = async (data: AddProperty) => {
+  const res = await clientPost<AddProperty, BaseResponse>('/eGasCustomer/save', { ...data })
+
+  if (res.code !== 200) {
+    ElMessage.error(res.msg)
+    return false
+  }
+
+  ElMessage.success(res.msg)
+  return true
+}
+
+// 修改接口
+const update = async (data: UpdateProperty) => {
+  const res = await clientPost<UpdateProperty, BaseResponse>('/eGasCustomer/update', { ...data })
+  if (res.code !== 200) {
+    ElMessage.error(res.msg)
+    return false
+  }
+  ElMessage.success(res.msg)
+  return true
+}
+
+// 重置表单
+const resetForm = () => {
+  formData.id = ''
+  formData.enterpriseName = ''
+  formData.unifiedSocialCreditCode = ''
+  formData.gasUserInfo = ''
+  formData.openingDate = ''
+  formData.userAddress = ''
+  formData.prepaidAmount = undefined
+  formData.arrearsAmount = undefined
+  formData.isOneHouseholdTable = ''
+  formData.gasFeeDetails = ''
+  formData.paymentDeadline = ''
+  formData.avgGasUsageLast3Months = undefined
+  formData.avgGasUsageLast6Months = undefined
+  formData.isArrearsNow = ''
+  formData.statisticsDate = ''
+  formData.statisticsBaselineDate = ''
+  formData.remarks = ''
+  formData.administrativeRegionCode = ''
+  formData.town = ''
+  formRef.value?.clearValidate()
+}
+
+// 导出Excel
+const handleExport = async () => {
+  const loading = ElLoading.service({
+    lock: true,
+    text: '导出中,请稍候...',
+    background: 'rgba(0, 0, 0, 0.1)',
+    fullscreen: true,
+  })
+
+  try {
+    await clientDownloadExcel('/eGasCustomer/exportData')
+    ElMessage.success('导出成功')
+  } catch (error) {
+    console.error('导出失败:', error)
+    ElMessage.error('导出失败')
+  } finally {
+    loading.close()
+  }
+}
+
+// 导入Excel
+const handleImport: UploadProps['onChange'] = async (uploadFile) => {
+  const file = uploadFile.raw
+  if (!file) return
+
+  // 验证文件类型
+  const isExcel =
+    file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
+    file.type === 'application/vnd.ms-excel'
+  if (!isExcel) {
+    ElMessage.error('只能上传 Excel 文件')
+    return
+  }
+
+  // 验证文件大小(10MB)
+  const isLt10M = file.size / 1024 / 1024 < 10
+  if (!isLt10M) {
+    ElMessage.error('文件大小不能超过 10MB')
+    return
+  }
+
+  const formData = new FormData()
+  formData.append('file', file)
+
+  const loading = ElLoading.service({
+    lock: true,
+    text: '导入中,请稍候...',
+    background: 'rgba(0, 0, 0, 0.1)',
+    fullscreen: true,
+  })
+
+  try {
+    const res = await clientPost<FormData, BaseResponse>('/eGasCustomer/importData', formData, {
+      headers: {
+        'Content-Type': 'multipart/form-data',
+      },
+    })
+
+    if (res.code !== 200) {
+      ElMessage.error(res.msg)
+      return
+    }
+
+    ElMessage.success(res.msg)
+    getList()
+  } catch (error) {
+    console.error('导入失败:', error)
+    ElMessage.error('导入失败')
+  } finally {
+    loading.close()
+  }
+}
+
+onMounted(() => {
+  getList()
+})
+</script>
+
+<template>
+  <div class="p-4">
+    <!-- 搜索表单 -->
+    <el-card class="mb-4">
+      <el-form :model="searchForm" inline>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">企业名称:</span>
+          </template>
+          <el-input
+            size="default"
+            v-model="searchForm.enterpriseName"
+            placeholder="请输入企业名称"
+            clearable
+            class="w-200px"
+          />
+        </el-form-item>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">统一社会信用代码:</span>
+          </template>
+          <el-input
+            size="default"
+            v-model="searchForm.unifiedSocialCreditCode"
+            placeholder="请输入统一社会信用代码"
+            clearable
+            class="w-200px"
+          />
+        </el-form-item>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">是否一户一表:</span>
+          </template>
+          <el-select
+            size="default"
+            v-model="searchForm.isOneHouseholdTable"
+            placeholder="请选择"
+            clearable
+            class="w-180px"
+          >
+            <el-option label="是" value="是" />
+            <el-option label="否" value="否" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">当前是否欠费:</span>
+          </template>
+          <el-select
+            size="default"
+            v-model="searchForm.isArrearsNow"
+            placeholder="请选择"
+            clearable
+            class="w-180px"
+          >
+            <el-option label="是" value="是" />
+            <el-option label="否" value="否" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button size="default" type="primary" :icon="Search" @click="handleSearch"
+            >搜索</el-button
+          >
+          <el-button size="default" :icon="Refresh" @click="handleReset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+
+    <!-- 操作按钮 -->
+    <el-card class="mb-4">
+      <div class="flex justify-between items-center">
+        <div class="flex gap-2">
+          <el-button size="default" type="primary" :icon="Plus" @click="handleAdd">新增</el-button>
+          <el-button
+            size="default"
+            type="danger"
+            :icon="Delete"
+            @click="handleBatchDelete"
+            :disabled="selectedRows.length === 0"
+            >批量删除</el-button
+          >
+          <el-button size="default" type="success" :icon="Download" @click="handleExport"
+            >导出</el-button
+          >
+          <el-upload
+            :show-file-list="false"
+            :auto-upload="false"
+            :on-change="handleImport"
+            accept=".xlsx,.xls"
+            class="inline-block ml-2"
+          >
+            <el-button size="default" type="warning" :icon="Upload">导入</el-button>
+          </el-upload>
+        </div>
+      </div>
+    </el-card>
+
+    <!-- 数据表格 -->
+    <el-card>
+      <el-table
+        :data="tableData"
+        :loading="tableLoading"
+        border
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="enterpriseName" label="企业名称" min-width="150" />
+        <el-table-column prop="unifiedSocialCreditCode" label="统一社会信用代码" min-width="180" />
+        <el-table-column prop="gasUserInfo" label="燃气用户信息" min-width="150" />
+        <el-table-column prop="openingDate" label="开户日期" width="120" />
+        <el-table-column prop="userAddress" label="用户地址" min-width="200" />
+        <el-table-column prop="prepaidAmount" label="预交金额" width="120" />
+        <el-table-column prop="arrearsAmount" label="欠费金额" width="120" />
+        <el-table-column prop="isOneHouseholdTable" label="是否一户一表" width="120" />
+        <el-table-column prop="gasFeeDetails" label="缴纳燃气费明细" min-width="150" />
+        <el-table-column prop="paymentDeadline" label="缴费所属期" width="120" />
+        <el-table-column prop="avgGasUsageLast3Months" label="近3个月月均燃气用量" width="160" />
+        <el-table-column prop="avgGasUsageLast6Months" label="近6个月月均燃气用量" width="160" />
+        <el-table-column prop="isArrearsNow" label="当前是否欠费" width="120" />
+        <el-table-column prop="statisticsDate" label="统计日期" width="120" />
+        <el-table-column prop="statisticsBaselineDate" label="统计基准日期" width="130" />
+        <el-table-column prop="administrativeRegionCode" label="行政区域代码" width="130" />
+        <el-table-column prop="town" label="乡镇" width="100" />
+        <el-table-column prop="remarks" label="备注" min-width="150" />
+        <el-table-column label="操作" width="150" fixed="right" align="center">
+          <template #default="{ row }">
+            <el-button link type="primary" :icon="Edit" @click="handleEdit(row)">编辑</el-button>
+            <el-button link type="danger" :icon="Delete" @click="handleDelete(row)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 分页 -->
+      <div class="mt-4 flex justify-end">
+        <el-pagination
+          v-model:current-page="pagination.current"
+          v-model:page-size="pagination.size"
+          :page-sizes="[10, 20, 50, 100]"
+          :total="pagination.total"
+          layout="total, sizes, prev, pager, next, jumper"
+          @size-change="handleSizeChange"
+          @current-change="handlePageChange"
+        />
+      </div>
+    </el-card>
+
+    <!-- 新增/编辑对话框 -->
+    <el-dialog
+      v-model="dialogVisible"
+      :title="dialogTitle"
+      width="800px"
+      :close-on-click-modal="false"
+    >
+      <el-form ref="formRef" :model="formData" :rules="formRules" label-width="140px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="企业名称" prop="enterpriseName">
+              <el-input v-model="formData.enterpriseName" placeholder="请输入企业名称" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="统一社会信用代码" prop="unifiedSocialCreditCode">
+              <el-input
+                v-model="formData.unifiedSocialCreditCode"
+                placeholder="请输入统一社会信用代码"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="燃气用户信息" prop="gasUserInfo">
+              <el-input v-model="formData.gasUserInfo" placeholder="请输入燃气用户信息" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="开户日期" prop="openingDate">
+              <el-date-picker
+                v-model="formData.openingDate"
+                type="date"
+                placeholder="请选择开户日期"
+                value-format="YYYY-MM-DD"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="用户地址" prop="userAddress">
+              <el-input v-model="formData.userAddress" placeholder="请输入用户地址" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="预交金额" prop="prepaidAmount">
+              <el-input-number
+                v-model="formData.prepaidAmount"
+                :precision="2"
+                :min="0"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="欠费金额" prop="arrearsAmount">
+              <el-input-number
+                v-model="formData.arrearsAmount"
+                :precision="2"
+                :min="0"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="是否一户一表" prop="isOneHouseholdTable">
+              <el-select v-model="formData.isOneHouseholdTable" placeholder="请选择" class="w-full">
+                <el-option label="是" value="是" />
+                <el-option label="否" value="否" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="缴费所属期" prop="paymentDeadline">
+              <el-input v-model="formData.paymentDeadline" placeholder="请输入缴费所属期" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="缴纳燃气费明细" prop="gasFeeDetails">
+              <el-input
+                v-model="formData.gasFeeDetails"
+                type="textarea"
+                :rows="2"
+                placeholder="请输入缴纳燃气费明细"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="近3个月月均燃气用量" prop="avgGasUsageLast3Months">
+              <el-input-number
+                v-model="formData.avgGasUsageLast3Months"
+                :precision="2"
+                :min="0"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="近6个月月均燃气用量" prop="avgGasUsageLast6Months">
+              <el-input-number
+                v-model="formData.avgGasUsageLast6Months"
+                :precision="2"
+                :min="0"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="当前是否欠费" prop="isArrearsNow">
+              <el-select v-model="formData.isArrearsNow" placeholder="请选择" class="w-full">
+                <el-option label="是" value="是" />
+                <el-option label="否" value="否" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="统计日期" prop="statisticsDate">
+              <el-date-picker
+                v-model="formData.statisticsDate"
+                type="date"
+                placeholder="请选择统计日期"
+                value-format="YYYY-MM-DD"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="统计基准日期" prop="statisticsBaselineDate">
+              <el-date-picker
+                v-model="formData.statisticsBaselineDate"
+                type="date"
+                placeholder="请选择统计基准日期"
+                value-format="YYYY-MM-DD"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="行政区域代码" prop="administrativeRegionCode">
+              <el-input
+                v-model="formData.administrativeRegionCode"
+                placeholder="请输入行政区域代码"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="乡镇" prop="town">
+              <el-input v-model="formData.town" placeholder="请输入乡镇" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remarks">
+              <el-input
+                v-model="formData.remarks"
+                type="textarea"
+                :rows="3"
+                placeholder="请输入备注"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <el-button @click="dialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="handleSubmit">确定</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<style scoped>
+.w-180px {
+  width: 180px;
+}
+
+.w-200px {
+  width: 200px;
+}
+</style>

+ 779 - 0
src/views/gysyfgl/sfgl/index.vue

@@ -0,0 +1,779 @@
+<script setup lang="ts">
+import { onMounted, reactive, ref } from 'vue'
+import { clientDownloadExcel, clientGet, clientPost } from '@/utils/request.ts'
+import type { FormInstance, UploadProps } from 'element-plus'
+import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
+import { Delete, Download, Edit, Plus, Refresh, Search, Upload } from '@element-plus/icons-vue'
+
+interface BaseResponse {
+  code: number
+  msg: string
+}
+
+interface PageType<T> {
+  records: T[]
+  total: number
+  size: number
+  current: number
+  pages: number
+}
+
+interface Property {
+  id: string
+  enterpriseName?: string
+  unifiedSocialCreditCode?: string
+  waterUserInfo?: string
+  openingDate?: string
+  userAddress?: string
+  prepaidAmount?: number
+  arrearsAmount?: number
+  isOneHouseholdTable?: string
+  waterFeeDetails?: string
+  avgWaterUsageLast3Months?: number
+  avgWaterUsageLast6Months?: number
+  isArrearsNow?: string
+  paymentPeriod?: string
+  statisticsDate?: string
+  statisticsBaselineDate?: string
+  remarks?: string
+  administrativeRegionCode?: string
+  createTime?: string
+}
+
+interface PropertyOneResponse extends BaseResponse {
+  data: Property
+}
+
+interface PropertyListResponse extends BaseResponse {
+  data: PageType<Property>
+}
+
+interface AddProperty {
+  enterpriseName?: string
+  unifiedSocialCreditCode?: string
+  waterUserInfo?: string
+  openingDate?: string
+  userAddress?: string
+  prepaidAmount?: number
+  arrearsAmount?: number
+  isOneHouseholdTable?: string
+  waterFeeDetails?: string
+  avgWaterUsageLast3Months?: number
+  avgWaterUsageLast6Months?: number
+  isArrearsNow?: string
+  paymentPeriod?: string
+  statisticsDate?: string
+  statisticsBaselineDate?: string
+  remarks?: string
+  administrativeRegionCode?: string
+}
+
+interface UpdateProperty {
+  id?: string
+  enterpriseName?: string
+  unifiedSocialCreditCode?: string
+  waterUserInfo?: string
+  openingDate?: string
+  userAddress?: string
+  prepaidAmount?: number
+  arrearsAmount?: number
+  isOneHouseholdTable?: string
+  waterFeeDetails?: string
+  avgWaterUsageLast3Months?: number
+  avgWaterUsageLast6Months?: number
+  isArrearsNow?: string
+  paymentPeriod?: string
+  statisticsDate?: string
+  statisticsBaselineDate?: string
+  remarks?: string
+  administrativeRegionCode?: string
+}
+
+// 搜索表单
+const searchForm = reactive({
+  isOneHouseholdTable: '',
+  isArrearsNow: '',
+  administrativeRegionCode: '',
+})
+
+// 分页参数
+const pagination = reactive({
+  current: 1,
+  size: 10,
+  total: 0,
+})
+
+// 表格数据
+const tableData = ref<Property[]>([])
+const tableLoading = ref(false)
+const selectedIds = ref<string[]>([])
+
+// 对话框
+const dialogVisible = ref(false)
+const dialogTitle = ref('新增用水客户')
+const formRef = ref<FormInstance>()
+const formData = reactive<AddProperty | UpdateProperty>({
+  enterpriseName: '',
+  unifiedSocialCreditCode: '',
+  waterUserInfo: '',
+  openingDate: '',
+  userAddress: '',
+  prepaidAmount: undefined,
+  arrearsAmount: undefined,
+  isOneHouseholdTable: '',
+  waterFeeDetails: '',
+  avgWaterUsageLast3Months: undefined,
+  avgWaterUsageLast6Months: undefined,
+  isArrearsNow: '',
+  paymentPeriod: '',
+  statisticsDate: '',
+  statisticsBaselineDate: '',
+  remarks: '',
+  administrativeRegionCode: '',
+})
+
+// 表单验证规则
+const formRules = {
+  enterpriseName: [{ required: true, message: '请输入企业名称', trigger: 'blur' }],
+  unifiedSocialCreditCode: [{ required: true, message: '请输入统一社会信用代码', trigger: 'blur' }],
+  waterUserInfo: [{ required: true, message: '请输入用水信息', trigger: 'blur' }],
+  isOneHouseholdTable: [{ required: true, message: '请选择是否一户一表', trigger: 'change' }],
+  isArrearsNow: [{ required: true, message: '请选择当前是否欠费', trigger: 'change' }],
+}
+
+// 获取列表数据
+const getList = async () => {
+  tableLoading.value = true
+  try {
+    const params: any = {
+      pageNum: pagination.current,
+      pageSize: pagination.size,
+    }
+
+    if (searchForm.isOneHouseholdTable) params.isOneHouseholdTable = searchForm.isOneHouseholdTable
+    if (searchForm.isArrearsNow) params.isArrearsNow = searchForm.isArrearsNow
+    if (searchForm.administrativeRegionCode)
+      params.administrativeRegionCode = searchForm.administrativeRegionCode
+
+    const res = await clientGet<any, PropertyListResponse>('/eWaterCustomer/findByPage', { params })
+
+    if (res.code !== 200) {
+      ElMessage.error(res.msg)
+      return
+    }
+
+    tableData.value = res.data.records
+    pagination.total = res.data.total
+  } finally {
+    tableLoading.value = false
+  }
+}
+
+// 搜索
+const handleSearch = () => {
+  pagination.current = 1
+  getList()
+}
+
+// 重置搜索
+const handleReset = () => {
+  searchForm.isOneHouseholdTable = ''
+  searchForm.isArrearsNow = ''
+  searchForm.administrativeRegionCode = ''
+  handleSearch()
+}
+
+// 分页变化
+const handlePageChange = (page: number) => {
+  pagination.current = page
+  getList()
+}
+
+const handleSizeChange = (size: number) => {
+  pagination.size = size
+  pagination.current = 1
+  getList()
+}
+
+// 表格选择
+const handleSelectionChange = (selection: Property[]) => {
+  selectedIds.value = selection.map((item) => item.id)
+}
+
+// 打开新增对话框
+const handleAdd = () => {
+  dialogTitle.value = '新增用水客户'
+  dialogVisible.value = true
+  resetForm()
+}
+
+// 打开编辑对话框
+const handleEdit = async (row: Property) => {
+  dialogTitle.value = '编辑用水客户'
+  const data = await getById(row.id)
+  if (data) {
+    Object.assign(formData, data)
+    dialogVisible.value = true
+  }
+}
+
+// 根据id获取数据
+const getById = async (id: string) => {
+  const res = await clientGet<null, PropertyOneResponse>('/eWaterCustomer/getById/' + id)
+  if (res.code !== 200) {
+    ElMessage.error(res.msg)
+    return null
+  }
+  return res.data
+}
+
+// 删除单个
+const handleDelete = (row: Property) => {
+  ElMessageBox.confirm('确定要删除该用水客户吗?', '提示', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning',
+  }).then(async () => {
+    const success = await delBatch([row.id])
+    if (success) {
+      getList()
+    }
+  })
+}
+
+// 批量删除
+const handleBatchDelete = () => {
+  if (selectedIds.value.length === 0) {
+    ElMessage.warning('请选择要删除的数据')
+    return
+  }
+
+  ElMessageBox.confirm(`确定要删除选中的 ${selectedIds.value.length} 条数据吗?`, '提示', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning',
+  }).then(async () => {
+    const success = await delBatch(selectedIds.value)
+    if (success) {
+      getList()
+    }
+  })
+}
+
+// 删除接口
+const delBatch = async (ids: string[]) => {
+  const res = await clientPost<string[], BaseResponse>('/eWaterCustomer/deleteBatch', ids)
+  if (res.code !== 200) {
+    ElMessage.error(res.msg)
+    return false
+  }
+  ElMessage.success(res.msg)
+  return true
+}
+
+// 提交表单
+const handleSubmit = async () => {
+  if (!formRef.value) return
+
+  await formRef.value.validate(async (valid) => {
+    if (valid) {
+      let success = false
+      if ((formData as UpdateProperty).id) {
+        success = await update(formData as UpdateProperty)
+      } else {
+        success = await add(formData as AddProperty)
+      }
+
+      if (success) {
+        dialogVisible.value = false
+        getList()
+      }
+    }
+  })
+}
+
+// 新增接口
+const add = async (data: AddProperty) => {
+  const res = await clientPost<AddProperty, BaseResponse>('/eWaterCustomer/save', data)
+  if (res.code !== 200) {
+    ElMessage.error(res.msg)
+    return false
+  }
+  ElMessage.success(res.msg)
+  return true
+}
+
+// 修改接口
+const update = async (data: UpdateProperty) => {
+  const res = await clientPost<UpdateProperty, BaseResponse>('/eWaterCustomer/update', data)
+  if (res.code !== 200) {
+    ElMessage.error(res.msg)
+    return false
+  }
+  ElMessage.success(res.msg)
+  return true
+}
+
+// 重置表单
+const resetForm = () => {
+  Object.assign(formData, {
+    id: undefined,
+    enterpriseName: '',
+    unifiedSocialCreditCode: '',
+    waterUserInfo: '',
+    openingDate: '',
+    userAddress: '',
+    prepaidAmount: undefined,
+    arrearsAmount: undefined,
+    isOneHouseholdTable: '',
+    waterFeeDetails: '',
+    avgWaterUsageLast3Months: undefined,
+    avgWaterUsageLast6Months: undefined,
+    isArrearsNow: '',
+    paymentPeriod: '',
+    statisticsDate: '',
+    statisticsBaselineDate: '',
+    remarks: '',
+    administrativeRegionCode: '',
+  })
+  formRef.value?.clearValidate()
+}
+
+// 导出Excel
+const handleExport = async () => {
+  const loading = ElLoading.service({
+    lock: true,
+    text: '导出中,请稍候...',
+    background: 'rgba(0, 0, 0, 0.1)',
+    fullscreen: true,
+  })
+
+  try {
+    await clientDownloadExcel('/eWaterCustomer/exportData')
+    ElMessage.success('导出成功')
+  } catch (error) {
+    console.error('导出失败:', error)
+    ElMessage.error('导出失败')
+  } finally {
+    loading.close()
+  }
+}
+
+// 导入Excel
+const handleImport: UploadProps['onChange'] = async (uploadFile) => {
+  const file = uploadFile.raw
+  if (!file) return
+
+  // 验证文件类型
+  const isExcel =
+    file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
+    file.type === 'application/vnd.ms-excel'
+  if (!isExcel) {
+    ElMessage.error('只能上传 Excel 文件!')
+    return
+  }
+
+  // 验证文件大小(10MB)
+  const isLt10M = file.size / 1024 / 1024 < 10
+  if (!isLt10M) {
+    ElMessage.error('文件大小不能超过 10MB!')
+    return
+  }
+
+  const formData = new FormData()
+  formData.append('file', file)
+
+  const loading = ElLoading.service({
+    lock: true,
+    text: '导入中,请稍候...',
+    background: 'rgba(0, 0, 0, 0.1)',
+    fullscreen: true,
+  })
+
+  try {
+    const res = await clientPost<FormData, BaseResponse>('/eWaterCustomer/importData', formData, {
+      headers: {
+        'Content-Type': 'multipart/form-data',
+      },
+    })
+
+    if (res.code !== 200) {
+      ElMessage.error(res.msg)
+      return
+    }
+
+    ElMessage.success(res.msg)
+    getList()
+  } catch (error) {
+    console.error('导入失败:', error)
+    ElMessage.error('导入失败')
+  } finally {
+    loading.close()
+  }
+}
+
+onMounted(() => {
+  getList()
+})
+</script>
+
+<template>
+  <div class="p-4">
+    <!-- 搜索表单 -->
+    <el-card class="mb-4">
+      <el-form :model="searchForm" inline>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">是否一户一表:</span>
+          </template>
+          <el-select
+            size="default"
+            v-model="searchForm.isOneHouseholdTable"
+            placeholder="请选择"
+            clearable
+            class="w-180px"
+          >
+            <el-option label="是" value="是" />
+            <el-option label="否" value="否" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">当前是否欠费:</span>
+          </template>
+          <el-select
+            size="default"
+            v-model="searchForm.isArrearsNow"
+            placeholder="请选择"
+            clearable
+            class="w-180px"
+          >
+            <el-option label="是" value="是" />
+            <el-option label="否" value="否" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">行政区域代码:</span>
+          </template>
+          <el-input
+            size="default"
+            v-model="searchForm.administrativeRegionCode"
+            placeholder="请输入行政区域代码"
+            clearable
+            class="w-180px"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button size="default" type="primary" :icon="Search" @click="handleSearch"
+            >搜索</el-button
+          >
+          <el-button size="default" :icon="Refresh" @click="handleReset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+
+    <!-- 操作按钮 -->
+    <el-card class="mb-4">
+      <div class="flex justify-between items-center">
+        <div class="flex gap-2">
+          <el-button size="default" type="primary" :icon="Plus" @click="handleAdd">新增</el-button>
+          <el-button
+            size="default"
+            type="danger"
+            :icon="Delete"
+            @click="handleBatchDelete"
+            :disabled="selectedIds.length === 0"
+            >批量删除</el-button
+          >
+          <el-button size="default" type="success" :icon="Download" @click="handleExport"
+            >导出</el-button
+          >
+          <el-upload
+            :show-file-list="false"
+            :on-change="handleImport"
+            :auto-upload="false"
+            accept=".xlsx,.xls"
+            class="inline-block ml-2"
+          >
+            <el-button size="default" type="warning" :icon="Upload">导入</el-button>
+          </el-upload>
+        </div>
+      </div>
+    </el-card>
+
+    <!-- 数据表格 -->
+    <el-card>
+      <el-table
+        :data="tableData"
+        :loading="tableLoading"
+        border
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column
+          prop="enterpriseName"
+          label="企业名称"
+          min-width="150"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          prop="unifiedSocialCreditCode"
+          label="统一社会信用代码"
+          min-width="180"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          prop="waterUserInfo"
+          label="用水信息"
+          min-width="150"
+          show-overflow-tooltip
+        />
+        <el-table-column prop="openingDate" label="开户日期" width="120" />
+        <el-table-column
+          prop="userAddress"
+          label="用户地址"
+          min-width="200"
+          show-overflow-tooltip
+        />
+        <el-table-column prop="prepaidAmount" label="预交金额" width="120" align="right">
+          <template #default="{ row }">
+            {{ row.prepaidAmount ? `¥${row.prepaidAmount.toFixed(2)}` : '-' }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="arrearsAmount" label="欠费金额" width="120" align="right">
+          <template #default="{ row }">
+            {{ row.arrearsAmount ? `¥${row.arrearsAmount.toFixed(2)}` : '-' }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="isOneHouseholdTable" label="是否一户一表" width="120" align="center">
+          <template #default="{ row }">
+            <el-tag :type="row.isOneHouseholdTable === '是' ? 'success' : 'info'">
+              {{ row.isOneHouseholdTable || '-' }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="avgWaterUsageLast3Months"
+          label="近3月月均用水量"
+          width="150"
+          align="right"
+        >
+          <template #default="{ row }">
+            {{ row.avgWaterUsageLast3Months ? `${row.avgWaterUsageLast3Months} m³` : '-' }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="avgWaterUsageLast6Months"
+          label="近6月月均用水量"
+          width="150"
+          align="right"
+        >
+          <template #default="{ row }">
+            {{ row.avgWaterUsageLast6Months ? `${row.avgWaterUsageLast6Months} m³` : '-' }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="isArrearsNow" label="当前是否欠费" width="120" align="center">
+          <template #default="{ row }">
+            <el-tag :type="row.isArrearsNow === '是' ? 'danger' : 'success'">
+              {{ row.isArrearsNow || '-' }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="paymentPeriod" label="缴费所属期" width="120" />
+        <el-table-column prop="statisticsDate" label="统计日期" width="120" />
+        <el-table-column prop="administrativeRegionCode" label="行政区域代码" width="130" />
+        <el-table-column prop="remarks" label="备注" min-width="150" show-overflow-tooltip />
+        <el-table-column label="操作" width="150" fixed="right" align="center">
+          <template #default="{ row }">
+            <el-button link type="primary" :icon="Edit" @click="handleEdit(row)">编辑</el-button>
+            <el-button link type="danger" :icon="Delete" @click="handleDelete(row)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 分页 -->
+      <div class="flex justify-end mt-4">
+        <el-pagination
+          v-model:current-page="pagination.current"
+          v-model:page-size="pagination.size"
+          :page-sizes="[10, 20, 50, 100]"
+          :total="pagination.total"
+          layout="total, sizes, prev, pager, next, jumper"
+          @size-change="handleSizeChange"
+          @current-change="handlePageChange"
+        />
+      </div>
+    </el-card>
+
+    <!-- 新增/编辑对话框 -->
+    <el-dialog
+      v-model="dialogVisible"
+      :title="dialogTitle"
+      width="800px"
+      :close-on-click-modal="false"
+    >
+      <el-form ref="formRef" :model="formData" :rules="formRules" label-width="140px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="企业名称" prop="enterpriseName">
+              <el-input v-model="formData.enterpriseName" placeholder="请输入企业名称" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="统一社会信用代码" prop="unifiedSocialCreditCode">
+              <el-input
+                v-model="formData.unifiedSocialCreditCode"
+                placeholder="请输入统一社会信用代码"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="用水信息" prop="waterUserInfo">
+              <el-input v-model="formData.waterUserInfo" placeholder="请输入用水信息(户名户号)" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="开户日期" prop="openingDate">
+              <el-date-picker
+                v-model="formData.openingDate"
+                type="date"
+                placeholder="请选择开户日期"
+                value-format="YYYY-MM-DD"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="用户地址" prop="userAddress">
+              <el-input v-model="formData.userAddress" placeholder="请输入用户地址" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="预交金额" prop="prepaidAmount">
+              <el-input-number
+                v-model="formData.prepaidAmount"
+                :precision="2"
+                :min="0"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="欠费金额" prop="arrearsAmount">
+              <el-input-number
+                v-model="formData.arrearsAmount"
+                :precision="2"
+                :min="0"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="是否一户一表" prop="isOneHouseholdTable">
+              <el-select v-model="formData.isOneHouseholdTable" placeholder="请选择" class="w-full">
+                <el-option label="是" value="是" />
+                <el-option label="否" value="否" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="当前是否欠费" prop="isArrearsNow">
+              <el-select v-model="formData.isArrearsNow" placeholder="请选择" class="w-full">
+                <el-option label="是" value="是" />
+                <el-option label="否" value="否" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="近3月月均用水量" prop="avgWaterUsageLast3Months">
+              <el-input-number
+                v-model="formData.avgWaterUsageLast3Months"
+                :precision="2"
+                :min="0"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="近6月月均用水量" prop="avgWaterUsageLast6Months">
+              <el-input-number
+                v-model="formData.avgWaterUsageLast6Months"
+                :precision="2"
+                :min="0"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="缴费所属期" prop="paymentPeriod">
+              <el-input v-model="formData.paymentPeriod" placeholder="请输入缴费所属期" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="统计日期" prop="statisticsDate">
+              <el-date-picker
+                v-model="formData.statisticsDate"
+                type="date"
+                placeholder="请选择统计日期"
+                value-format="YYYY-MM-DD"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="统计基准日期" prop="statisticsBaselineDate">
+              <el-date-picker
+                v-model="formData.statisticsBaselineDate"
+                type="date"
+                placeholder="请选择统计基准日期"
+                value-format="YYYY-MM-DD"
+                class="w-full"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="行政区域代码" prop="administrativeRegionCode">
+              <el-input
+                v-model="formData.administrativeRegionCode"
+                placeholder="请输入行政区域代码"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="缴纳水费明细" prop="waterFeeDetails">
+              <el-input
+                v-model="formData.waterFeeDetails"
+                type="textarea"
+                :rows="3"
+                placeholder="请输入缴纳水费明细"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remarks">
+              <el-input
+                v-model="formData.remarks"
+                type="textarea"
+                :rows="3"
+                placeholder="请输入备注"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
+      <template #footer>
+        <el-button @click="dialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="handleSubmit">确定</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<style scoped>
+.w-180px {
+  width: 180px;
+}
+</style>

+ 210 - 217
src/views/qygl/qybmgl/index.vue

@@ -1,207 +1,9 @@
-<template>
-  <div class="p-4">
-    <div class="mb-6 p-4 bg-white rounded-lg shadow-sm flex flex-wrap items-center gap-4">
-      <el-form :inline="true" :model="searchForm" class="flex-grow flex flex-wrap">
-        <el-form-item>
-          <span slot="label" class="font-size-4.5">部门名称:</span>
-          <el-input
-            v-model="searchForm.departmentName"
-            style="width: 240px"
-            size="default"
-            placeholder="请输入部门名称"
-            @clear="handleSearch"
-          />
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" :icon="Search" @click="handleSearch" size="search">查询
-          </el-button>
-          <el-button :icon="Refresh" @click="handleResetSearch" size="search">重置</el-button>
-        </el-form-item>
-      </el-form>
-
-      <div class="flex gap-1" style="justify-content:flex-end">
-        <el-button type="primary" :icon="Plus" @click="handleAdd" size="search">新增</el-button>
-        <el-button
-          type="danger"
-          :icon="Delete"
-          @click="handleBatchDelete"
-          :disabled="selectedIds.length === 0"
-          size="search"
-        >批量删除
-        </el-button
-        >
-        <el-button type="success" :icon="Download" @click="exportExcel" size="search">导出</el-button>
-        <el-upload
-          class="inline-block ml-2"
-          action="/api/edepartmentEmployeeStats/importData"
-          :show-file-list="false"
-          :on-success="handleUploadSuccess"
-          :on-error="handleUploadError"
-          :before-upload="handleBeforeUpload"
-          :http-request="(options) => importExcel(options.file)"
-        >
-          <el-button type="info" :icon="Upload" size="search">导入</el-button>
-        </el-upload>
-      </div>
-    </div>
-
-    <!-- Table -->
-    <div class="bg-white rounded-lg shadow-sm p-4 overflow-x-auto">
-      <el-table
-        :data="tableData"
-        style="width: 100%"
-        border
-        @selection-change="handleSelectionChange"
-        :cell-style="{ fontSize: '14px' }"
-        :header-cell-style="{ fontSize: '14px' }"
-        :row-style="{ fontSize: '14px' }"
-      >
-        <el-table-column type="selection" width="55" fixed="left"/>
-        <el-table-column prop="departmentName" label="部门名称" align="center"/>
-        <el-table-column prop="domesticEmployees" label="内籍员工数量	" align="center"/>
-        <el-table-column prop="educationDistribution" label="学历分布	" align="center"/>
-        <el-table-column prop="femaleRatio" label="女工比例" align="center"/>
-        <el-table-column prop="foreignEmployees" label="外籍员工数量" align="center"/>
-        <el-table-column prop="maleRatio" label="男工比例" align="center"/>
-        <el-table-column prop="totalEmployees" label="员工总数" align="center"/>
-        <el-table-column prop="ageDistribution" label="年龄分布" align="center"/>
-        <el-table-column label="操作" fixed="right" align="center">
-          <template #default="{ row }">
-            <el-button :icon="Edit" size="small" @click="handleEdit(row)">编辑</el-button>
-            <el-button type="danger" :icon="Delete" size="small" @click="handleDelete(row.id)"
-            >删除
-            </el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <!-- Pagination -->
-      <div class="mt-4 flex justify-end">
-        <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="pageNum"
-          :page-sizes="[10, 20, 50, 100]"
-          :page-size="pageSize"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="total"
-        />
-      </div>
-    </div>
-
-    <!-- Add/Edit Dialog -->
-    <el-dialog
-      v-model="dialogVisible"
-      :title="dialogTitle"
-      width="800px"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-    >
-      <el-form
-        :model="formData"
-        ref="formRef"
-        label-width="120px"
-        class="grid grid-cols-1 md:grid-cols-2 gap-4"
-      >
-        <el-form-item
-          label="部门名称"
-          prop="departmentName"
-          :rules="[{ required: true, message: '请输入部门名称', trigger: 'blur' }]"
-        >
-          <el-input v-model="formData.departmentName" placeholder="请输入部门名称"/>
-        </el-form-item>
-        <el-form-item
-          label="内籍员工数量"
-          prop="domesticEmployees"
-          :rules="[{ required: true, message: '请输入内籍员工数量', trigger: 'blur' }]"
-        >
-          <el-input
-            v-model="formData.domesticEmployees"
-            placeholder="请输入内籍员工数量"
-          />
-        </el-form-item>
-
-        <el-form-item
-          label="学历分布"
-          prop="educationDistribution"
-          :rules="[{ required: true, message: '请输入学历分布', trigger: 'blur' }]"
-        >
-          <el-input
-            v-model="formData.educationDistribution"
-            placeholder="请输入学历分布"
-          />
-        </el-form-item>
-        <el-form-item
-          label="女工比例"
-          prop="femaleRatio"
-          :rules="[{ required: true, message: '请输入女工比例', trigger: 'blur' }]"
-        >
-          <el-input
-            v-model="formData.femaleRatio"
-            placeholder="请输入女工比例"
-          />
-        </el-form-item>
-
-        <el-form-item
-          label="外籍员工数量"
-          prop="foreignEmployees"
-          :rules="[
-            { required: true, message: '请输入外籍员工数量', trigger: 'blur' },
-            { type: 'number', message: '请输入数字', trigger: 'blur' },
-          ]"
-        >
-          <el-input v-model.number="formData.foreignEmployees" placeholder="请输入外籍员工数量"/>
-        </el-form-item>
-        <el-form-item
-          label="男工比例"
-          prop="maleRatio"
-          :rules="[
-            { required: true, message: '请输入男工比例', trigger: 'blur' },
-            { type: 'number', message: '请输入数字', trigger: 'blur' },
-          ]"
-        >
-          <el-input v-model.number="formData.maleRatio" placeholder="请输入男工比例"/>
-        </el-form-item>
-
-
-        <el-form-item
-          label="员工总数"
-          prop="totalEmployees"
-          :rules="[
-            { required: true, message: '请输入员工总数', trigger: 'blur' },
-            { type: 'number', message: '请输入数字', trigger: 'blur' },
-          ]"
-        >
-          <el-input v-model.number="formData.totalEmployees" placeholder="请输入员工总数"/>
-        </el-form-item>
-        <el-form-item
-          label="年龄分布"
-          prop="ageDistribution"
-          :rules="[
-            { required: true, message: '请输入年龄分布', trigger: 'blur' },
-            { type: 'number', message: '请输入数字', trigger: 'blur' },
-          ]"
-        >
-          <el-input v-model.number="formData.ageDistribution" placeholder="请输入年龄分布"/>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="dialogVisible = false">取消</el-button>
-          <el-button type="primary" @click="handleConfirm">确定</el-button>
-        </span>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
 <script setup lang="ts">
-import {onMounted, reactive, ref} from 'vue'
-import {clientDownloadExcel, clientGet, clientPost} from '@/utils/request.ts'
-import type {FormInstance, UploadProps} from 'element-plus'
-import {ElForm, ElLoading, ElMessage, ElMessageBox} from 'element-plus'
-import {Delete, Download, Edit, Plus, Refresh, Search, Upload} from '@element-plus/icons-vue'
+import { onMounted, reactive, ref } from 'vue'
+import { clientDownloadExcel, clientGet, clientPost } from '@/utils/request.ts'
+import type { FormInstance, UploadProps } from 'element-plus'
+import { ElForm, ElLoading, ElMessage, ElMessageBox } from 'element-plus'
+import { Delete, Download, Edit, Plus, Refresh, Search, Upload } from '@element-plus/icons-vue'
 
 // 假设 BaseResponse 和 PageType 在全局或 request.ts 中已定义
 interface BaseResponse {
@@ -267,7 +69,7 @@ const pageSize = ref(10)
 const pageNum = ref(1)
 
 const searchForm = reactive({
-  departmentName: ''
+  departmentName: '',
 })
 
 const dialogVisible = ref(false)
@@ -276,11 +78,12 @@ const isEdit = ref(false)
 const formData = reactive<Property>({})
 const formRef = ref<FormInstance>()
 const selectedIds = ref<string[]>([])
+const base_url = import.meta.env.VITE_APP_BASE_API
 
 // 规上企业是否
 const arrearsOptions = [
-  {label: '是', value: '是'},
-  {label: '否', value: '否'},
+  { label: '是', value: '是' },
+  { label: '否', value: '否' },
 ]
 // 年度选项(动态生成最近5年)
 const currentYear = new Date().getFullYear()
@@ -299,7 +102,7 @@ const add = async (data: AddProperty) => {
   return true
 }
 
-// 根据id获取数据B650MP-EPROVER
+// 根据id获取数据
 const getById = async (id: string) => {
   const res = await clientGet<null, PropertyOneResponse>('/edepartmentEmployeeStats/getById/' + id)
   if (res.code !== 200) {
@@ -315,15 +118,17 @@ const getList = async () => {
   const params = {
     pageNum: pageNum.value,
     pageSize: pageSize.value,
-    ...(searchForm.departmentName ? {departmentName: searchForm.departmentName} : {})
+    ...(searchForm.departmentName ? { departmentName: searchForm.departmentName } : {}),
   }
 
-  const res = await clientGet<{
-    pageNum: number
-    pageSize: number
-    departmentName?: string
-  },
-    PropertyListResponse>('/edepartmentEmployeeStats/findByPage', {
+  const res = await clientGet<
+    {
+      pageNum: number
+      pageSize: number
+      departmentName?: string
+    },
+    PropertyListResponse
+  >('/edepartmentEmployeeStats/findByPage', {
     params,
   })
 
@@ -371,7 +176,7 @@ const exportExcel = async () => {
   try {
     // 构建参数对象,只包含有值的搜索条件
     const params = {
-      ...(searchForm.departmentName ? {departmentName: searchForm.departmentName} : {})
+      ...(searchForm.departmentName ? { departmentName: searchForm.departmentName } : {}),
     }
 
     await clientDownloadExcel('/edepartmentEmployeeStats/exportData', {
@@ -486,7 +291,7 @@ const handleConfirm = async () => {
   await formRef.value.validate(async (valid) => {
     if (valid) {
       let success = false
-      const dataToSend = {...formData}
+      const dataToSend = { ...formData }
 
       if (isEdit.value) {
         success = await update(dataToSend)
@@ -544,12 +349,200 @@ const handleBeforeUpload: UploadProps['beforeUpload'] = (rawFile) => {
 
 const init = () => {
   getList()
-};
+}
 
 onMounted(() => {
   init()
 })
 </script>
+<template>
+  <div class="p-4">
+    <h1 class="text-2xl font-bold mb-6">企业部门管理信息</h1>
+    <div class="mb-6 p-4 bg-white rounded-lg shadow-sm flex flex-wrap items-center gap-4">
+      <el-form :inline="true" :model="searchForm" class="flex-grow flex flex-wrap w-full">
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">部门名称:</span>
+          </template>
+          <el-input
+            v-model="searchForm.departmentName"
+            style="width: 240px"
+            size="default"
+            placeholder="请输入部门名称"
+            @clear="handleSearch"
+          />
+        </el-form-item>
+      </el-form>
+      <div class="w-full">
+        <el-button type="primary" :icon="Search" @click="handleSearch" size="default"
+          >查询
+        </el-button>
+        <el-button :icon="Refresh" @click="handleResetSearch" size="default">重置</el-button>
+      </div>
+
+      <div class="flex gap-1" style="justify-content: flex-end">
+        <el-button type="primary" :icon="Plus" @click="handleAdd" size="default">新增</el-button>
+        <el-button
+          type="danger"
+          :icon="Delete"
+          @click="handleBatchDelete"
+          :disabled="selectedIds.length === 0"
+          size="default"
+          >批量删除
+        </el-button>
+        <el-button type="success" :icon="Download" @click="exportExcel" size="default"
+          >导出</el-button
+        >
+        <el-upload
+          class="inline-block ml-2"
+          :action="base_url + '/edepartmentEmployeeStats/importData'"
+          :show-file-list="false"
+          :on-success="handleUploadSuccess"
+          :on-error="handleUploadError"
+          :before-upload="handleBeforeUpload"
+          :http-request="(options) => importExcel(options.file)"
+        >
+          <el-button type="info" :icon="Upload" size="default">导入</el-button>
+        </el-upload>
+      </div>
+    </div>
+
+    <!-- Table -->
+    <div class="bg-white rounded-lg shadow-sm p-4 overflow-x-auto">
+      <el-table
+        :data="tableData"
+        style="width: 100%"
+        border
+        @selection-change="handleSelectionChange"
+        :cell-style="{ fontSize: '14px' }"
+        :header-cell-style="{ fontSize: '14px' }"
+        :row-style="{ fontSize: '14px' }"
+      >
+        <el-table-column type="selection" width="55" fixed="left" />
+        <el-table-column prop="departmentName" label="部门名称" align="center" />
+        <el-table-column prop="domesticEmployees" label="内籍员工数量	" align="center" />
+        <el-table-column prop="educationDistribution" label="学历分布	" align="center" />
+        <el-table-column prop="femaleRatio" label="女工比例" align="center" />
+        <el-table-column prop="foreignEmployees" label="外籍员工数量" align="center" />
+        <el-table-column prop="maleRatio" label="男工比例" align="center" />
+        <el-table-column prop="totalEmployees" label="员工总数" align="center" />
+        <el-table-column prop="ageDistribution" label="年龄分布" align="center" />
+        <el-table-column label="操作" fixed="right" align="center">
+          <template #default="{ row }">
+            <el-button :icon="Edit" size="small" @click="handleEdit(row)">编辑</el-button>
+            <el-button type="danger" :icon="Delete" size="small" @click="handleDelete(row.id)"
+              >删除
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- Pagination -->
+      <div class="mt-4 flex justify-end">
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="pageNum"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="pageSize"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+        />
+      </div>
+    </div>
+
+    <!-- Add/Edit Dialog -->
+    <el-dialog
+      v-model="dialogVisible"
+      :title="dialogTitle"
+      width="800px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+    >
+      <el-form
+        :model="formData"
+        ref="formRef"
+        label-width="120px"
+        class="grid grid-cols-1 md:grid-cols-2 gap-4"
+      >
+        <el-form-item
+          label="部门名称"
+          prop="departmentName"
+          :rules="[{ required: true, message: '请输入部门名称', trigger: 'blur' }]"
+        >
+          <el-input v-model="formData.departmentName" placeholder="请输入部门名称" />
+        </el-form-item>
+        <el-form-item
+          label="内籍员工数量"
+          prop="domesticEmployees"
+          :rules="[{ required: true, message: '请输入内籍员工数量', trigger: 'blur' }]"
+        >
+          <el-input v-model="formData.domesticEmployees" placeholder="请输入内籍员工数量" />
+        </el-form-item>
+
+        <el-form-item
+          label="学历分布"
+          prop="educationDistribution"
+          :rules="[{ required: true, message: '请输入学历分布', trigger: 'blur' }]"
+        >
+          <el-input
+            v-model="formData.educationDistribution"
+            placeholder="请输入学历分布(高中及以上,大专,本科,硕士,博士)"
+          />
+        </el-form-item>
+        <el-form-item
+          label="女工比例(%)"
+          prop="femaleRatio"
+          :rules="[{ required: true, message: '请输入女工比例(0-100)', trigger: 'blur' }]"
+        >
+          <el-input v-model="formData.femaleRatio" placeholder="请输入女工比例(0-100)" />
+        </el-form-item>
+
+        <el-form-item
+          label="外籍员工数量"
+          prop="foreignEmployees"
+          :rules="[
+            { required: true, message: '请输入外籍员工数量', trigger: 'blur' },
+            { type: 'number', message: '请输入数字', trigger: 'blur' },
+          ]"
+        >
+          <el-input v-model="formData.foreignEmployees" placeholder="请输入外籍员工数量" />
+        </el-form-item>
+        <el-form-item
+          label="男工比例(%)"
+          prop="maleRatio"
+          :rules="[{ required: true, message: '请输入男工比例', trigger: 'blur' }]"
+        >
+          <el-input v-model="formData.maleRatio" placeholder="请输入男工比例(0-100)" />
+        </el-form-item>
+
+        <el-form-item
+          label="员工总数"
+          prop="totalEmployees"
+          :rules="[{ required: true, message: '请输入员工总数', trigger: 'blur' }]"
+        >
+          <el-input v-model="formData.totalEmployees" placeholder="请输入员工总数" />
+        </el-form-item>
+        <el-form-item
+          label="年龄分布"
+          prop="ageDistribution"
+          :rules="[{ required: true, message: '请输入年龄分布', trigger: 'blur' }]"
+        >
+          <el-input
+            v-model="formData.ageDistribution"
+            placeholder="请输入年龄分布区间(例如:20-30)"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="dialogVisible = false">取消</el-button>
+          <el-button type="primary" @click="handleConfirm">确定</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
 <style scoped>
 /* Add any specific styles here if needed, otherwise UnoCSS handles most */
 </style>

+ 380 - 324
src/views/qygl/qyjbxx/index.vue

@@ -1,307 +1,9 @@
-<template>
-  <div class="p-4">
-    <div class="mb-6 p-4 bg-white rounded-lg shadow-sm flex flex-wrap items-center gap-4">
-      <el-form :inline="true" :model="searchForm" class="flex-grow flex flex-wrap">
-        <el-form-item>
-          <span slot="label" class="font-size-4.5">企业名称:</span>
-          <el-input
-            v-model="searchForm.enterpriseName"
-            style="width: 240px"
-            size="default"
-            placeholder="请输入企业名称"
-            @clear="handleSearch"
-          />
-        </el-form-item>
-        <el-form-item>
-          <span slot="label" class="font-size-4.5">信用代码:</span>
-          <el-input
-            v-model="searchForm.unifiedSocialCreditCode"
-            style="width: 240px"
-            size="default"
-            placeholder="输入统一社会信用代码"
-            clearable
-          />
-        </el-form-item>
-        <el-form-item>
-          <span slot="label" class="font-size-4.5">是否规上企业:</span>
-          <el-select v-model="searchForm.isAboveDesignatedSize"
-                     style="width: 240px"
-                     size="default" placeholder="请选择">
-            <el-option
-              v-for="item in arrearsOptions"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <span slot="label" class="font-size-4.5">是否高新技术企业:</span>
-          <el-select v-model="searchForm.isHighTech"
-                     style="width: 240px"
-                     size="default" placeholder="请选择">
-            <el-option
-              v-for="item in arrearsOptions"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" :icon="Search" @click="handleSearch" size="search">查询
-          </el-button>
-          <el-button :icon="Refresh" @click="handleResetSearch" size="search">重置</el-button>
-        </el-form-item>
-      </el-form>
-
-      <div class="flex gap-1" style="justify-content:flex-end">
-        <el-button type="primary" :icon="Plus" @click="handleAdd" size="search">新增</el-button>
-        <el-button
-          type="danger"
-          :icon="Delete"
-          @click="handleBatchDelete"
-          :disabled="selectedIds.length === 0"
-          size="search"
-        >批量删除
-        </el-button
-        >
-        <el-button type="success" :icon="Download" @click="exportExcel" size="search">导出</el-button>
-        <el-upload
-          class="inline-block ml-2"
-          action="/api/eenterpriseBasicInfo/importData"
-          :show-file-list="false"
-          :on-success="handleUploadSuccess"
-          :on-error="handleUploadError"
-          :before-upload="handleBeforeUpload"
-          :http-request="(options) => importExcel(options.file)"
-        >
-          <el-button type="info" :icon="Upload" size="search">导入</el-button>
-        </el-upload>
-      </div>
-    </div>
-
-    <!-- Table -->
-    <div class="bg-white rounded-lg shadow-sm p-4 overflow-x-auto">
-      <el-table
-        :data="tableData"
-        style="width: 100%"
-        border
-        @selection-change="handleSelectionChange"
-        :cell-style="{ fontSize: '14px' }"
-        :header-cell-style="{ fontSize: '14px' }"
-        :row-style="{ fontSize: '14px' }"
-      >
-        <el-table-column type="selection" width="55" fixed="left"/>
-        <el-table-column prop="enterpriseName" label="企业名称" align="center"/>
-        <el-table-column prop="unifiedSocialCreditCode" label="统一社会信用代码" align="center"/>
-        <el-table-column prop="enterpriseLeader" label="企业负责人" align="center"/>
-        <el-table-column prop="contactInformation" label="联系方式" align="center"/>
-
-        <el-table-column prop="isAboveDesignatedSize" label="是否规上企业" align="center"/>
-        <el-table-column prop="isHighTech" label="是否高新技术企业" align="center"/>
-        <el-table-column prop="outputValue" label="产值(万元)" align="center"/>
-        <el-table-column prop="outputValueYoy" label="产值同比(百分比)" align="center"/>
-        <el-table-column prop="registrationDate" label="注册日期" align="center"/>
-        <el-table-column prop="revenue" label="营收(万元)" align="center"/>
-        <el-table-column prop="revenueYoy" label="营收同比(百分比)" align="center"/>
-        <el-table-column prop="taxRevenue" label="税收(万元)" align="center"/>
-        <el-table-column prop="taxRevenueYoy" label="税收同比(百分比)" align="center"/>
-        <el-table-column label="操作" fixed="right" align="center">
-          <template #default="{ row }">
-            <el-button :icon="Edit" size="small" @click="handleEdit(row)">编辑</el-button>
-            <el-button type="danger" :icon="Delete" size="small" @click="handleDelete(row.id)"
-            >删除
-            </el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <!-- Pagination -->
-      <div class="mt-4 flex justify-end">
-        <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="pageNum"
-          :page-sizes="[10, 20, 50, 100]"
-          :page-size="pageSize"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="total"
-        />
-      </div>
-    </div>
-
-    <!-- Add/Edit Dialog -->
-    <el-dialog
-      v-model="dialogVisible"
-      :title="dialogTitle"
-      width="800px"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-    >
-      <el-form
-        :model="formData"
-        ref="formRef"
-        label-width="120px"
-        class="grid grid-cols-1 md:grid-cols-2 gap-4"
-      >
-        <el-form-item
-          label="企业名称"
-          prop="enterpriseName"
-          :rules="[{ required: true, message: '请输入企业名称', trigger: 'blur' }]"
-        >
-          <el-input v-model="formData.enterpriseName" placeholder="请输入企业名称"/>
-        </el-form-item>
-        <el-form-item
-          label="信用代码"
-          prop="unifiedSocialCreditCode"
-          :rules="[{ required: true, message: '请输入统一社会信用代码', trigger: 'blur' }]"
-        >
-          <el-input
-            v-model="formData.unifiedSocialCreditCode"
-            placeholder="请输入统一社会信用代码"
-          />
-        </el-form-item>
-
-        <el-form-item
-          label="企业负责人"
-          prop="enterpriseLeader"
-          :rules="[{ required: true, message: '请输入企业负责人', trigger: 'blur' }]"
-        >
-          <el-input
-            v-model="formData.enterpriseLeader"
-            placeholder="请输入企业负责人"
-          />
-        </el-form-item>
-        <el-form-item
-          label="联系方式"
-          prop="contactInformation"
-          :rules="[{ required: true, message: '请输入联系方式', trigger: 'blur' }]"
-        >
-          <el-input
-            v-model="formData.contactInformation"
-            placeholder="请输入联系方式"
-          />
-        </el-form-item>
-
-        <el-form-item
-          label="是否规上企业"
-          prop="isAboveDesignatedSize"
-          :rules="[{ required: true, message: '请选择', trigger: 'change' }]"
-        >
-          <el-select v-model="formData.isAboveDesignatedSize" placeholder="请选择" style="width: 100%">
-            <el-option
-              v-for="item in arrearsOptions"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item
-          label="是否高新技术企业"
-          prop="isHighTech"
-          :rules="[{ required: true, message: '请选择', trigger: 'change' }]"
-        >
-          <el-select v-model="formData.isHighTech" placeholder="请选择" style="width: 100%">
-            <el-option
-              v-for="item in arrearsOptions"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </el-form-item>
-
-        <el-form-item
-          label="产值(万元)"
-          prop="outputValue"
-          :rules="[
-            { required: true, message: '请输入产值(万元)', trigger: 'blur' },
-            { type: 'number', message: '请输入数字', trigger: 'blur' },
-          ]"
-        >
-          <el-input v-model.number="formData.outputValue" placeholder="请输入产值(万元)"/>
-        </el-form-item>
-        <el-form-item
-          label="产值同比(百分比)"
-          prop="outputValueYoy"
-          :rules="[
-            { required: true, message: '请输入产值同比(百分比)', trigger: 'blur' },
-            { type: 'number', message: '请输入数字', trigger: 'blur' },
-          ]"
-        >
-          <el-input v-model.number="formData.outputValueYoy" placeholder="请输入产值同比(百分比)"/>
-        </el-form-item>
-
-
-        <el-form-item
-          label="营收(万元)"
-          prop="revenue"
-          :rules="[
-            { required: true, message: '请输入营收(万元)', trigger: 'blur' },
-            { type: 'number', message: '请输入数字', trigger: 'blur' },
-          ]"
-        >
-          <el-input v-model.number="formData.revenue" placeholder="请输入营收(万元)"/>
-        </el-form-item>
-        <el-form-item
-          label="营收同比(百分比)"
-          prop="revenueYoy"
-          :rules="[
-            { required: true, message: '请输入营收同比(百分比)', trigger: 'blur' },
-            { type: 'number', message: '请输入数字', trigger: 'blur' },
-          ]"
-        >
-          <el-input v-model.number="formData.revenueYoy" placeholder="请输入营收同比(百分比)"/>
-        </el-form-item>
-
-
-        <el-form-item
-          label="税收(万元)"
-          prop="taxRevenue"
-          :rules="[
-            { required: true, message: '请输入税收(万元)', trigger: 'blur' },
-            { type: 'number', message: '请输入数字', trigger: 'blur' },
-          ]"
-        >
-          <el-input v-model.number="formData.taxRevenue" placeholder="请输入税收(万元)"/>
-        </el-form-item>
-        <el-form-item
-          label="税收同比(百分比)"
-          prop="taxRevenueYoy"
-          :rules="[
-            { required: true, message: '请输入税收同比(百分比)', trigger: 'blur' },
-            { type: 'number', message: '请输入数字', trigger: 'blur' },
-          ]"
-        >
-          <el-input v-model.number="formData.taxRevenueYoy" placeholder="请输入税收同比(百分比)"/>
-        </el-form-item>
-        <el-form-item
-          label="注册日期"
-          prop="registrationDate"
-          :rules="[{ required: true, message: '请选择注册日期', trigger: 'change' }]"
-        >
-          <el-date-picker v-model="formData.registrationDate" type="date" format="YYYY/MM/DD" value-format="YYYY-MM-DD"/>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="dialogVisible = false">取消</el-button>
-          <el-button type="primary" @click="handleConfirm">确定</el-button>
-        </span>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
 <script setup lang="ts">
-import {onMounted, reactive, ref} from 'vue'
-import {clientDownloadExcel, clientGet, clientPost} from '@/utils/request.ts'
-import type {FormInstance, UploadProps} from 'element-plus'
-import {ElForm, ElLoading, ElMessage, ElMessageBox} from 'element-plus'
-import {Delete, Download, Edit, Plus, Refresh, Search, Upload} from '@element-plus/icons-vue'
+import { onMounted, reactive, ref } from 'vue'
+import { clientDownloadExcel, clientGet, clientPost } from '@/utils/request.ts'
+import type { FormInstance, UploadProps } from 'element-plus'
+import { ElForm, ElLoading, ElMessage, ElMessageBox } from 'element-plus'
+import { Delete, Download, Edit, Plus, Refresh, Search, Upload } from '@element-plus/icons-vue'
 
 // 假设 BaseResponse 和 PageType 在全局或 request.ts 中已定义
 interface BaseResponse {
@@ -333,6 +35,7 @@ interface Property {
   revenueYoy: string // 营收同比(百分比)
   taxRevenue: string // 税收(万元)
   taxRevenueYoy: string // 税收同比(百分比)
+  enterpriseIntroduce: string // 企业介绍
   updateTime?: string // 更新时间
   createTime?: string // 创建时间
 }
@@ -359,6 +62,7 @@ interface AddProperty {
   revenueYoy: string // 营收同比(百分比)
   taxRevenue: string // 税收(万元)
   taxRevenueYoy: string // 税收同比(百分比)
+  enterpriseIntroduce: string // 企业介绍
 }
 
 interface UpdateProperty {
@@ -376,6 +80,7 @@ interface UpdateProperty {
   revenueYoy: string // 营收同比(百分比)
   taxRevenue: string // 税收(万元)
   taxRevenueYoy: string // 税收同比(百分比)
+  enterpriseIntroduce: string // 企业介绍
 }
 
 // 响应式状态变量
@@ -397,11 +102,12 @@ const isEdit = ref(false)
 const formData = reactive<Property>({})
 const formRef = ref<FormInstance>()
 const selectedIds = ref<string[]>([])
+const base_url = import.meta.env.VITE_APP_BASE_API
 
 // 规上企业是否
 const arrearsOptions = [
-  {label: '是', value: '是'},
-  {label: '否', value: '否'},
+  { label: '是', value: '是' },
+  { label: '否', value: '否' },
 ]
 // 年度选项(动态生成最近5年)
 const currentYear = new Date().getFullYear()
@@ -437,21 +143,27 @@ const getList = async () => {
   const params = {
     pageNum: pageNum.value,
     pageSize: pageSize.value,
-    ...(searchForm.isAboveDesignatedSize ? {isAboveDesignatedSize: searchForm.isAboveDesignatedSize} : {}),
-    ...(searchForm.unifiedSocialCreditCode ? {unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode} : {}),
-    ...(searchForm.enterpriseName ? {enterpriseName: searchForm.enterpriseName} : {}),
-    ...(searchForm.isHighTech ? {isHighTech: searchForm.isHighTech} : {}),
+    ...(searchForm.isAboveDesignatedSize
+      ? { isAboveDesignatedSize: searchForm.isAboveDesignatedSize }
+      : {}),
+    ...(searchForm.unifiedSocialCreditCode
+      ? { unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode }
+      : {}),
+    ...(searchForm.enterpriseName ? { enterpriseName: searchForm.enterpriseName } : {}),
+    ...(searchForm.isHighTech ? { isHighTech: searchForm.isHighTech } : {}),
   }
 
-  const res = await clientGet<{
-    pageNum: number
-    pageSize: number
-    isAboveDesignatedSize?: string
-    unifiedSocialCreditCode?: string
-    enterpriseName?: string
-    isHighTech?: string
-  },
-    PropertyListResponse>('/eenterpriseBasicInfo/findByPage', {
+  const res = await clientGet<
+    {
+      pageNum: number
+      pageSize: number
+      isAboveDesignatedSize?: string
+      unifiedSocialCreditCode?: string
+      enterpriseName?: string
+      isHighTech?: string
+    },
+    PropertyListResponse
+  >('/eenterpriseBasicInfo/findByPage', {
     params,
   })
 
@@ -499,10 +211,14 @@ const exportExcel = async () => {
   try {
     // 构建参数对象,只包含有值的搜索条件
     const params = {
-      ...(searchForm.isAboveDesignatedSize ? {isAboveDesignatedSize: searchForm.isAboveDesignatedSize} : {}),
-      ...(searchForm.unifiedSocialCreditCode ? {unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode} : {}),
-      ...(searchForm.enterpriseName ? {enterpriseName: searchForm.enterpriseName} : {}),
-      ...(searchForm.isHighTech ? {isHighTech: searchForm.isHighTech} : {}),
+      ...(searchForm.isAboveDesignatedSize
+        ? { isAboveDesignatedSize: searchForm.isAboveDesignatedSize }
+        : {}),
+      ...(searchForm.unifiedSocialCreditCode
+        ? { unifiedSocialCreditCode: searchForm.unifiedSocialCreditCode }
+        : {}),
+      ...(searchForm.enterpriseName ? { enterpriseName: searchForm.enterpriseName } : {}),
+      ...(searchForm.isHighTech ? { isHighTech: searchForm.isHighTech } : {}),
     }
 
     await clientDownloadExcel('/eenterpriseBasicInfo/exportData', {
@@ -620,7 +336,7 @@ const handleConfirm = async () => {
   await formRef.value.validate(async (valid) => {
     if (valid) {
       let success = false
-      const dataToSend = {...formData}
+      const dataToSend = { ...formData }
 
       if (isEdit.value) {
         success = await update(dataToSend)
@@ -678,12 +394,352 @@ const handleBeforeUpload: UploadProps['beforeUpload'] = (rawFile) => {
 
 const init = () => {
   getList()
-};
+}
 
 onMounted(() => {
   init()
 })
 </script>
+
+<template>
+  <div class="p-4">
+    <h1 class="text-2xl font-bold mb-6">企业基本信息管理</h1>
+    <div class="mb-6 p-4 bg-white rounded-lg shadow-sm flex flex-wrap items-center gap-4">
+      <el-form :inline="true" :model="searchForm" class="flex-grow flex flex-wrap w-full">
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">企业名称:</span>
+          </template>
+          <el-input
+            v-model="searchForm.enterpriseName"
+            style="width: 240px"
+            size="default"
+            placeholder="请输入企业名称"
+            @clear="handleSearch"
+          />
+        </el-form-item>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">信用代码:</span>
+          </template>
+          <el-input
+            v-model="searchForm.unifiedSocialCreditCode"
+            style="width: 240px"
+            size="default"
+            placeholder="输入统一社会信用代码"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">是否规上企业:</span>
+          </template>
+          <el-select
+            v-model="searchForm.isAboveDesignatedSize"
+            style="width: 240px"
+            size="default"
+            placeholder="请选择"
+          >
+            <el-option
+              v-for="item in arrearsOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">是否高新技术企业:</span>
+          </template>
+          <el-select
+            v-model="searchForm.isHighTech"
+            style="width: 240px"
+            size="default"
+            placeholder="请选择"
+          >
+            <el-option
+              v-for="item in arrearsOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div class="w-full">
+        <el-button type="primary" :icon="Search" @click="handleSearch" size="default"
+          >查询
+        </el-button>
+        <el-button :icon="Refresh" @click="handleResetSearch" size="default">重置</el-button>
+      </div>
+      <div class="flex gap-1" style="justify-content: flex-end">
+        <el-button type="primary" :icon="Plus" @click="handleAdd" size="default">新增</el-button>
+        <el-button
+          type="danger"
+          :icon="Delete"
+          @click="handleBatchDelete"
+          :disabled="selectedIds.length === 0"
+          size="default"
+          >批量删除
+        </el-button>
+        <el-button type="success" :icon="Download" @click="exportExcel" size="default"
+          >导出</el-button
+        >
+        <el-upload
+          class="inline-block ml-2"
+          :action="base_url + '/eenterpriseBasicInfo/importData'"
+          :show-file-list="false"
+          :on-success="handleUploadSuccess"
+          :on-error="handleUploadError"
+          :before-upload="handleBeforeUpload"
+          :http-request="(options) => importExcel(options.file)"
+        >
+          <el-button type="info" :icon="Upload" size="default">导入</el-button>
+        </el-upload>
+      </div>
+    </div>
+
+    <!-- Table -->
+    <div class="bg-white rounded-lg shadow-sm p-4 overflow-x-auto">
+      <el-table
+        :data="tableData"
+        style="width: 100%"
+        border
+        @selection-change="handleSelectionChange"
+        :cell-style="{ fontSize: '14px' }"
+        :header-cell-style="{ fontSize: '14px' }"
+        :row-style="{ fontSize: '14px' }"
+      >
+        <el-table-column type="selection" width="55" fixed="left" />
+        <el-table-column prop="enterpriseName" label="企业名称" align="center" />
+        <el-table-column prop="unifiedSocialCreditCode" label="统一社会信用代码" align="center" />
+        <el-table-column prop="enterpriseLeader" label="企业负责人" align="center" />
+        <el-table-column prop="contactInformation" label="联系方式" align="center" />
+
+        <el-table-column prop="isAboveDesignatedSize" label="是否规上企业" align="center" />
+        <el-table-column prop="isHighTech" label="是否高新技术企业" align="center" />
+        <el-table-column prop="outputValue" label="产值(万元)" align="center" />
+        <el-table-column prop="outputValueYoy" label="产值同比(百分比)" align="center" />
+        <el-table-column prop="registrationDate" label="注册日期" align="center" />
+        <el-table-column prop="revenue" label="营收(万元)" align="center" />
+        <el-table-column prop="revenueYoy" label="营收同比(百分比)" align="center" />
+        <el-table-column prop="taxRevenue" label="税收(万元)" align="center" />
+        <el-table-column prop="taxRevenueYoy" label="税收同比(百分比)" align="center" />
+        <el-table-column label="操作" fixed="right" align="center">
+          <template #default="{ row }">
+            <el-button :icon="Edit" size="small" @click="handleEdit(row)">编辑</el-button>
+            <el-button type="danger" :icon="Delete" size="small" @click="handleDelete(row.id)"
+              >删除
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- Pagination -->
+      <div class="mt-4 flex justify-end">
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="pageNum"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="pageSize"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+        />
+      </div>
+    </div>
+
+    <!-- Add/Edit Dialog -->
+    <el-dialog
+      v-model="dialogVisible"
+      :title="dialogTitle"
+      width="800px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+    >
+      <el-form
+        :model="formData"
+        ref="formRef"
+        label-width="120px"
+        class="grid grid-cols-1 md:grid-cols-2 gap-4"
+      >
+        <el-form-item
+          label-width="150"
+          label="企业名称"
+          prop="enterpriseName"
+          :rules="[{ required: true, message: '请输入企业名称', trigger: 'blur' }]"
+        >
+          <el-input v-model="formData.enterpriseName" placeholder="请输入企业名称" />
+        </el-form-item>
+        <el-form-item
+          label-width="150"
+          label="信用代码"
+          prop="unifiedSocialCreditCode"
+          :rules="[{ required: true, message: '请输入统一社会信用代码', trigger: 'blur' }]"
+        >
+          <el-input
+            v-model="formData.unifiedSocialCreditCode"
+            placeholder="请输入统一社会信用代码"
+          />
+        </el-form-item>
+
+        <el-form-item
+          label-width="150"
+          label="企业负责人"
+          prop="enterpriseLeader"
+          :rules="[{ required: true, message: '请输入企业负责人', trigger: 'blur' }]"
+        >
+          <el-input v-model="formData.enterpriseLeader" placeholder="请输入企业负责人" />
+        </el-form-item>
+        <el-form-item
+          label-width="150"
+          label="联系方式"
+          prop="contactInformation"
+          :rules="[{ required: true, message: '请输入联系方式', trigger: 'blur' }]"
+        >
+          <el-input v-model="formData.contactInformation" placeholder="请输入联系方式" />
+        </el-form-item>
+
+        <el-form-item
+          label-width="150"
+          label="是否规上企业"
+          prop="isAboveDesignatedSize"
+          :rules="[{ required: true, message: '请选择', trigger: 'change' }]"
+        >
+          <el-select
+            v-model="formData.isAboveDesignatedSize"
+            placeholder="请选择"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in arrearsOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label-width="150"
+          label="是否高新技术企业"
+          prop="isHighTech"
+          :rules="[{ required: true, message: '请选择', trigger: 'change' }]"
+        >
+          <el-select v-model="formData.isHighTech" placeholder="请选择" style="width: 100%">
+            <el-option
+              v-for="item in arrearsOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item
+          label-width="150"
+          label="产值(万元)"
+          prop="outputValue"
+          :rules="[
+            { required: true, message: '请输入产值(万元)', trigger: 'blur' },
+            { type: 'number', message: '请输入数字', trigger: 'blur' },
+          ]"
+        >
+          <el-input v-model.number="formData.outputValue" placeholder="请输入产值(万元)" />
+        </el-form-item>
+        <el-form-item
+          label-width="150"
+          label="产值同比(百分比)"
+          prop="outputValueYoy"
+          :rules="[{ required: true, message: '请输入产值同比(百分比)', trigger: 'blur' }]"
+        >
+          <el-input
+            v-model.number="formData.outputValueYoy"
+            placeholder="请输入产值同比(百分比)"
+          />
+        </el-form-item>
+
+        <el-form-item
+          label-width="150"
+          label="营收(万元)"
+          prop="revenue"
+          :rules="[
+            { required: true, message: '请输入营收(万元)', trigger: 'blur' },
+            { type: 'number', message: '请输入数字', trigger: 'blur' },
+          ]"
+        >
+          <el-input v-model.number="formData.revenue" placeholder="请输入营收(万元)" />
+        </el-form-item>
+        <el-form-item
+          label-width="150"
+          label="营收同比(百分比)"
+          prop="revenueYoy"
+          :rules="[{ required: true, message: '请输入营收同比(百分比)', trigger: 'blur' }]"
+        >
+          <el-input v-model="formData.revenueYoy" placeholder="请输入营收同比(百分比)" />
+        </el-form-item>
+
+        <el-form-item
+          label-width="150"
+          label="税收(万元)"
+          prop="taxRevenue"
+          :rules="[
+            { required: true, message: '请输入税收(万元)', trigger: 'blur' },
+            { type: 'number', message: '请输入数字', trigger: 'blur' },
+          ]"
+        >
+          <el-input v-model.number="formData.taxRevenue" placeholder="请输入税收(万元)" />
+        </el-form-item>
+        <el-form-item
+          label-width="150"
+          label="税收同比(百分比)"
+          prop="taxRevenueYoy"
+          :rules="[{ required: true, message: '请输入税收同比(百分比)', trigger: 'blur' }]"
+        >
+          <el-input
+            v-model.number="formData.taxRevenueYoy"
+            placeholder="请输入税收同比(百分比)"
+          />
+        </el-form-item>
+        <el-form-item
+          label-width="150"
+          label="注册日期"
+          prop="registrationDate"
+          :rules="[{ required: true, message: '请选择注册日期', trigger: 'change' }]"
+        >
+          <el-date-picker
+            v-model="formData.registrationDate"
+            type="date"
+            format="YYYY/MM/DD"
+            value-format="YYYY-MM-DD"
+          />
+        </el-form-item>
+
+        <el-form-item
+          label-width="150"
+          label="企业介绍"
+          prop="enterpriseIntroduce"
+          :rules="[{ required: true, message: '请选择企业介绍', trigger: 'change' }]"
+          class="md:col-span-2"
+        >
+          <el-input
+            v-model="formData.enterpriseIntroduce"
+            placeholder="请输入企业介绍"
+            type="textarea"
+            :rows="4"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="dialogVisible = false">取消</el-button>
+          <el-button type="primary" @click="handleConfirm">确定</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
 <style scoped>
 /* Add any specific styles here if needed, otherwise UnoCSS handles most */
 </style>

+ 45 - 17
src/views/qygl/qyzzgl/index.vue

@@ -81,6 +81,7 @@ const isEdit = ref(false)
 const formData = reactive<Property>({})
 const formRef = ref<FormInstance>()
 const selectedIds = ref<string[]>([])
+const base_url = import.meta.env.VITE_APP_BASE_API
 
 // 证书类型选项
 const certificateTypeOptions = [
@@ -376,14 +377,27 @@ onMounted(() => {
     <!-- Search and Action Bar -->
     <div class="mb-6 p-4 bg-white rounded-lg shadow-sm flex flex-wrap items-center gap-4">
       <el-form :inline="true" :model="searchForm" class="flex-grow flex flex-wrap gap-x-4">
-        <el-form-item label="企业名称">
-          <el-input v-model="searchForm.entName" placeholder="输入企业名称" clearable />
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">企业名称:</span>
+          </template>
+          <el-input
+            v-model="searchForm.entName"
+            style="width: 240px"
+            size="default"
+            placeholder="输入企业名称"
+            clearable
+          />
         </el-form-item>
-        <el-form-item label="证书类型">
+        <el-form-item>
+          <template #label>
+            <span class="font-size-4.5">证书类型:</span>
+          </template>
           <el-select
             v-model="searchForm.certificateType"
             placeholder="请选择证书类型"
-            style="width: 150px"
+            size="default"
+            style="width: 240px"
           >
             <el-option
               v-for="item in certificateTypeOptions"
@@ -393,35 +407,49 @@ onMounted(() => {
             />
           </el-select>
         </el-form-item>
-        <el-form-item label="证书编号">
-          <el-input v-model="searchForm.certificateNo" placeholder="请输入证书编号" clearable />
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" :icon="Search" @click="handleSearch">查询</el-button>
-          <el-button :icon="Refresh" @click="handleResetSearch">重置</el-button>
+        <el-form-item label="证书编号" size="default">
+          <template #label>
+            <span class="font-size-4.5">证书编号:</span>
+          </template>
+          <el-input
+            v-model="searchForm.certificateNo"
+            style="width: 240px"
+            placeholder="请输入证书编号"
+            clearable
+            size="default"
+          />
         </el-form-item>
       </el-form>
 
+      <div class="w-full">
+        <el-button type="primary" :icon="Search" @click="handleSearch" size="default"
+          >查询</el-button
+        >
+        <el-button :icon="Refresh" @click="handleResetSearch" size="default">重置</el-button>
+      </div>
       <div class="flex gap-2">
-        <el-button type="primary" :icon="Plus" @click="handleAdd">新增</el-button>
+        <el-button type="primary" :icon="Plus" @click="handleAdd" size="default">新增</el-button>
         <el-button
           type="danger"
           :icon="Delete"
           @click="handleBatchDelete"
           :disabled="selectedIds.length === 0"
-          >批量删除</el-button
+          size="default"
+          >批量删除
+        </el-button>
+        <el-button type="success" :icon="Download" @click="exportExcel" size="default"
+          >导出</el-button
         >
-        <el-button type="success" :icon="Download" @click="exportExcel">导出</el-button>
         <el-upload
           class="inline-block ml-2"
-          action="/api/equalificationCertificate/importData"
+          :action="base_url + '/equalificationCertificate/importData'"
           :show-file-list="false"
           :on-success="handleUploadSuccess"
           :on-error="handleUploadError"
           :before-upload="handleBeforeUpload"
           :http-request="(options) => importExcel(options.file)"
         >
-          <el-button type="info" :icon="Upload">导入</el-button>
+          <el-button type="info" :icon="Upload" size="default">导入</el-button>
         </el-upload>
       </div>
     </div>
@@ -462,8 +490,8 @@ onMounted(() => {
           <template #default="{ row }">
             <el-button :icon="Edit" size="small" @click="handleEdit(row)">编辑</el-button>
             <el-button type="danger" :icon="Delete" size="small" @click="handleDelete(row.id)"
-              >删除</el-button
-            >
+              >删除
+            </el-button>
           </template>
         </el-table-column>
       </el-table>

+ 1 - 1
vite.config.ts

@@ -31,7 +31,7 @@ export default defineConfig({
   server: {
     proxy: {
       '/api': {
-        target: 'http://192.168.110.235:8801',
+        target: 'http://192.168.110.93:8801',
         changeOrigin: true,
         rewrite: (path) => path.replace(/^\/api/, ''),
       },