index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. <template>
  2. <div class="app-container">
  3. <el-row :gutter="20">
  4. <el-col :span="4" :xs="24">
  5. <div class="head-container">
  6. <el-input v-model="areaName" placeholder="请输入区域名称" clearable size="small" prefix-icon="el-icon-search"
  7. style="margin-bottom: 20px" />
  8. </div>
  9. <div class="head-container">
  10. <el-tree :data="areaOptions" :props="defaultProps" :expand-on-click-node="false" :filter-node-method="filterNode" ref="tree"
  11. node-key="id" default-expand-all highlight-current @node-click="handleNodeClick" />
  12. </div>
  13. </el-col>
  14. <el-col :span="20" :xs="24">
  15. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
  16. <el-form-item label="设施名称" prop="facsName">
  17. <el-input v-model="queryParams.facsName" placeholder="请输入设施名称" clearable @keyup.enter.native="handleQuery" />
  18. </el-form-item>
  19. <el-form-item label="设施分类" prop="facsType">
  20. <el-select v-model="queryParams.facsType" @change="handleFacsTypeChange">
  21. <el-option v-for="item in facsTypeOptions" :label="item.name" :value="item.code" :key="item.code" />
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item label="设施子类" prop="facsSubtype">
  25. <el-select v-model="queryParams.facsSubtype">
  26. <el-option v-for="item in facsSubTypeOptions" :label="item.name" :value="item.code" :key="item.code" />
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item>
  30. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  31. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  32. </el-form-item>
  33. </el-form>
  34. <el-row :gutter="10" class="mb8">
  35. <el-col :span="1.5">
  36. <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['basecfg:emsfacs:add']">新增
  37. </el-button>
  38. </el-col>
  39. <el-col :span="1.5">
  40. <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
  41. v-hasPermi="['basecfg:emsfacs:edit']">修改</el-button>
  42. </el-col>
  43. <el-col :span="1.5">
  44. <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
  45. v-hasPermi="['basecfg:emsfacs:remove']">删除</el-button>
  46. </el-col>
  47. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  48. </el-row>
  49. <el-table v-loading="loading" :data="facsList" @selection-change="handleSelectionChange">
  50. <el-table-column type="selection" width="55" align="center" />
  51. <el-table-column label="设施代码" align="center" prop="facsCode" />
  52. <el-table-column label="设施名称" align="center" prop="facsName" />
  53. <el-table-column label="设施分类" align="center" prop="facsTypeName" />
  54. <el-table-column label="设施子类" align="center" prop="facsSubtypeName" />
  55. <el-table-column label="厂商" align="center" prop="manufacturer" />
  56. <el-table-column label="启用状态" align="center" prop="enable">
  57. <template slot-scope="scope">
  58. <!-- 根据status的值显示不同的文本 -->
  59. <span>{{ scope.row.enable === 0 ? '关闭' : '启用' }}</span>
  60. </template>
  61. </el-table-column>
  62. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  63. <template slot-scope="scope">
  64. <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['basecfg:emsfacs:edit']">
  65. 修改</el-button>
  66. <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  67. v-hasPermi="['basecfg:emsfacs:remove']">删除</el-button>
  68. </template>
  69. </el-table-column>
  70. </el-table>
  71. <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
  72. @pagination="getList" />
  73. <!-- 添加或修改能源设施/系统对话框 -->
  74. <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
  75. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  76. <el-form-item label="归属区域" prop="refArea">
  77. <treeselect v-model="form.refArea" :options="areaOptions" :show-count="true" placeholder="请选择归属园区" />
  78. </el-form-item>
  79. <el-form-item label="设施代码" prop="facsCode">
  80. <el-input v-model="form.facsCode" placeholder="请输入设施代码" />
  81. </el-form-item>
  82. <el-form-item label="设施名称" prop="facsName">
  83. <el-input v-model="form.facsName" placeholder="请输入设施名称" />
  84. </el-form-item>
  85. <el-form-item label="设施分类" prop="facsType">
  86. <el-select v-model="form.facsType" @change="handleFacsTypeChange">
  87. <el-option v-for="item in facsTypeOptions" :label="item.name" :value="item.code" :key="item.code" />
  88. </el-select>
  89. </el-form-item>
  90. <el-form-item label="设施子类" prop="facsSubtype">
  91. <el-select v-model="form.facsSubtype">
  92. <el-option v-for="item in facsSubTypeOptions" :label="item.name" :value="item.code" :key="item.code" />
  93. </el-select>
  94. </el-form-item>
  95. <el-form-item label="启用状态" prop="enable">
  96. <el-select v-model="form.enable">
  97. <el-option v-for="item in enableOptions" :label="item.name" :value="item.code" :key="item.code" />
  98. </el-select>
  99. </el-form-item>
  100. <el-form-item label="厂商" prop="manufacturer">
  101. <el-input v-model="form.manufacturer" placeholder="请输入厂商" />
  102. </el-form-item>
  103. <el-form-item label="设施属性" prop="subtypeList">
  104. <el-table class="sub-table" v-loading="loading" :data="form.facsAttrs" max-height="200px">
  105. <el-table-column label="属性名称" align="center" prop="attrName">
  106. <template slot-scope="scope">
  107. <el-input size="mini" v-model="scope.row.attrName" placeholder="属性名称" />
  108. </template>
  109. </el-table-column>
  110. <el-table-column label="属性描述" align="center" prop="attrDesc" >
  111. <template slot-scope="scope">
  112. <el-input size="mini" v-model="scope.row.attrDesc" placeholder="属性描述" />
  113. </template>
  114. </el-table-column>
  115. <el-table-column label="属性值" align="center" prop="attrValue" >
  116. <template slot-scope="scope">
  117. <el-input size="mini" v-model="scope.row.attrValue" placeholder="属性值" />
  118. </template>
  119. </el-table-column>
  120. <el-table-column label="属性单位" align="center" prop="attrUnit" >
  121. <template slot-scope="scope">
  122. <el-input size="mini" v-model="scope.row.attrUnit" placeholder="属性单位" />
  123. </template>
  124. </el-table-column>
  125. <el-table-column align="center">
  126. <template slot="header">
  127. <div class="operateBtns" @click="addSub">
  128. <span>操作</span><i class="el-icon-circle-plus-outline"></i>
  129. </div>
  130. </template>
  131. <template slot-scope="scope">
  132. <i class="el-icon-delete" @click="deleteSub(scope.$index)"></i>
  133. </template>
  134. </el-table-column>
  135. </el-table>
  136. </el-form-item>
  137. </el-form>
  138. <div slot="footer" class="dialog-footer">
  139. <el-button type="primary" @click="submitForm">确 定</el-button>
  140. <el-button @click="cancel">取 消</el-button>
  141. </div>
  142. </el-dialog>
  143. </el-col>
  144. </el-row>
  145. </div>
  146. </template>
  147. <script>
  148. import { listFacs, getFacs, delFacs, addFacs, updateFacs } from '@/api/basecfg/emsfacs'
  149. import { listAllFacsType } from '@/api/basecfg/facstype'
  150. import { areaTreeSelect } from '@/api/basecfg/area'
  151. import Treeselect from '@riophae/vue-treeselect'
  152. import '@riophae/vue-treeselect/dist/vue-treeselect.css'
  153. export default {
  154. name: 'Facs',
  155. components: { Treeselect },
  156. data() {
  157. return {
  158. // 遮罩层
  159. loading: true,
  160. // 选中数组
  161. ids: [],
  162. // 非单个禁用
  163. single: true,
  164. // 非多个禁用
  165. multiple: true,
  166. // 显示搜索条件
  167. showSearch: true,
  168. // 总条数
  169. total: 0,
  170. // 能源设施/系统表格数据
  171. facsList: [],
  172. // 弹出层标题
  173. title: '',
  174. // 是否显示弹出层
  175. open: false,
  176. // 区域名称
  177. areaName: undefined,
  178. // 区域树选项
  179. areaOptions: undefined,
  180. defaultProps: {
  181. children: 'children',
  182. label: 'label'
  183. },
  184. // 设施分类列表
  185. facsTypeOptions: undefined,
  186. facsSubTypeOptions: undefined,
  187. enableOptions: [
  188. { code: 0, name: '关闭' },
  189. { code: 1, name: '启用' }
  190. ],
  191. // 查询参数
  192. queryParams: {
  193. pageNum: 1,
  194. pageSize: 10,
  195. facsCode: null,
  196. facsName: null,
  197. facsType: null,
  198. facsSubtype: null,
  199. enable: null,
  200. refArea: null,
  201. manufacturer: null,
  202. facsAttrs: null
  203. },
  204. // 表单参数
  205. form: {
  206. id: null,
  207. facsCode: null,
  208. facsName: null,
  209. facsType: null,
  210. facsSubtype: null,
  211. enable: null,
  212. refArea: null,
  213. manufacturer: null,
  214. createTime: null,
  215. updateTime: null,
  216. facsAttrs: []
  217. },
  218. // 表单校验
  219. rules: {
  220. facsCode: [{ required: true, message: '设施代码不能为空', trigger: 'blur' }],
  221. facsName: [{ required: true, message: '设施名称不能为空', trigger: 'blur' }],
  222. facsType: [{ required: true, message: '设施分类不能为空', trigger: 'change' }],
  223. refArea: [{ required: true, message: '归属区域代码不能为空', trigger: 'blur' }]
  224. }
  225. }
  226. },
  227. created() {
  228. this.getList()
  229. this.getAreaTree('Area')
  230. this.getAllFacsType()
  231. },
  232. methods: {
  233. addSub() {
  234. this.form.facsAttrs.push({
  235. attrName: '',
  236. attrDesc: '',
  237. attrValue: '',
  238. attrUnit: ''
  239. })
  240. },
  241. deleteSub(index) {
  242. this.form.facsAttrs.splice(index, 1)
  243. },
  244. /** 查询能源设施/系统列表 */
  245. getList() {
  246. this.loading = true
  247. listFacs(this.queryParams).then(response => {
  248. this.facsList = response.rows
  249. this.total = response.total
  250. this.loading = false
  251. })
  252. },
  253. // 取消按钮
  254. cancel() {
  255. this.open = false
  256. this.reset()
  257. },
  258. // 表单重置
  259. reset() {
  260. this.form = this.$options.data().form
  261. this.resetForm('form')
  262. },
  263. /** 搜索按钮操作 */
  264. handleQuery() {
  265. this.queryParams.pageNum = 1
  266. this.getList()
  267. },
  268. /** 重置按钮操作 */
  269. resetQuery() {
  270. this.queryParams.refArea = null
  271. this.resetForm('queryForm')
  272. this.handleQuery()
  273. },
  274. // 多选框选中数据
  275. handleSelectionChange(selection) {
  276. this.ids = selection.map(item => item.id)
  277. this.single = selection.length !== 1
  278. this.multiple = !selection.length
  279. },
  280. /** 新增按钮操作 */
  281. handleAdd() {
  282. this.reset()
  283. this.open = true
  284. this.title = '添加能源设施/系统'
  285. },
  286. /** 修改按钮操作 */
  287. handleUpdate(row) {
  288. this.reset()
  289. const id = row.id || this.ids
  290. getFacs(id).then(response => {
  291. this.form = response.data
  292. this.open = true
  293. this.title = '修改能源设施/系统'
  294. this.handleFacsTypeChange(response.data.facsType)
  295. })
  296. },
  297. /** 提交按钮 */
  298. submitForm() {
  299. this.$refs['form'].validate(valid => {
  300. if (valid) {
  301. if (this.form.id != null) {
  302. updateFacs(this.form).then(response => {
  303. this.$modal.msgSuccess('修改成功')
  304. this.open = false
  305. this.getList()
  306. })
  307. } else {
  308. addFacs(this.form).then(response => {
  309. this.$modal.msgSuccess('新增成功')
  310. this.open = false
  311. this.getList()
  312. })
  313. }
  314. }
  315. })
  316. },
  317. /** 删除按钮操作 */
  318. handleDelete(row) {
  319. const ids = row.id || this.ids
  320. this.$modal
  321. .confirm('是否确认删除能源设施/系统编号为"' + ids + '"的数据项?')
  322. .then(function() {
  323. return delFacs(ids)
  324. })
  325. .then(() => {
  326. this.getList()
  327. this.$modal.msgSuccess('删除成功')
  328. })
  329. .catch(() => {})
  330. },
  331. /** 导出按钮操作 */
  332. handleExport() {
  333. this.download(
  334. 'ems/basecfg/emsfacs/export',
  335. {
  336. ...this.queryParams
  337. },
  338. `facs_${new Date().getTime()}.xlsx`
  339. )
  340. },
  341. /** 查询区域树结构 */
  342. getAreaTree(tier) {
  343. areaTreeSelect(tier).then(response => {
  344. this.areaOptions = response.data
  345. })
  346. },
  347. // 筛选节点
  348. filterNode(value, data) {
  349. if (!value) return true
  350. return data.label.indexOf(value) !== -1
  351. },
  352. // 节点单击事件
  353. handleNodeClick(data) {
  354. this.queryParams.refArea = data.id
  355. this.handleQuery()
  356. },
  357. /** 获取设施分类 **/
  358. getAllFacsType() {
  359. listAllFacsType().then(response => {
  360. this.facsTypeOptions = response.data
  361. })
  362. },
  363. handleFacsTypeChange(code) {
  364. const obj = {}
  365. this.facsTypeOptions.forEach(item => {
  366. if (item.code && Array.isArray(item.subtypeList)) {
  367. obj[item.code] = item.subtypeList
  368. }
  369. })
  370. this.facsSubTypeOptions = obj[code] || []
  371. }
  372. }
  373. }
  374. </script>
  375. <style lang="scss" scoped>
  376. .sub-table {
  377. .el-icon-delete {
  378. cursor: pointer;
  379. }
  380. .operateBtns {
  381. cursor: pointer;
  382. i {
  383. color: #1990ff;
  384. margin-left: 5px;
  385. }
  386. }
  387. }
  388. </style>