index.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <template>
  2. <div class="user-management-container">
  3. <el-row :gutter="20" type="flex">
  4. <el-col :span="6">
  5. <div class="head-container">
  6. <span style="font-size: 25px">所属区域</span>
  7. </div>
  8. <div class="tree-container">
  9. <el-tree
  10. ref="tree"
  11. :data="deptOptions"
  12. default-expand
  13. :default-expand-all="false"
  14. :expand-on-click-node="true"
  15. :filter-node-method="filterNode"
  16. highlight-current
  17. :props="defaultProps"
  18. @node-click="handleNodeClick">
  19. <span slot-scope="{ node }" class="custom-tree-node">
  20. <span>{{ node.label }}</span>
  21. <span>
  22. <i class="el-icon-more"></i>
  23. </span>
  24. </span>
  25. </el-tree>
  26. </div>
  27. </el-col>
  28. <el-col :span="18">
  29. <vab-query-form>
  30. <vab-query-form-left-panel :span="20">
  31. <el-form :inline="true" :model="queryForm" @submit.native.prevent>
  32. <el-form-item>
  33. <el-input v-model.trim="queryForm.distCode" clearable placeholder="经销商编码" />
  34. </el-form-item>
  35. <el-form-item>
  36. <el-input v-model.trim="queryForm.distName" clearable placeholder="经销商名称" />
  37. </el-form-item>
  38. <el-form-item>
  39. <el-input v-model.trim="queryForm.belongSale" clearable placeholder="所属销售" />
  40. </el-form-item>
  41. <el-form-item>
  42. <el-button icon="el-icon-search" type="primary" @click="queryData">查询</el-button>
  43. <el-button icon="el-icon-refresh-right" @click="reset">重置</el-button>
  44. </el-form-item>
  45. </el-form>
  46. <vab-query-form-left-panel :span="5">
  47. <el-button icon="el-icon-plus" type="primary" @click="handleEdit($event)">新建</el-button>
  48. </vab-query-form-left-panel>
  49. </vab-query-form-left-panel>
  50. <vab-query-form-right-panel :span="29">
  51. <el-button icon="el-icon-download" />
  52. <table-tool :check-list.sync="checkList" :columns="columns" />
  53. </vab-query-form-right-panel>
  54. </vab-query-form>
  55. <el-table
  56. v-loading="listLoading"
  57. border
  58. :data="list"
  59. style="width: 100%; height: 500px"
  60. @selection-change="setSelectRows">
  61. <el-table-column
  62. v-for="(item, index) in finallyColumns"
  63. :key="index"
  64. align="center"
  65. :label="item.label"
  66. :prop="item.prop"
  67. show-overflow-tooltip
  68. :sortable="item.sortable"
  69. :width="item.width">
  70. <template #default="{ row }">
  71. <span>{{ row[item.prop] }}</span>
  72. </template>
  73. </el-table-column>
  74. <vab-query-form-right-panel :span="6">
  75. <el-button icon="el-icon-search" type="primary" @click="queryData">查询</el-button>
  76. <el-button icon="el-icon-plus" type="primary" @click="handleEdit($event)">新建</el-button>
  77. </vab-query-form-right-panel>
  78. <el-table-column align="center" label="操作" show-overflow-tooltip width="85">
  79. <template #default="{ row }">
  80. <el-button type="text" @click="handleEdit(row)">编辑</el-button>
  81. <el-button type="text" @click="handleDelete(row)">删除</el-button>
  82. </template>
  83. </el-table-column>
  84. <template #empty>
  85. <el-image class="vab-data-empty" :src="require('@/assets/empty_images/data_empty.png')" />
  86. </template>
  87. </el-table>
  88. <el-pagination
  89. background
  90. :current-page="queryForm.pageNum"
  91. :layout="layout"
  92. :page-size="queryForm.pageSize"
  93. :total="total"
  94. @current-change="handleCurrentChange"
  95. @size-change="handleSizeChange" />
  96. </el-col>
  97. </el-row>
  98. <edit ref="edit" @fetch-data="fetchData" />
  99. </div>
  100. </template>
  101. <script>
  102. import Edit from './components/DistrEdit'
  103. import distrApi from '@/api/distr'
  104. import TableTool from '@/components/table/TableTool'
  105. export default {
  106. name: 'Distr',
  107. components: { Edit, TableTool },
  108. data() {
  109. return {
  110. list: [],
  111. listLoading: true,
  112. layout: 'total, sizes, prev, pager, next, jumper',
  113. total: 0,
  114. selectRows: '',
  115. queryForm: {
  116. pageNum: 1,
  117. pageSize: 10,
  118. userName: '',
  119. },
  120. checkList: [],
  121. columns: [
  122. {
  123. label: '所在省份',
  124. width: '100px',
  125. prop: 'provinceDesc',
  126. sortable: false,
  127. },
  128. {
  129. label: '归属销售',
  130. width: 'auto',
  131. prop: 'belongSale',
  132. sortable: false,
  133. disableCheck: true,
  134. },
  135. {
  136. label: '业务范围',
  137. width: 'auto',
  138. prop: 'businessScope',
  139. sortable: false,
  140. disableCheck: true,
  141. },
  142. {
  143. label: '负责人',
  144. width: 'auto',
  145. prop: 'distBoss',
  146. sortable: false,
  147. disableCheck: true,
  148. },
  149. {
  150. label: '归属销售',
  151. width: 'auto',
  152. prop: 'belongSale',
  153. sortable: false,
  154. disableCheck: true,
  155. },
  156. ],
  157. deptOptions: undefined,
  158. defaultProps: {
  159. id: 'id',
  160. children: 'children',
  161. label: 'regionDesc',
  162. },
  163. treeDefaultExpandAll: true,
  164. }
  165. },
  166. computed: {
  167. height() {
  168. return this.$baseTableHeight(1)
  169. },
  170. finallyColumns() {
  171. console.log('finallyColums')
  172. return this.columns.filter((item) => this.checkList.includes(item.label))
  173. },
  174. },
  175. created() {
  176. this.fetchData()
  177. this.getTree()
  178. },
  179. methods: {
  180. async getTree() {
  181. const { data: data } = await distrApi.getTree({})
  182. console.log('区域', data.list)
  183. this.deptOptions = data.list
  184. },
  185. // 筛选节点
  186. filterNode(value, data) {
  187. if (!value) return true
  188. return data[this.defaultProps.label].indexOf(value) !== -1
  189. },
  190. // 节点单击事件
  191. handleNodeClick(data) {
  192. console.log('ID', data.id)
  193. this.queryForm.provinceId = data.id
  194. this.fetchData()
  195. },
  196. setSelectRows(val) {
  197. this.selectRows = val
  198. },
  199. handleEdit(row) {
  200. if (row.id) {
  201. this.$refs['edit'].showEdit(row)
  202. } else {
  203. this.$refs['edit'].showEdit()
  204. }
  205. },
  206. handleDelete(row) {
  207. if (row.id) {
  208. this.$baseConfirm('你确定要删除当前项吗', null, async () => {
  209. const { msg } = await distrApi.doDelete({ ids: row.id })
  210. this.$baseMessage(msg, 'success', 'vab-hey-message-success')
  211. await this.fetchData()
  212. })
  213. } else {
  214. if (this.selectRows.length > 0) {
  215. const ids = this.selectRows.map((item) => parseInt(item.id))
  216. console.log(ids)
  217. this.$baseConfirm('你确定要删除选中项吗', null, async () => {
  218. const { msg } = await distrApi.doDelete({ ids })
  219. this.$baseMessage(msg, 'success', 'vab-hey-message-success')
  220. await this.fetchData()
  221. })
  222. } else {
  223. this.$baseMessage('未选中任何行', 'error', 'vab-hey-message-error')
  224. }
  225. }
  226. },
  227. handleSizeChange(val) {
  228. this.queryForm.pageSize = val
  229. this.fetchData()
  230. },
  231. handleCurrentChange(val) {
  232. this.queryForm.pageNum = val
  233. this.fetchData()
  234. },
  235. queryData() {
  236. this.queryForm.pageNum = 1
  237. this.fetchData()
  238. },
  239. async fetchData() {
  240. this.listLoading = true
  241. const {
  242. data: { list, total },
  243. } = await distrApi.getList(this.queryForm)
  244. this.list = list
  245. this.total = total
  246. this.listLoading = false
  247. },
  248. reset() {
  249. ;(this.queryForm = {
  250. pageNum: 1,
  251. pageSize: 10,
  252. distCode: '',
  253. distName: '',
  254. belongSale: '',
  255. }),
  256. this.fetchData()
  257. },
  258. },
  259. }
  260. </script>
  261. <style>
  262. .el-tree-node:focus > .el-tree-node__content {
  263. /*设置选中的样式 */
  264. background-color: #dde9ff !important;
  265. }
  266. .el-tree-node__content:hover {
  267. /*设置鼠标飘过的颜色 */
  268. background: #eaf9ff !important;
  269. color: #007bff;
  270. }
  271. .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
  272. /*current选中的样式 */
  273. color: #4d95fd;
  274. font-weight: bold;
  275. background-color: #dde9ff !important;
  276. }
  277. </style>