index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  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="zoningName">
  17. <el-input v-model="queryParams.zoningName" placeholder="请输入分区名称" clearable @keyup.enter.native="handleQuery" />
  18. </el-form-item>
  19. <el-form-item label="区块标签" prop="tagCode">
  20. <el-select v-model="queryParams.tagCodeList" placeholder="请选择区块标签" multiple clearable :style="{width: '100%'}">
  21. <el-option v-for="item in emsTagOptions" :label="item.tagName" :value="item.tagCode" :key="item.tagCode" />
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item>
  25. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  26. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  27. </el-form-item>
  28. </el-form>
  29. <el-row :gutter="10" class="mb8">
  30. <el-col :span="1.5">
  31. <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['basecfg:zoning:add']">新增
  32. </el-button>
  33. </el-col>
  34. <el-col :span="1.5">
  35. <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
  36. v-hasPermi="['basecfg:zoning:edit']">修改</el-button>
  37. </el-col>
  38. <el-col :span="1.5">
  39. <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
  40. v-hasPermi="['basecfg:zoning:remove']">删除</el-button>
  41. </el-col>
  42. <el-col :span="1.5">
  43. <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
  44. v-hasPermi="['basecfg:zoning:export']">导出</el-button>
  45. </el-col>
  46. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  47. </el-row>
  48. <el-table v-loading="loading" :data="zoningList" @selection-change="handleSelectionChange">
  49. <el-table-column type="selection" width="55" align="center" />
  50. <el-table-column label="分区名称" align="left" prop="zoningName" />
  51. <el-table-column label="分区编码" align="center" prop="zoningCode" width="200" />
  52. <el-table-column label="所在建筑" align="left" prop="areaPath" />
  53. <el-table-column label="区块标签" align="center">
  54. <template slot-scope="scope">
  55. <span v-for="tag in scope.row.tagNames" :key="tag" :style="getTagStyle(tag)" class="tag-label">
  56. {{ tag }}
  57. </span>
  58. </template>
  59. </el-table-column>
  60. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  61. <template slot-scope="scope">
  62. <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['basecfg:zoning:edit']">
  63. 修改</el-button>
  64. <el-button size="mini" type="text" icon="el-icon-delete" class="deleteBtn" @click="handleDelete(scope.row)" v-hasPermi="['basecfg:zoning:remove']">
  65. 删除</el-button>
  66. </template>
  67. </el-table-column>
  68. </el-table>
  69. <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
  70. @pagination="getList" />
  71. <!-- 添加或修改建筑区域划分对话框 -->
  72. <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
  73. <el-form ref="form" :model="form" :rules="rules" label-width="100px">
  74. <el-form-item label="所属建筑" prop="bldgCode">
  75. <treeselect v-model="form.bldgCode" :options="areaOptions" :disable-branch-nodes="true" :show-count="true"
  76. placeholder="请选择所属建筑" />
  77. </el-form-item>
  78. <el-form-item label="楼层" prop="floor">
  79. <el-input v-model="form.floor" placeholder="请输入楼层" />
  80. </el-form-item>
  81. <el-form-item label="分区编码" prop="zoningCode">
  82. <el-input v-model="form.zoningCode" placeholder="请输入分区编码" />
  83. </el-form-item>
  84. <el-form-item label="分区名称" prop="zoningName">
  85. <el-input v-model="form.zoningName" placeholder="请输入分区名称" />
  86. </el-form-item>
  87. <el-form-item label="分区标签" prop="tagCodeList">
  88. <el-select v-model="form.tagCodeList" placeholder="请选择分区标签" multiple clearable style="width: 100%">
  89. <el-option v-for="item in emsTagOptions" :label="item.tagName" :value="item.tagCode" :key="item.tagCode" />
  90. </el-select>
  91. </el-form-item>
  92. <el-form-item label="建筑划分面积" prop="bldgLdArea">
  93. <el-input v-model="form.bldgLdArea" placeholder="请输入建筑划分面积" />
  94. </el-form-item>
  95. <el-form-item label="使用情况" prop="usageDetail">
  96. <el-input v-model="form.usageDetail" placeholder="请输入使用情况" />
  97. </el-form-item>
  98. </el-form>
  99. <div slot="footer" class="dialog-footer">
  100. <el-button type="primary" @click="submitForm">确 定</el-button>
  101. <el-button @click="cancel">取 消</el-button>
  102. </div>
  103. </el-dialog>
  104. </el-col>
  105. </el-row>
  106. </div>
  107. </template>
  108. <script>
  109. import { listZoning, getZoning, delZoning, addZoning, updateZoning } from '@/api/basecfg/zoning'
  110. import { getEmsTag } from '@/api/commonApi'
  111. import { areaTreeSelect } from '@/api/basecfg/area'
  112. import Treeselect from '@riophae/vue-treeselect'
  113. import '@riophae/vue-treeselect/dist/vue-treeselect.css'
  114. export default {
  115. name: "Zonin",
  116. components: { Treeselect },
  117. data() {
  118. return {
  119. // 遮罩层
  120. loading: true,
  121. // 选中数组
  122. ids: [],
  123. // 非单个禁用
  124. single: true,
  125. // 非多个禁用
  126. multiple: true,
  127. // 显示搜索条件
  128. showSearch: true,
  129. // 总条数
  130. total: 0,
  131. // 建筑区域划分表格数据
  132. zoningList: [],
  133. // 弹出层标题
  134. title: '',
  135. // 是否显示弹出层
  136. open: false,
  137. // 区域名称
  138. areaName: undefined,
  139. // 区域树选项
  140. areaOptions: undefined,
  141. // 标签选项
  142. emsTagOptions: undefined,
  143. defaultProps: {
  144. children: 'children',
  145. label: 'label'
  146. },
  147. // 查询参数
  148. queryParams: {
  149. pageNum: 1,
  150. pageSize: 10,
  151. areaCode: null,
  152. bldgCode: null,
  153. zoningName: null,
  154. tagCodeList: null
  155. },
  156. // 表单参数
  157. form: {},
  158. // 表单校验
  159. rules: {
  160. zoningCode: [{ required: true, message: '分区编码不能为空', trigger: 'blur' }],
  161. zoningName: [{ required: true, message: '分区名称不能为空', trigger: 'blur' }]
  162. }
  163. }
  164. },
  165. watch: {
  166. // 根据名称筛选区域树
  167. areaName(val) {
  168. this.$refs.tree.filter(val)
  169. }
  170. },
  171. created() {
  172. this.getList()
  173. this.getAreaTree('Building')
  174. this.getEmsTag('Area')
  175. },
  176. methods: {
  177. formatDict(val, options, key = 'code', text = 'name') {
  178. let name = ''
  179. this[options].forEach(item => {
  180. if (val === item[key]) {
  181. name = item[text]
  182. }
  183. })
  184. return name
  185. },
  186. getTagStyle(tag) {
  187. const styleMap = {
  188. '公共区域': 'background-color: rgb(255,255,125); color: rgb(109,109,150); padding: 4px 8px; border-radius: 4px; width: 80px; height: 30px; margin: 4px 8px 4px 0; display: inline-block; vertical-align: top;',
  189. '商户区域': 'background-color: rgb(206,206,255); color: rgb(109,109,150); padding: 4px 8px; border-radius: 4px; width: 80px; height: 30px; margin: 4px 8px 4px 0; display: inline-block; vertical-align: top;',
  190. '热点区域': 'background-color: rgb(203,255,99); color: rgb(109,109,150); padding: 4px 8px; border-radius: 4px; width: 80px; height: 30px; margin: 4px 8px 4px 0; display: inline-block; vertical-align: top;'
  191. };
  192. return styleMap[tag] || 'background-color: #FFFFFF; color: #000000; padding: 4px 8px; border-radius: 4px; width: 80px; height: 30px; margin: 4px 8px 4px 0; display: inline-block; vertical-align: top;';
  193. },
  194. /** 查询建筑区域划分列表 */
  195. getList() {
  196. this.loading = true;
  197. listZoning(this.queryParams).then(response => {
  198. this.zoningList = response.rows.map(item => {
  199. // 将 tagNames 字符串转换为数组
  200. item.tagNames = item.tagNames.split(',').map(tag => tag.trim());
  201. return item;
  202. });
  203. this.total = response.total;
  204. this.loading = false;
  205. });
  206. },
  207. /** 查询区域树结构 */
  208. getAreaTree(tier) {
  209. areaTreeSelect(tier).then(response => {
  210. this.areaOptions = response.data
  211. })
  212. },
  213. // 筛选节点
  214. filterNode(value, data) {
  215. if (!value) return true
  216. return data.label.indexOf(value) !== -1
  217. },
  218. // 节点单击事件
  219. handleNodeClick(data) {
  220. if (data.tier === 'Area') {
  221. this.queryParams.areaCode = data.id
  222. this.queryParams.bldgCode = null
  223. } else if (data.tier === 'Building') {
  224. this.queryParams.areaCode = null
  225. this.queryParams.bldgCode = data.id
  226. }
  227. this.handleQuery()
  228. },
  229. // 取消按钮
  230. cancel() {
  231. this.open = false
  232. this.reset()
  233. },
  234. // 表单重置
  235. reset() {
  236. this.form = {
  237. id: null,
  238. bldgCode: null,
  239. zoningCode: null,
  240. zoningName: null,
  241. floor: null,
  242. roomNo: null,
  243. bldgLdArea: null,
  244. usageDetail: null,
  245. tagCodeList: null
  246. }
  247. this.resetForm('form')
  248. },
  249. /** 搜索按钮操作 */
  250. handleQuery() {
  251. this.queryParams.pageNum = 1
  252. this.getList()
  253. },
  254. /** 重置按钮操作 */
  255. resetQuery() {
  256. this.queryParams.bldgCode = null
  257. this.resetForm('queryForm')
  258. this.handleQuery()
  259. },
  260. // 多选框选中数据
  261. handleSelectionChange(selection) {
  262. this.ids = selection.map(item => item.id)
  263. this.single = selection.length !== 1
  264. this.multiple = !selection.length
  265. },
  266. /** 新增按钮操作 */
  267. handleAdd() {
  268. this.reset()
  269. this.open = true
  270. this.title = '添加建筑区域划分'
  271. },
  272. /** 修改按钮操作 */
  273. handleUpdate(row) {
  274. this.reset()
  275. const id = row.id || this.ids
  276. getZoning(id).then(response => {
  277. this.form = response.data
  278. this.open = true
  279. this.title = '修改建筑区域划分'
  280. })
  281. },
  282. /** 提交按钮 */
  283. submitForm() {
  284. this.$refs['form'].validate(valid => {
  285. if (valid) {
  286. if (this.form.id != null) {
  287. updateZoning(this.form).then(response => {
  288. this.$modal.msgSuccess('修改成功')
  289. this.open = false
  290. this.getList()
  291. })
  292. } else {
  293. addZoning(this.form).then(response => {
  294. this.$modal.msgSuccess('新增成功')
  295. this.open = false
  296. this.getList()
  297. })
  298. }
  299. }
  300. })
  301. },
  302. /** 删除按钮操作 */
  303. handleDelete(row) {
  304. const ids = row.id || this.ids
  305. this.$modal
  306. .confirm('是否确认删除建筑区域划分编号为"' + ids + '"的数据项?')
  307. .then(function() {
  308. return delZoning(ids)
  309. })
  310. .then(() => {
  311. this.getList()
  312. this.$modal.msgSuccess('删除成功')
  313. })
  314. .catch(() => {})
  315. },
  316. /** 导出按钮操作 */
  317. handleExport() {
  318. this.download(
  319. 'ems/basecfg/area/building/zoning/export',
  320. {
  321. ...this.queryParams
  322. },
  323. `zoning_${new Date().getTime()}.xlsx`
  324. )
  325. },
  326. getEmsTag(tagModel) {
  327. console.log("tagModel", tagModel)
  328. getEmsTag(tagModel).then(response => {
  329. this.emsTagOptions = response.data
  330. console.log("分区标签",this.emsTagOptions)
  331. })
  332. }
  333. }
  334. }
  335. </script>