index.vue 9.8 KB

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