index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  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 v-permissions="['base:agent:add']" icon="el-icon-plus" type="primary" @click="handleEdit($event)">
  61. 新建
  62. </el-button>
  63. </vab-query-form-left-panel>
  64. <vab-query-form-right-panel>
  65. <table-tool :columns="columns" :show-columns.sync="showColumns" table-type="agentTable" />
  66. </vab-query-form-right-panel>
  67. <el-table
  68. :key="tableKey"
  69. ref="table"
  70. v-loading="listLoading"
  71. border
  72. :data="list"
  73. :height="$baseTableHeight(2)"
  74. @selection-change="setSelectRows">
  75. <el-table-column
  76. v-for="(item, index) in showColumns"
  77. :key="index"
  78. align="center"
  79. :label="item.label"
  80. :prop="item.prop"
  81. show-overflow-tooltip
  82. :sortable="item.sortable"
  83. :width="item.width">
  84. <template #default="{ row }">
  85. <el-button
  86. v-if="item.prop === 'distName'"
  87. class="link-button"
  88. style="font-size: 14px"
  89. type="text"
  90. @click="handleDetail(row)">
  91. {{ row.distName }}
  92. </el-button>
  93. <span v-else-if="item.prop === 'allProductAmount'">
  94. {{ formatPrice(row.allProductAmount) }}
  95. </span>
  96. <span v-else-if="item.prop === 'saledAmount'">
  97. {{ formatPrice(row.saledAmount) }}
  98. </span>
  99. <span v-else-if="item.prop === 'unpaidAmount'">
  100. {{ formatPrice(row.unpaidAmount) }}
  101. </span>
  102. <span v-else-if="item.prop === 'invoicedAmount'">
  103. {{ formatPrice(row.invoicedAmount) }}
  104. </span>
  105. <span v-else-if="item.prop === 'approItem'">
  106. {{ row.approStatus == '20' ? row.approItem : '-' }}
  107. </span>
  108. <span v-else-if="item.prop === 'approStatus'">
  109. {{ row.approStatus == '20' ? '待审核' : '-' }}
  110. </span>
  111. <span v-else>{{ row[item.prop] }}</span>
  112. </template>
  113. </el-table-column>
  114. <el-table-column align="center" fixed="right" label="操作" show-overflow-tooltip width="180">
  115. <template #default="{ row }">
  116. <el-button type="text" @click="changeDistr(row)">转为经销</el-button>
  117. <el-button type="text" @click="$refs.changeAgent.open(row, 'renewal')">续签</el-button>
  118. <el-button v-permissions="['base:agent:edit']" type="text" @click="handleEdit(row)">编辑</el-button>
  119. <el-button v-permissions="['base:agent:delete']" type="text" @click="handleDelete(row)">删除</el-button>
  120. </template>
  121. </el-table-column>
  122. <template #empty>
  123. <el-image class="vab-data-empty" :src="require('@/assets/empty_images/data_empty.png')" />
  124. </template>
  125. </el-table>
  126. <el-pagination
  127. background
  128. :current-page="queryForm.pageNum"
  129. :layout="layout"
  130. :page-size="queryForm.pageSize"
  131. :total="total"
  132. @current-change="handleCurrentChange"
  133. @size-change="handleSizeChange" />
  134. </div>
  135. </div>
  136. <edit ref="edit" @fetch-data="fetchData" />
  137. <change-agent ref="changeAgent" @fetch-data="fetchData" />
  138. </div>
  139. </template>
  140. <script>
  141. import to from 'await-to-js'
  142. import distrApi from '@/api/base/distr'
  143. import regionApi from '@/api/base/region'
  144. import regionAuthApi from '@/api/base/regionAuth'
  145. import Edit from './components/AgentEdit'
  146. import TableTool from '@/components/table/TableTool'
  147. import ChangeAgent from '@/views/base/distributor/components/ChangeAgent'
  148. export default {
  149. name: 'Distributor',
  150. components: { Edit, TableTool, ChangeAgent },
  151. data() {
  152. return {
  153. tableKey: 0,
  154. list: [],
  155. listLoading: true,
  156. layout: 'total, sizes, prev, pager, next, jumper',
  157. total: 0,
  158. selectRows: '',
  159. queryForm: {
  160. distType: '20', // 10 经销商 20 代理商
  161. pageNum: 1,
  162. pageSize: 10,
  163. userName: '',
  164. },
  165. showColumns: [],
  166. columns: [
  167. {
  168. label: '代理商名称',
  169. width: '220px',
  170. prop: 'distName',
  171. sortable: false,
  172. disableCheck: true,
  173. },
  174. {
  175. label: '所在省份',
  176. width: '100px',
  177. prop: 'provinceDesc',
  178. sortable: false,
  179. },
  180. {
  181. label: 'ABC项目总数量',
  182. width: '140px',
  183. prop: 'projectNum',
  184. sortable: false,
  185. },
  186. {
  187. label: 'ABC项目出货总金额',
  188. width: '150px',
  189. prop: 'allProductAmount',
  190. sortable: false,
  191. },
  192. {
  193. label: '成交项目数量',
  194. width: '140px',
  195. prop: 'saledProjectNum',
  196. sortable: false,
  197. },
  198. {
  199. label: '成交总金额',
  200. width: '100px',
  201. prop: 'saledAmount',
  202. sortable: false,
  203. },
  204. {
  205. label: '未回款总金额',
  206. width: '140px',
  207. prop: 'unpaidAmount',
  208. sortable: false,
  209. },
  210. {
  211. label: '开票总金额',
  212. width: '100px',
  213. prop: 'invoicedAmount',
  214. sortable: false,
  215. },
  216. {
  217. label: '归属销售',
  218. width: 'auto',
  219. prop: 'belongSale',
  220. sortable: false,
  221. },
  222. {
  223. label: '业务范围',
  224. width: 'auto',
  225. prop: 'businessScope',
  226. sortable: false,
  227. },
  228. {
  229. label: '审核类型',
  230. width: 'auto',
  231. prop: 'approItem',
  232. sortable: false,
  233. },
  234. {
  235. label: '审核状态',
  236. width: 'auto',
  237. prop: 'approStatus',
  238. sortable: false,
  239. },
  240. {
  241. label: '创建时间',
  242. width: '100px',
  243. prop: 'createdTime',
  244. sortable: false,
  245. },
  246. ],
  247. regionOptions: [],
  248. userSalesProvince: undefined,
  249. defaultProps: {
  250. id: 'id',
  251. children: 'children',
  252. label: 'regionDesc',
  253. },
  254. treeDefaultExpandAll: true,
  255. }
  256. },
  257. watch: {
  258. showColumns: function () {
  259. this.tableKey++
  260. this.$nextTick(() => this.$refs.table.doLayout())
  261. },
  262. },
  263. activated() {
  264. this.fetchData()
  265. },
  266. created() {
  267. this.fetchData()
  268. this.getRegionTree()
  269. this.getUserSalesProvince()
  270. },
  271. methods: {
  272. // 转经销商
  273. changeDistr(row) {
  274. console.log(row)
  275. this.$prompt('请输入转经销商原因', '提示', {
  276. confirmButtonText: '确定',
  277. cancelButtonText: '取消',
  278. inputPattern: /\S+/,
  279. inputErrorMessage: '原因不能为空',
  280. })
  281. .then(async ({ value }) => {
  282. // 当用户点击确定按钮时,执行的逻辑
  283. console.log('输入的值为:', value)
  284. const [err, res] = await to(distrApi.changeDistr({ id: row.id, customerType: value }))
  285. if (err) return
  286. if (res.code == 200) {
  287. this.$baseMessage('转经销商成功', 'success', 'vab-hey-message-success')
  288. this.handleCurrentChange(1)
  289. }
  290. })
  291. .catch(() => {
  292. // 当用户点击取消按钮时,执行的逻辑
  293. console.log('取消输入')
  294. })
  295. },
  296. async getRegionTree() {
  297. const { data: data } = await regionApi.getRegionTree({})
  298. this.regionOptions.push(...data.list)
  299. },
  300. async getUserSalesProvince() {
  301. const { data: data } = await regionAuthApi.getUserSalesProvince({})
  302. if (data && data.list) {
  303. this.regionOptions.unshift(data.list)
  304. }
  305. },
  306. // 筛选节点
  307. filterNode(value, data) {
  308. if (!value) return true
  309. return data[this.defaultProps.label].indexOf(value) !== -1
  310. },
  311. // 节点单击事件
  312. handleNodeClick(data) {
  313. if (data.children && data.children.length) {
  314. this.queryForm.provinceId = data.children.map((item) => item.regionCode)
  315. } else {
  316. this.queryForm.provinceId = [data.regionCode]
  317. }
  318. this.fetchData()
  319. },
  320. setSelectRows(val) {
  321. this.selectRows = val
  322. },
  323. handleEdit(row) {
  324. if (row.id) {
  325. this.$refs['edit'].showEdit(row)
  326. } else {
  327. this.$refs['edit'].showEdit()
  328. }
  329. },
  330. handleDelete(row) {
  331. if (row.id) {
  332. this.$baseConfirm('你确定要删除当前项吗', null, async () => {
  333. const { msg } = await distrApi.doDelete({ ids: [row.id] })
  334. this.$baseMessage(msg, 'success', 'vab-hey-message-success')
  335. await this.fetchData()
  336. })
  337. } else {
  338. if (this.selectRows.length > 0) {
  339. const ids = this.selectRows.map((item) => parseInt(item.id))
  340. console.log(ids)
  341. this.$baseConfirm('你确定要删除选中项吗', null, async () => {
  342. const { msg } = await distrApi.doDelete({ ids })
  343. this.$baseMessage(msg, 'success', 'vab-hey-message-success')
  344. await this.fetchData()
  345. })
  346. } else {
  347. this.$baseMessage('未选中任何行', 'error', 'vab-hey-message-error')
  348. }
  349. }
  350. },
  351. handleSizeChange(val) {
  352. this.queryForm.pageSize = val
  353. this.fetchData()
  354. },
  355. handleCurrentChange(val) {
  356. this.queryForm.pageNum = val
  357. this.fetchData()
  358. },
  359. queryData() {
  360. this.queryForm.pageNum = 1
  361. this.fetchData()
  362. },
  363. async fetchData() {
  364. this.listLoading = true
  365. const params = Object.assign(this.queryForm, { withStatistic: true, distType: '20' })
  366. const {
  367. data: { list, total },
  368. } = await distrApi.getList(params)
  369. this.list = list
  370. this.total = total
  371. this.listLoading = false
  372. this.tableKey++
  373. this.$nextTick(() => this.$refs.table.doLayout())
  374. },
  375. reset() {
  376. this.queryForm = {
  377. pageNum: 1,
  378. pageSize: 10,
  379. distName: '',
  380. belongSale: '',
  381. }
  382. this.fetchData()
  383. },
  384. //详情
  385. handleDetail(row) {
  386. this.$router.push({
  387. path: '/base/agentDetails',
  388. query: {
  389. id: row.id,
  390. },
  391. })
  392. },
  393. },
  394. }
  395. </script>
  396. <style>
  397. .el-tree-node:focus > .el-tree-node__content {
  398. /*设置选中的样式 */
  399. background-color: #dde9ff !important;
  400. }
  401. .el-tree-node__content:hover {
  402. /*设置鼠标飘过的颜色 */
  403. background: #eaf9ff !important;
  404. color: #007bff;
  405. }
  406. .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
  407. /*current选中的样式 */
  408. color: #4d95fd;
  409. font-weight: bold;
  410. background-color: #dde9ff !important;
  411. }
  412. </style>