index.vue 13 KB

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