index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. <script setup lang="ts">
  2. import { onMounted, reactive, ref } from 'vue'
  3. import { clientDownloadExcel, clientGet, clientPost } from '@/utils/request.ts'
  4. import type { FormInstance, UploadProps } from 'element-plus'
  5. import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
  6. import { Delete, Download, Edit, Plus, Refresh, Search, Upload } from '@element-plus/icons-vue'
  7. interface BaseResponse {
  8. code: number
  9. msg: string
  10. }
  11. interface PageType<T> {
  12. records: T[]
  13. total: number
  14. size: number
  15. current: number
  16. pages: number
  17. }
  18. interface Property {
  19. id: string
  20. enterpriseName?: string
  21. unifiedSocialCreditCode?: string
  22. waterUserInfo?: string
  23. openingDate?: string
  24. userAddress?: string
  25. prepaidAmount?: number
  26. arrearsAmount?: number
  27. isOneHouseholdTable?: string
  28. waterFeeDetails?: string
  29. avgWaterUsageLast3Months?: number
  30. avgWaterUsageLast6Months?: number
  31. isArrearsNow?: string
  32. paymentPeriod?: string
  33. statisticsDate?: string
  34. statisticsBaselineDate?: string
  35. remarks?: string
  36. administrativeRegionCode?: string
  37. createTime?: string
  38. }
  39. interface PropertyOneResponse extends BaseResponse {
  40. data: Property
  41. }
  42. interface PropertyListResponse extends BaseResponse {
  43. data: PageType<Property>
  44. }
  45. interface AddProperty {
  46. enterpriseName?: string
  47. unifiedSocialCreditCode?: string
  48. waterUserInfo?: string
  49. openingDate?: string
  50. userAddress?: string
  51. prepaidAmount?: number
  52. arrearsAmount?: number
  53. isOneHouseholdTable?: string
  54. waterFeeDetails?: string
  55. avgWaterUsageLast3Months?: number
  56. avgWaterUsageLast6Months?: number
  57. isArrearsNow?: string
  58. paymentPeriod?: string
  59. statisticsDate?: string
  60. statisticsBaselineDate?: string
  61. remarks?: string
  62. administrativeRegionCode?: string
  63. }
  64. interface UpdateProperty {
  65. id?: string
  66. enterpriseName?: string
  67. unifiedSocialCreditCode?: string
  68. waterUserInfo?: string
  69. openingDate?: string
  70. userAddress?: string
  71. prepaidAmount?: number
  72. arrearsAmount?: number
  73. isOneHouseholdTable?: string
  74. waterFeeDetails?: string
  75. avgWaterUsageLast3Months?: number
  76. avgWaterUsageLast6Months?: number
  77. isArrearsNow?: string
  78. paymentPeriod?: string
  79. statisticsDate?: string
  80. statisticsBaselineDate?: string
  81. remarks?: string
  82. administrativeRegionCode?: string
  83. }
  84. // 搜索表单
  85. const searchForm = reactive({
  86. isOneHouseholdTable: '',
  87. isArrearsNow: '',
  88. administrativeRegionCode: '',
  89. })
  90. // 分页参数
  91. const pagination = reactive({
  92. current: 1,
  93. size: 10,
  94. total: 0,
  95. })
  96. // 表格数据
  97. const tableData = ref<Property[]>([])
  98. const tableLoading = ref(false)
  99. const selectedIds = ref<string[]>([])
  100. // 对话框
  101. const dialogVisible = ref(false)
  102. const dialogTitle = ref('新增用水客户')
  103. const formRef = ref<FormInstance>()
  104. const formData = reactive<AddProperty | UpdateProperty>({
  105. enterpriseName: '',
  106. unifiedSocialCreditCode: '',
  107. waterUserInfo: '',
  108. openingDate: '',
  109. userAddress: '',
  110. prepaidAmount: undefined,
  111. arrearsAmount: undefined,
  112. isOneHouseholdTable: '',
  113. waterFeeDetails: '',
  114. avgWaterUsageLast3Months: undefined,
  115. avgWaterUsageLast6Months: undefined,
  116. isArrearsNow: '',
  117. paymentPeriod: '',
  118. statisticsDate: '',
  119. statisticsBaselineDate: '',
  120. remarks: '',
  121. administrativeRegionCode: '',
  122. })
  123. // 表单验证规则
  124. const formRules = {
  125. enterpriseName: [{ required: true, message: '请输入企业名称', trigger: 'blur' }],
  126. unifiedSocialCreditCode: [{ required: true, message: '请输入统一社会信用代码', trigger: 'blur' }],
  127. waterUserInfo: [{ required: true, message: '请输入用水信息', trigger: 'blur' }],
  128. isOneHouseholdTable: [{ required: true, message: '请选择是否一户一表', trigger: 'change' }],
  129. isArrearsNow: [{ required: true, message: '请选择当前是否欠费', trigger: 'change' }],
  130. }
  131. // 获取列表数据
  132. const getList = async () => {
  133. tableLoading.value = true
  134. try {
  135. const params: any = {
  136. pageNum: pagination.current,
  137. pageSize: pagination.size,
  138. }
  139. if (searchForm.isOneHouseholdTable) params.isOneHouseholdTable = searchForm.isOneHouseholdTable
  140. if (searchForm.isArrearsNow) params.isArrearsNow = searchForm.isArrearsNow
  141. if (searchForm.administrativeRegionCode)
  142. params.administrativeRegionCode = searchForm.administrativeRegionCode
  143. const res = await clientGet<any, PropertyListResponse>('/eWaterCustomer/findByPage', { params })
  144. if (res.code !== 200) {
  145. ElMessage.error(res.msg)
  146. return
  147. }
  148. tableData.value = res.data.records
  149. pagination.total = res.data.total
  150. } finally {
  151. tableLoading.value = false
  152. }
  153. }
  154. // 搜索
  155. const handleSearch = () => {
  156. pagination.current = 1
  157. getList()
  158. }
  159. // 重置搜索
  160. const handleReset = () => {
  161. searchForm.isOneHouseholdTable = ''
  162. searchForm.isArrearsNow = ''
  163. searchForm.administrativeRegionCode = ''
  164. handleSearch()
  165. }
  166. // 分页变化
  167. const handlePageChange = (page: number) => {
  168. pagination.current = page
  169. getList()
  170. }
  171. const handleSizeChange = (size: number) => {
  172. pagination.size = size
  173. pagination.current = 1
  174. getList()
  175. }
  176. // 表格选择
  177. const handleSelectionChange = (selection: Property[]) => {
  178. selectedIds.value = selection.map((item) => item.id)
  179. }
  180. // 打开新增对话框
  181. const handleAdd = () => {
  182. dialogTitle.value = '新增用水客户'
  183. dialogVisible.value = true
  184. resetForm()
  185. }
  186. // 打开编辑对话框
  187. const handleEdit = async (row: Property) => {
  188. dialogTitle.value = '编辑用水客户'
  189. const data = await getById(row.id)
  190. if (data) {
  191. Object.assign(formData, data)
  192. dialogVisible.value = true
  193. }
  194. }
  195. // 根据id获取数据
  196. const getById = async (id: string) => {
  197. const res = await clientGet<null, PropertyOneResponse>('/eWaterCustomer/getById/' + id)
  198. if (res.code !== 200) {
  199. ElMessage.error(res.msg)
  200. return null
  201. }
  202. return res.data
  203. }
  204. // 删除单个
  205. const handleDelete = (row: Property) => {
  206. ElMessageBox.confirm('确定要删除该用水客户吗?', '提示', {
  207. confirmButtonText: '确定',
  208. cancelButtonText: '取消',
  209. type: 'warning',
  210. }).then(async () => {
  211. const success = await delBatch([row.id])
  212. if (success) {
  213. getList()
  214. }
  215. })
  216. }
  217. // 批量删除
  218. const handleBatchDelete = () => {
  219. if (selectedIds.value.length === 0) {
  220. ElMessage.warning('请选择要删除的数据')
  221. return
  222. }
  223. ElMessageBox.confirm(`确定要删除选中的 ${selectedIds.value.length} 条数据吗?`, '提示', {
  224. confirmButtonText: '确定',
  225. cancelButtonText: '取消',
  226. type: 'warning',
  227. }).then(async () => {
  228. const success = await delBatch(selectedIds.value)
  229. if (success) {
  230. getList()
  231. }
  232. })
  233. }
  234. // 删除接口
  235. const delBatch = async (ids: string[]) => {
  236. const res = await clientPost<string[], BaseResponse>('/eWaterCustomer/deleteBatch', ids)
  237. if (res.code !== 200) {
  238. ElMessage.error(res.msg)
  239. return false
  240. }
  241. ElMessage.success(res.msg)
  242. return true
  243. }
  244. // 提交表单
  245. const handleSubmit = async () => {
  246. if (!formRef.value) return
  247. await formRef.value.validate(async (valid) => {
  248. if (valid) {
  249. let success = false
  250. if ((formData as UpdateProperty).id) {
  251. success = await update(formData as UpdateProperty)
  252. } else {
  253. success = await add(formData as AddProperty)
  254. }
  255. if (success) {
  256. dialogVisible.value = false
  257. getList()
  258. }
  259. }
  260. })
  261. }
  262. // 新增接口
  263. const add = async (data: AddProperty) => {
  264. const res = await clientPost<AddProperty, BaseResponse>('/eWaterCustomer/save', data)
  265. if (res.code !== 200) {
  266. ElMessage.error(res.msg)
  267. return false
  268. }
  269. ElMessage.success(res.msg)
  270. return true
  271. }
  272. // 修改接口
  273. const update = async (data: UpdateProperty) => {
  274. const res = await clientPost<UpdateProperty, BaseResponse>('/eWaterCustomer/update', data)
  275. if (res.code !== 200) {
  276. ElMessage.error(res.msg)
  277. return false
  278. }
  279. ElMessage.success(res.msg)
  280. return true
  281. }
  282. // 重置表单
  283. const resetForm = () => {
  284. Object.assign(formData, {
  285. id: undefined,
  286. enterpriseName: '',
  287. unifiedSocialCreditCode: '',
  288. waterUserInfo: '',
  289. openingDate: '',
  290. userAddress: '',
  291. prepaidAmount: undefined,
  292. arrearsAmount: undefined,
  293. isOneHouseholdTable: '',
  294. waterFeeDetails: '',
  295. avgWaterUsageLast3Months: undefined,
  296. avgWaterUsageLast6Months: undefined,
  297. isArrearsNow: '',
  298. paymentPeriod: '',
  299. statisticsDate: '',
  300. statisticsBaselineDate: '',
  301. remarks: '',
  302. administrativeRegionCode: '',
  303. })
  304. formRef.value?.clearValidate()
  305. }
  306. // 导出Excel
  307. const handleExport = async () => {
  308. const loading = ElLoading.service({
  309. lock: true,
  310. text: '导出中,请稍候...',
  311. background: 'rgba(0, 0, 0, 0.1)',
  312. fullscreen: true,
  313. })
  314. try {
  315. await clientDownloadExcel('/eWaterCustomer/exportData')
  316. ElMessage.success('导出成功')
  317. } catch (error) {
  318. console.error('导出失败:', error)
  319. ElMessage.error('导出失败')
  320. } finally {
  321. loading.close()
  322. }
  323. }
  324. // 导入Excel
  325. const handleImport: UploadProps['onChange'] = async (uploadFile) => {
  326. const file = uploadFile.raw
  327. if (!file) return
  328. // 验证文件类型
  329. const isExcel =
  330. file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
  331. file.type === 'application/vnd.ms-excel'
  332. if (!isExcel) {
  333. ElMessage.error('只能上传 Excel 文件!')
  334. return
  335. }
  336. // 验证文件大小(10MB)
  337. const isLt10M = file.size / 1024 / 1024 < 10
  338. if (!isLt10M) {
  339. ElMessage.error('文件大小不能超过 10MB!')
  340. return
  341. }
  342. const formData = new FormData()
  343. formData.append('file', file)
  344. const loading = ElLoading.service({
  345. lock: true,
  346. text: '导入中,请稍候...',
  347. background: 'rgba(0, 0, 0, 0.1)',
  348. fullscreen: true,
  349. })
  350. try {
  351. const res = await clientPost<FormData, BaseResponse>('/eWaterCustomer/importData', formData, {
  352. headers: {
  353. 'Content-Type': 'multipart/form-data',
  354. },
  355. })
  356. if (res.code !== 200) {
  357. ElMessage.error(res.msg)
  358. return
  359. }
  360. ElMessage.success(res.msg)
  361. getList()
  362. } catch (error) {
  363. console.error('导入失败:', error)
  364. ElMessage.error('导入失败')
  365. } finally {
  366. loading.close()
  367. }
  368. }
  369. onMounted(() => {
  370. getList()
  371. })
  372. </script>
  373. <template>
  374. <div class="p-4">
  375. <!-- 搜索表单 -->
  376. <el-card class="mb-4">
  377. <el-form :model="searchForm" inline>
  378. <el-form-item>
  379. <template #label>
  380. <span class="font-size-4.5">是否一户一表:</span>
  381. </template>
  382. <el-select
  383. size="default"
  384. v-model="searchForm.isOneHouseholdTable"
  385. placeholder="请选择"
  386. clearable
  387. class="w-180px"
  388. >
  389. <el-option label="是" value="是" />
  390. <el-option label="否" value="否" />
  391. </el-select>
  392. </el-form-item>
  393. <el-form-item>
  394. <template #label>
  395. <span class="font-size-4.5">当前是否欠费:</span>
  396. </template>
  397. <el-select
  398. size="default"
  399. v-model="searchForm.isArrearsNow"
  400. placeholder="请选择"
  401. clearable
  402. class="w-180px"
  403. >
  404. <el-option label="是" value="是" />
  405. <el-option label="否" value="否" />
  406. </el-select>
  407. </el-form-item>
  408. <el-form-item>
  409. <template #label>
  410. <span class="font-size-4.5">行政区域代码:</span>
  411. </template>
  412. <el-input
  413. size="default"
  414. v-model="searchForm.administrativeRegionCode"
  415. placeholder="请输入行政区域代码"
  416. clearable
  417. class="w-180px"
  418. />
  419. </el-form-item>
  420. <el-form-item>
  421. <el-button size="default" type="primary" :icon="Search" @click="handleSearch"
  422. >搜索</el-button
  423. >
  424. <el-button size="default" :icon="Refresh" @click="handleReset">重置</el-button>
  425. </el-form-item>
  426. </el-form>
  427. </el-card>
  428. <!-- 操作按钮 -->
  429. <el-card class="mb-4">
  430. <div class="flex justify-between items-center">
  431. <div class="flex gap-2">
  432. <el-button size="default" type="primary" :icon="Plus" @click="handleAdd">新增</el-button>
  433. <el-button
  434. size="default"
  435. type="danger"
  436. :icon="Delete"
  437. @click="handleBatchDelete"
  438. :disabled="selectedIds.length === 0"
  439. >批量删除</el-button
  440. >
  441. <el-button size="default" type="success" :icon="Download" @click="handleExport"
  442. >导出</el-button
  443. >
  444. <el-upload
  445. :show-file-list="false"
  446. :on-change="handleImport"
  447. :auto-upload="false"
  448. accept=".xlsx,.xls"
  449. class="inline-block ml-2"
  450. >
  451. <el-button size="default" type="warning" :icon="Upload">导入</el-button>
  452. </el-upload>
  453. </div>
  454. </div>
  455. </el-card>
  456. <!-- 数据表格 -->
  457. <el-card>
  458. <el-table
  459. :data="tableData"
  460. :loading="tableLoading"
  461. border
  462. stripe
  463. @selection-change="handleSelectionChange"
  464. >
  465. <el-table-column type="selection" width="55" align="center" />
  466. <el-table-column
  467. prop="enterpriseName"
  468. label="企业名称"
  469. min-width="150"
  470. show-overflow-tooltip
  471. />
  472. <el-table-column
  473. prop="unifiedSocialCreditCode"
  474. label="统一社会信用代码"
  475. min-width="180"
  476. show-overflow-tooltip
  477. />
  478. <el-table-column
  479. prop="waterUserInfo"
  480. label="用水信息"
  481. min-width="150"
  482. show-overflow-tooltip
  483. />
  484. <el-table-column prop="openingDate" label="开户日期" width="120" />
  485. <el-table-column
  486. prop="userAddress"
  487. label="用户地址"
  488. min-width="200"
  489. show-overflow-tooltip
  490. />
  491. <el-table-column prop="prepaidAmount" label="预交金额" width="120" align="right">
  492. <template #default="{ row }">
  493. {{ row.prepaidAmount ? `¥${row.prepaidAmount.toFixed(2)}` : '-' }}
  494. </template>
  495. </el-table-column>
  496. <el-table-column prop="arrearsAmount" label="欠费金额" width="120" align="right">
  497. <template #default="{ row }">
  498. {{ row.arrearsAmount ? `¥${row.arrearsAmount.toFixed(2)}` : '-' }}
  499. </template>
  500. </el-table-column>
  501. <el-table-column prop="isOneHouseholdTable" label="是否一户一表" width="120" align="center">
  502. <template #default="{ row }">
  503. <el-tag :type="row.isOneHouseholdTable === '是' ? 'success' : 'info'">
  504. {{ row.isOneHouseholdTable || '-' }}
  505. </el-tag>
  506. </template>
  507. </el-table-column>
  508. <el-table-column
  509. prop="avgWaterUsageLast3Months"
  510. label="近3月月均用水量"
  511. width="150"
  512. align="right"
  513. >
  514. <template #default="{ row }">
  515. {{ row.avgWaterUsageLast3Months ? `${row.avgWaterUsageLast3Months} m³` : '-' }}
  516. </template>
  517. </el-table-column>
  518. <el-table-column
  519. prop="avgWaterUsageLast6Months"
  520. label="近6月月均用水量"
  521. width="150"
  522. align="right"
  523. >
  524. <template #default="{ row }">
  525. {{ row.avgWaterUsageLast6Months ? `${row.avgWaterUsageLast6Months} m³` : '-' }}
  526. </template>
  527. </el-table-column>
  528. <el-table-column prop="isArrearsNow" label="当前是否欠费" width="120" align="center">
  529. <template #default="{ row }">
  530. <el-tag :type="row.isArrearsNow === '是' ? 'danger' : 'success'">
  531. {{ row.isArrearsNow || '-' }}
  532. </el-tag>
  533. </template>
  534. </el-table-column>
  535. <el-table-column prop="paymentPeriod" label="缴费所属期" width="120" />
  536. <el-table-column prop="statisticsDate" label="统计日期" width="120" />
  537. <el-table-column prop="administrativeRegionCode" label="行政区域代码" width="130" />
  538. <el-table-column prop="remarks" label="备注" min-width="150" show-overflow-tooltip />
  539. <el-table-column label="操作" width="150" fixed="right" align="center">
  540. <template #default="{ row }">
  541. <el-button link type="primary" :icon="Edit" @click="handleEdit(row)">编辑</el-button>
  542. <el-button link type="danger" :icon="Delete" @click="handleDelete(row)">删除</el-button>
  543. </template>
  544. </el-table-column>
  545. </el-table>
  546. <!-- 分页 -->
  547. <div class="flex justify-end mt-4">
  548. <el-pagination
  549. v-model:current-page="pagination.current"
  550. v-model:page-size="pagination.size"
  551. :page-sizes="[10, 20, 50, 100]"
  552. :total="pagination.total"
  553. layout="total, sizes, prev, pager, next, jumper"
  554. @size-change="handleSizeChange"
  555. @current-change="handlePageChange"
  556. />
  557. </div>
  558. </el-card>
  559. <!-- 新增/编辑对话框 -->
  560. <el-dialog
  561. v-model="dialogVisible"
  562. :title="dialogTitle"
  563. width="800px"
  564. :close-on-click-modal="false"
  565. >
  566. <el-form ref="formRef" :model="formData" :rules="formRules" label-width="140px">
  567. <el-row :gutter="20">
  568. <el-col :span="12">
  569. <el-form-item label="企业名称" prop="enterpriseName">
  570. <el-input v-model="formData.enterpriseName" placeholder="请输入企业名称" />
  571. </el-form-item>
  572. </el-col>
  573. <el-col :span="12">
  574. <el-form-item label="统一社会信用代码" prop="unifiedSocialCreditCode">
  575. <el-input
  576. v-model="formData.unifiedSocialCreditCode"
  577. placeholder="请输入统一社会信用代码"
  578. />
  579. </el-form-item>
  580. </el-col>
  581. <el-col :span="12">
  582. <el-form-item label="用水信息" prop="waterUserInfo">
  583. <el-input v-model="formData.waterUserInfo" placeholder="请输入用水信息(户名户号)" />
  584. </el-form-item>
  585. </el-col>
  586. <el-col :span="12">
  587. <el-form-item label="开户日期" prop="openingDate">
  588. <el-date-picker
  589. v-model="formData.openingDate"
  590. type="date"
  591. placeholder="请选择开户日期"
  592. value-format="YYYY-MM-DD"
  593. class="w-full"
  594. />
  595. </el-form-item>
  596. </el-col>
  597. <el-col :span="24">
  598. <el-form-item label="用户地址" prop="userAddress">
  599. <el-input v-model="formData.userAddress" placeholder="请输入用户地址" />
  600. </el-form-item>
  601. </el-col>
  602. <el-col :span="12">
  603. <el-form-item label="预交金额" prop="prepaidAmount">
  604. <el-input-number
  605. v-model="formData.prepaidAmount"
  606. :precision="2"
  607. :min="0"
  608. class="w-full"
  609. />
  610. </el-form-item>
  611. </el-col>
  612. <el-col :span="12">
  613. <el-form-item label="欠费金额" prop="arrearsAmount">
  614. <el-input-number
  615. v-model="formData.arrearsAmount"
  616. :precision="2"
  617. :min="0"
  618. class="w-full"
  619. />
  620. </el-form-item>
  621. </el-col>
  622. <el-col :span="12">
  623. <el-form-item label="是否一户一表" prop="isOneHouseholdTable">
  624. <el-select v-model="formData.isOneHouseholdTable" placeholder="请选择" class="w-full">
  625. <el-option label="是" value="是" />
  626. <el-option label="否" value="否" />
  627. </el-select>
  628. </el-form-item>
  629. </el-col>
  630. <el-col :span="12">
  631. <el-form-item label="当前是否欠费" prop="isArrearsNow">
  632. <el-select v-model="formData.isArrearsNow" placeholder="请选择" class="w-full">
  633. <el-option label="是" value="是" />
  634. <el-option label="否" value="否" />
  635. </el-select>
  636. </el-form-item>
  637. </el-col>
  638. <el-col :span="12">
  639. <el-form-item label="近3月月均用水量" prop="avgWaterUsageLast3Months">
  640. <el-input-number
  641. v-model="formData.avgWaterUsageLast3Months"
  642. :precision="2"
  643. :min="0"
  644. class="w-full"
  645. />
  646. </el-form-item>
  647. </el-col>
  648. <el-col :span="12">
  649. <el-form-item label="近6月月均用水量" prop="avgWaterUsageLast6Months">
  650. <el-input-number
  651. v-model="formData.avgWaterUsageLast6Months"
  652. :precision="2"
  653. :min="0"
  654. class="w-full"
  655. />
  656. </el-form-item>
  657. </el-col>
  658. <el-col :span="12">
  659. <el-form-item label="缴费所属期" prop="paymentPeriod">
  660. <el-input v-model="formData.paymentPeriod" placeholder="请输入缴费所属期" />
  661. </el-form-item>
  662. </el-col>
  663. <el-col :span="12">
  664. <el-form-item label="统计日期" prop="statisticsDate">
  665. <el-date-picker
  666. v-model="formData.statisticsDate"
  667. type="date"
  668. placeholder="请选择统计日期"
  669. value-format="YYYY-MM-DD"
  670. class="w-full"
  671. />
  672. </el-form-item>
  673. </el-col>
  674. <el-col :span="12">
  675. <el-form-item label="统计基准日期" prop="statisticsBaselineDate">
  676. <el-date-picker
  677. v-model="formData.statisticsBaselineDate"
  678. type="date"
  679. placeholder="请选择统计基准日期"
  680. value-format="YYYY-MM-DD"
  681. class="w-full"
  682. />
  683. </el-form-item>
  684. </el-col>
  685. <el-col :span="12">
  686. <el-form-item label="行政区域代码" prop="administrativeRegionCode">
  687. <el-input
  688. v-model="formData.administrativeRegionCode"
  689. placeholder="请输入行政区域代码"
  690. />
  691. </el-form-item>
  692. </el-col>
  693. <el-col :span="24">
  694. <el-form-item label="缴纳水费明细" prop="waterFeeDetails">
  695. <el-input
  696. v-model="formData.waterFeeDetails"
  697. type="textarea"
  698. :rows="3"
  699. placeholder="请输入缴纳水费明细"
  700. />
  701. </el-form-item>
  702. </el-col>
  703. <el-col :span="24">
  704. <el-form-item label="备注" prop="remarks">
  705. <el-input
  706. v-model="formData.remarks"
  707. type="textarea"
  708. :rows="3"
  709. placeholder="请输入备注"
  710. />
  711. </el-form-item>
  712. </el-col>
  713. </el-row>
  714. </el-form>
  715. <template #footer>
  716. <el-button @click="dialogVisible = false">取消</el-button>
  717. <el-button type="primary" @click="handleSubmit">确定</el-button>
  718. </template>
  719. </el-dialog>
  720. </div>
  721. </template>
  722. <style scoped>
  723. .w-180px {
  724. width: 180px;
  725. }
  726. </style>