PipeNetwork.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <template>
  2. <div class="pipe-network-container">
  3. <el-card class="search-card">
  4. <el-form :inline="true" :model="searchForm" class="search-form">
  5. <el-form-item label="设施名称">
  6. <el-input v-model="searchForm.networkName" placeholder="请输入设施名称" clearable />
  7. </el-form-item>
  8. <el-form-item label="管养单位">
  9. <el-input v-model="searchForm.managementUnit" placeholder="请输入管养单位" clearable />
  10. </el-form-item>
  11. <el-form-item label="等级">
  12. <el-select v-model="searchForm.networkLevel" placeholder="请选择" clearable style="width:160px">
  13. <el-option v-for="d in pipeNetworkLevelDict" :key="d.dictValue" :label="d.dictLabel" :value="d.dictValue" />
  14. </el-select>
  15. </el-form-item>
  16. <el-form-item label="设施类型">
  17. <el-select v-model="searchForm.networkType" placeholder="请选择" clearable style="width:160px">
  18. <el-option v-for="d in pipeNetworkTypeDict" :key="d.dictValue" :label="d.dictLabel" :value="d.dictValue" />
  19. </el-select>
  20. </el-form-item>
  21. <el-form-item label="材质">
  22. <el-input v-model="searchForm.material" placeholder="请输入材质" clearable style="width:160px" />
  23. </el-form-item>
  24. <el-form-item label="状态">
  25. <el-select v-model="searchForm.status" placeholder="请选择" clearable style="width:160px">
  26. <el-option v-for="d in pipeNetworkStatusDict" :key="d.dictValue" :label="d.dictLabel" :value="d.dictValue" />
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item>
  30. <el-button type="primary" @click="handleSearch">查询</el-button>
  31. <el-button @click="handleReset">重置</el-button>
  32. <el-button type="success" @click="handleAdd">新增</el-button>
  33. <el-button type="warning" @click="handleExport">导出</el-button>
  34. </el-form-item>
  35. </el-form>
  36. </el-card>
  37. <el-card class="table-card">
  38. <el-table :data="tableData" border stripe v-loading="loading" style="width: 100%">
  39. <el-table-column prop="networkCode" label="设施编码" min-width="120" />
  40. <el-table-column prop="networkName" label="设施名称" min-width="150" />
  41. <el-table-column prop="networkType" label="设施类型" width="100">
  42. <template #default="{ row }">{{ getDictLabel(pipeNetworkTypeDict, row.networkType) }}</template>
  43. </el-table-column>
  44. <el-table-column prop="networkLevel" label="等级" width="90">
  45. <template #default="{ row }">{{ getDictLabel(pipeNetworkLevelDict, row.networkLevel) }}</template>
  46. </el-table-column>
  47. <el-table-column prop="managementUnit" label="管养单位" min-width="150" />
  48. <el-table-column prop="material" label="材质" width="100" />
  49. <el-table-column prop="location" label="位置" min-width="180" />
  50. <el-table-column prop="status" label="状态" width="90">
  51. <template #default="{ row }">
  52. <el-tag :type="row.status === '0' ? 'success' : 'danger'">{{ getDictLabel(pipeNetworkStatusDict, row.status) }}</el-tag>
  53. </template>
  54. </el-table-column>
  55. <el-table-column label="操作" width="180" fixed="right">
  56. <template #default="{ row }">
  57. <el-button type="primary" size="small" @click="handleEdit(row)">编辑</el-button>
  58. <el-button type="danger" size="small" @click="handleDelete(row)">删除</el-button>
  59. </template>
  60. </el-table-column>
  61. </el-table>
  62. <el-pagination
  63. v-model:current-page="pageNum"
  64. v-model:page-size="pageSize"
  65. :total="total"
  66. layout="total, prev, pager, next, sizes"
  67. :page-sizes="[10, 20, 50]"
  68. @change="loadData"
  69. style="margin-top: 16px; justify-content: flex-end"
  70. />
  71. </el-card>
  72. <el-dialog :title="dialogTitle" v-model="dialogVisible" width="650px" destroy-on-close>
  73. <el-form :model="formData" :rules="rules" ref="formRef" label-width="100px">
  74. <el-form-item label="设施编码" prop="networkCode">
  75. <el-input v-model="formData.networkCode" placeholder="请输入设施编码" />
  76. </el-form-item>
  77. <el-form-item label="设施名称" prop="networkName">
  78. <el-input v-model="formData.networkName" placeholder="请输入设施名称" />
  79. </el-form-item>
  80. <el-form-item label="设施类型">
  81. <el-select v-model="formData.networkType">
  82. <el-option v-for="d in pipeNetworkTypeDict" :key="d.dictValue" :label="d.dictLabel" :value="d.dictValue" />
  83. </el-select>
  84. </el-form-item>
  85. <el-form-item label="等级">
  86. <el-select v-model="formData.networkLevel">
  87. <el-option v-for="d in pipeNetworkLevelDict" :key="d.dictValue" :label="d.dictLabel" :value="d.dictValue" />
  88. </el-select>
  89. </el-form-item>
  90. <el-form-item label="管养单位">
  91. <el-input v-model="formData.managementUnit" placeholder="请输入管养单位" />
  92. </el-form-item>
  93. <el-form-item label="位置描述">
  94. <el-input v-model="formData.location" placeholder="请输入位置描述" />
  95. </el-form-item>
  96. <el-form-item label="材质">
  97. <el-input v-model="formData.material" placeholder="请输入材质" />
  98. </el-form-item>
  99. <el-form-item label="经度">
  100. <el-input-number v-model="formData.longitude" :precision="10" :step="0.0001" placeholder="请输入经度" style="width: 100%" />
  101. </el-form-item>
  102. <el-form-item label="纬度">
  103. <el-input-number v-model="formData.latitude" :precision="10" :step="0.0001" placeholder="请输入纬度" style="width: 100%" />
  104. </el-form-item>
  105. <el-form-item label="状态">
  106. <el-select v-model="formData.status" placeholder="请选择">
  107. <el-option v-for="d in pipeNetworkStatusDict" :key="d.dictValue" :label="d.dictLabel" :value="d.dictValue" />
  108. </el-select>
  109. </el-form-item>
  110. <el-form-item label="备注">
  111. <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入备注" />
  112. </el-form-item>
  113. </el-form>
  114. <template #footer>
  115. <el-button @click="dialogVisible = false">取消</el-button>
  116. <el-button type="primary" @click="handleSubmit">确定</el-button>
  117. </template>
  118. </el-dialog>
  119. </div>
  120. </template>
  121. <script setup>
  122. import { ref, reactive, onMounted } from 'vue'
  123. import { ElMessage, ElMessageBox } from 'element-plus'
  124. import { getPipeNetworkPage, getPipeNetworkById, addPipeNetwork, updatePipeNetwork, deletePipeNetwork } from '@/api/pipeNetwork/basic'
  125. import { getDicts } from '@/api/system/dict/data'
  126. const loading = ref(false)
  127. const tableData = ref([])
  128. const pageNum = ref(1)
  129. const pageSize = ref(10)
  130. const total = ref(0)
  131. const searchForm = reactive({
  132. networkName: '', managementUnit: '', networkLevel: '', networkType: '', material: '', status: ''
  133. })
  134. const dialogVisible = ref(false)
  135. const dialogTitle = ref('新增')
  136. const formRef = ref(null)
  137. const formData = reactive({
  138. networkId: '', networkCode: '', networkName: '', networkType: '0',
  139. networkLevel: '', managementUnit: '', location: '', material: '',
  140. longitude: null, latitude: null, status: '0', remark: ''
  141. })
  142. const rules = {
  143. networkCode: [{ required: true, message: '请输入设施编码', trigger: 'blur' }],
  144. networkName: [{ required: true, message: '请输入设施名称', trigger: 'blur' }]
  145. }
  146. const pipeNetworkStatusDict = ref([])
  147. const pipeNetworkLevelDict = ref([])
  148. const pipeNetworkTypeDict = ref([])
  149. function getDictLabel(dict, value) {
  150. const item = dict.find(d => d.dictValue === value)
  151. return item ? item.dictLabel : value
  152. }
  153. async function loadDicts() {
  154. const [statusRes, levelRes, typeRes] = await Promise.all([
  155. getDicts('pipe_network_status'),
  156. getDicts('pipe_network_level'),
  157. getDicts('pipe_network_type')
  158. ])
  159. pipeNetworkStatusDict.value = statusRes.data
  160. pipeNetworkLevelDict.value = levelRes.data
  161. pipeNetworkTypeDict.value = typeRes.data
  162. }
  163. async function loadData() {
  164. loading.value = true
  165. try {
  166. const res = await getPipeNetworkPage(pageNum.value, pageSize.value, searchForm)
  167. tableData.value = res.data.records || []
  168. total.value = res.data.total || 0
  169. } catch (e) {
  170. console.error(e)
  171. } finally {
  172. loading.value = false
  173. }
  174. }
  175. function handleSearch() {
  176. pageNum.value = 1
  177. loadData()
  178. }
  179. function handleReset() {
  180. Object.assign(searchForm, { networkName: '', managementUnit: '', networkLevel: '', networkType: '', material: '', status: '' })
  181. handleSearch()
  182. }
  183. function handleAdd() {
  184. dialogTitle.value = '新增'
  185. Object.assign(formData, { networkId: '', networkCode: '', networkName: '', networkType: '0', networkLevel: '', managementUnit: '', location: '', material: '', longitude: null, latitude: null, status: '0', remark: '' })
  186. dialogVisible.value = true
  187. }
  188. function handleEdit(row) {
  189. dialogTitle.value = '编辑'
  190. Object.assign(formData, row)
  191. dialogVisible.value = true
  192. }
  193. async function handleSubmit() {
  194. const valid = await formRef.value.validate().catch(() => false)
  195. if (!valid) return
  196. try {
  197. if (formData.networkId) {
  198. await updatePipeNetwork(formData)
  199. ElMessage.success('修改成功')
  200. } else {
  201. await addPipeNetwork(formData)
  202. ElMessage.success('新增成功')
  203. }
  204. dialogVisible.value = false
  205. loadData()
  206. } catch (e) {
  207. console.error(e)
  208. }
  209. }
  210. function handleDelete(row) {
  211. ElMessageBox.confirm('确认删除该管网信息?', '提示', { type: 'warning' }).then(async () => {
  212. await deletePipeNetwork(row.networkId)
  213. ElMessage.success('删除成功')
  214. loadData()
  215. }).catch(() => {})
  216. }
  217. function handleExport() {
  218. ElMessage.info('导出功能开发中')
  219. }
  220. onMounted(async () => { await loadDicts(); loadData() })
  221. </script>
  222. <style scoped>
  223. .pipe-network-container { padding: 16px; }
  224. .search-card { margin-bottom: 16px; }
  225. .search-form { display: flex; flex-wrap: wrap; }
  226. </style>