index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. <template>
  2. <div class="user-management-container">
  3. <div class="side-layout">
  4. <div class="tree-side">
  5. <div class="head-container">
  6. <el-row style="padding-right: 10px" type="flex">
  7. <el-col><span style="font-size: 25px">公司</span></el-col>
  8. <el-button type="text" @click="addCompany()">新增</el-button>
  9. </el-row>
  10. </div>
  11. <el-tree
  12. ref="tree"
  13. class="filter-tree"
  14. :data="companyList"
  15. default-expand-all
  16. :default-expanded-keys="[1]"
  17. highlight-current
  18. node-key="id"
  19. :props="defaultProps"
  20. @node-click="handleNodeClick">
  21. <span slot-scope="{ node }" class="custom-tree-node">
  22. <span>
  23. <span>{{ node.label }}</span>
  24. </span>
  25. <span>
  26. <!-- <el-button icon="el-icon-more" type="text" /> -->
  27. <el-dropdown @command="(command) => treeHandle(command, node)">
  28. <span class="el-dropdown-link">
  29. <i class="el-icon-more"></i>
  30. <!-- <i class="el-icon-arrow-down el-icon--right"></i> -->
  31. </span>
  32. <el-dropdown-menu slot="dropdown">
  33. <el-dropdown-item v-permissions="['partner/company/edit']" command="edit">编辑</el-dropdown-item>
  34. <el-dropdown-item v-permissions="['partner/company/del']" command="del">删除</el-dropdown-item>
  35. </el-dropdown-menu>
  36. </el-dropdown>
  37. </span>
  38. </span>
  39. </el-tree>
  40. </div>
  41. <div class="tree-table">
  42. <vab-query-form>
  43. <vab-query-form-top-panel>
  44. <el-form :inline="true" :model="queryForm" @submit.native.prevent>
  45. <el-form-item>
  46. <el-input
  47. v-model.trim="queryForm.name"
  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-left-panel>
  59. <el-button icon="el-icon-plus" type="primary" @click="$refs.edit.open(queryForm.partnerId)">添加</el-button>
  60. <el-button
  61. v-permissions="['partner/contact/import']"
  62. icon="el-icon-download"
  63. type="primary"
  64. @click="downloadTemplate">
  65. 下载模板
  66. </el-button>
  67. <el-upload
  68. ref="uploadRef"
  69. action="#"
  70. :before-upload="
  71. (file) => {
  72. return beforeAvatarUpload(file)
  73. }
  74. "
  75. :file-list="fileList"
  76. :http-request="uploadrequest"
  77. :show-file-list="false"
  78. style="margin: 0 10px 10px 0 !important">
  79. <el-button v-permissions="['partner/contact/import']" icon="el-icon-upload2" type="primary">
  80. 导入
  81. </el-button>
  82. </el-upload>
  83. </vab-query-form-left-panel>
  84. <vab-query-form-right-panel>
  85. <table-tool :columns="columns" :show-columns.sync="showColumns" table-type="partnerTable" />
  86. </vab-query-form-right-panel>
  87. </vab-query-form>
  88. <el-table ref="table" v-loading="listLoading" border :data="list" :height="$baseTableHeight(2)">
  89. <el-table-column align="center" label="序号" show-overflow-tooltip width="80">
  90. <template #default="{ $index }">
  91. {{ $index + 1 }}
  92. </template>
  93. </el-table-column>
  94. <el-table-column
  95. v-for="(item, index) in showColumns"
  96. :key="index"
  97. align="center"
  98. :label="item.label"
  99. :min-width="item.minWidth"
  100. :prop="item.prop"
  101. show-overflow-tooltip
  102. :sortable="item.sortable"
  103. :width="item.width">
  104. <template #default="{ row }">
  105. <span>{{ row[item.prop] }}</span>
  106. </template>
  107. </el-table-column>
  108. <el-table-column align="center" fixed="right" label="操作" show-overflow-tooltip width="120">
  109. <template #default="{ row }">
  110. <el-button v-permissions="['partner/contact/edit']" type="text" @click="$refs.edit.open(row)">
  111. 编辑
  112. </el-button>
  113. <el-button type="text" @click="handleDetail(row)">详情</el-button>
  114. <el-button v-permissions="['partner/contact/del']" type="text" @click="handleDelete(row)">删除</el-button>
  115. </template>
  116. </el-table-column>
  117. <template #empty>
  118. <el-image class="vab-data-empty" :src="require('@/assets/empty_images/data_empty.png')" />
  119. </template>
  120. </el-table>
  121. <el-pagination
  122. background
  123. :current-page="queryForm.pageNum"
  124. :layout="layout"
  125. :page-size="queryForm.pageSize"
  126. :total="total"
  127. @current-change="handleCurrentChange"
  128. @size-change="handleSizeChange" />
  129. </div>
  130. </div>
  131. <partner-edit ref="edit" @fetch-data="fetchData" />
  132. </div>
  133. </template>
  134. <script>
  135. import partnerApi from '@/api/base/partner'
  136. import TableTool from '@/components/table/TableTool'
  137. import PartnerEdit from './components/PartnerEdit'
  138. import downloadFileByByte from '@/utils/base64ToFile'
  139. import to from 'await-to-js'
  140. import axios from 'axios'
  141. import asyncUploadFile from '@/utils/uploadajax'
  142. export default {
  143. name: 'Product',
  144. components: { TableTool, PartnerEdit },
  145. data() {
  146. return {
  147. list: [],
  148. listLoading: false,
  149. layout: 'total, sizes, prev, pager, next, jumper',
  150. total: 0,
  151. queryForm: {
  152. pageNum: 1,
  153. pageSize: 10,
  154. name: '',
  155. partnerId: null,
  156. },
  157. showColumns: [],
  158. columns: [
  159. {
  160. label: '负责区域',
  161. width: '220px',
  162. prop: 'territory',
  163. sortable: false,
  164. disableCheck: true,
  165. },
  166. {
  167. label: '联系人',
  168. prop: 'name',
  169. width: '120px',
  170. sortable: false,
  171. disableCheck: true,
  172. },
  173. {
  174. label: '联系方式',
  175. width: '120px',
  176. prop: 'contactWay',
  177. sortable: false,
  178. },
  179. {
  180. label: '岗位',
  181. width: '120px',
  182. prop: 'post',
  183. sortable: false,
  184. },
  185. {
  186. label: '备注',
  187. width: 'auto',
  188. prop: 'remark',
  189. minWidth: '220px',
  190. sortable: false,
  191. },
  192. ],
  193. defaultProps: {
  194. key: 'id',
  195. label: 'partnerName',
  196. },
  197. fileList: [],
  198. fileSettings: {
  199. // 文件配置信息
  200. fileSize: 52428800,
  201. fileTypes: '.pdf,.doc,.docx,.zip,.xls,.xlsx,.rar,.jpg,.jpeg,.gif,.png,.jfif,.txt',
  202. pictureSize: 52428800,
  203. pictureTypes: '.jpg,.jpeg,.gif,.png,.jfif,.txt',
  204. types: '.pdf,.doc,.docx,.zip,.xls,.xlsx,.rar,.jpg,.jpeg,.gif,.png,.jfif,.mp4,.txt',
  205. videoSize: 104857600,
  206. videoType: '.mp4',
  207. },
  208. companyList: [], //产品分类
  209. }
  210. },
  211. watch: {
  212. showColumns: function () {
  213. this.$nextTick(() => this.$refs.table.doLayout())
  214. },
  215. },
  216. created() {
  217. this.getCompanyList()
  218. },
  219. methods: {
  220. async treeHandle(command, node) {
  221. if (command == 'edit') {
  222. this.addCompany(node)
  223. } else if (command == 'del') {
  224. this.$confirm(`确认删除销售区域 ${node.label}?`, '提示', {
  225. confirmButtonText: '确定',
  226. cancelButtonText: '取消',
  227. type: 'warning',
  228. })
  229. .then(async () => {
  230. const [err, res] = await to(partnerApi.deleteCompany({ id: [node.data.id] }))
  231. if (err) return
  232. if (res.code == 200) {
  233. this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
  234. this.getCompanyList()
  235. }
  236. })
  237. .catch(() => {
  238. this.$message({
  239. type: 'info',
  240. message: '已取消删除',
  241. })
  242. })
  243. }
  244. },
  245. async getCompanyList() {
  246. const [err, res] = await to(partnerApi.getCompanyList({}))
  247. if (err) return
  248. if (res.code == 200) {
  249. this.companyList = res.data.list || []
  250. if (res.data.list.length > 0) {
  251. //默认第一选中
  252. this.$nextTick(() => {
  253. this.$refs.tree.setCurrentKey(res.data.list[0].id)
  254. this.queryForm.partnerId = res.data.list[0].id
  255. this.fetchData()
  256. })
  257. }
  258. }
  259. },
  260. async fetchData() {
  261. console.log(1111111)
  262. this.listLoading = true
  263. const [err, res] = await to(partnerApi.getCompanyConcatList(this.queryForm))
  264. this.listLoading = false
  265. console.log(this.listLoading)
  266. if (err) return
  267. if (res.code == 200) {
  268. this.total = res.data.total
  269. this.list = res.data.list || []
  270. }
  271. },
  272. addCompany(node) {
  273. console.log(node)
  274. let defVal = ''
  275. if (node) {
  276. defVal = node.label
  277. }
  278. this.$prompt('请输入公司名称', '提示', {
  279. inputValue: defVal, // 设置默认值
  280. confirmButtonText: '确定',
  281. cancelButtonText: '取消',
  282. inputPattern: /\S+/,
  283. inputErrorMessage: '公司名称不能为空',
  284. })
  285. .then(async ({ value }) => {
  286. if (node) {
  287. const params = {
  288. id: node.data.id,
  289. partnerName: value,
  290. }
  291. const [err, res] = await to(partnerApi.updateCompany(params))
  292. if (err) return
  293. if (res.code == 200) {
  294. this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
  295. this.getCompanyList()
  296. }
  297. } else {
  298. const [err, res] = await to(partnerApi.addCompany({ partnerName: value }))
  299. if (err) return
  300. if (res.code == 200) {
  301. this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
  302. this.getCompanyList()
  303. }
  304. }
  305. // 当用户点击确定按钮时,执行的逻辑
  306. })
  307. .catch(() => {
  308. // 当用户点击取消按钮时,执行的逻辑
  309. console.log('取消输入')
  310. })
  311. },
  312. // 节点单击事件
  313. handleNodeClick(data) {
  314. console.log(data)
  315. this.queryForm.partnerId = data.id
  316. this.fetchData()
  317. },
  318. reset() {
  319. this.queryForm = {
  320. pageNum: 1,
  321. pageSize: 10,
  322. partnerId: null,
  323. name: '',
  324. }
  325. this.fetchData()
  326. },
  327. //详情
  328. handleDetail(row) {
  329. this.$router.push({
  330. name: 'PartnersDetail',
  331. query: {
  332. id: row.id,
  333. },
  334. })
  335. },
  336. handleDelete(row) {
  337. this.$baseConfirm('你确定要删除当前项吗', null, async () => {
  338. const { msg } = await partnerApi.deleteCompanyConcat({ id: [row.id] })
  339. this.$baseMessage(msg, 'success', 'vab-hey-message-success')
  340. await this.fetchData()
  341. })
  342. },
  343. handleSizeChange(val) {
  344. this.queryForm.pageSize = val
  345. this.fetchData()
  346. },
  347. handleCurrentChange(val) {
  348. this.queryForm.pageNum = val
  349. this.fetchData()
  350. },
  351. queryData() {
  352. this.queryForm.pageNum = 1
  353. this.fetchData()
  354. },
  355. downloadTemplate() {
  356. partnerApi
  357. .downloadFile({})
  358. .then((res) => {
  359. if (res.code == 200) {
  360. downloadFileByByte(res.data, '合作伙伴导入模板.xlsx')
  361. }
  362. })
  363. .catch((err) => {
  364. console.error(err)
  365. })
  366. },
  367. // 上传图片
  368. beforeAvatarUpload(file) {
  369. let flag1 = file.size < this.fileSettings.fileSize
  370. if (!flag1) {
  371. this.$message.warning('文件过大,请重新选择!')
  372. return false
  373. }
  374. let flag2 = this.fileSettings.fileTypes.split(',').includes('.' + file.name.split('.').pop())
  375. if (!flag2) {
  376. this.$message.warning('文件类型不符合,请重新选择!')
  377. return false
  378. }
  379. return true
  380. },
  381. // 上传
  382. uploadrequest(option) {
  383. let _this = this
  384. let url = process.env.VUE_APP_UPLOAD_WEED
  385. axios
  386. .post(url)
  387. .then((res) => {
  388. if (res.data && res.data.fid && res.data.fid !== '') {
  389. option.action = `${process.env.VUE_APP_PROTOCOL}${res.data.publicUrl}/${res.data.fid}`
  390. // let file_name = option.file.name
  391. // let index = file_name.lastIndexOf('.')
  392. // let file_extend = ''
  393. // if (index > 0) {
  394. // // 截取名称中的扩展名
  395. // file_extend = file_name.substr(index + 1)
  396. // }
  397. // let uploadform = {
  398. // fileName: file_name, // 资料名称
  399. //
  400. // size: option.file.size.toString(), // 资料大小
  401. // fileType: file_extend, // 资料文件类型
  402. // }
  403. let fileUrl = `${process.env.VUE_APP_PROTOCOL}${res.data.publicUrl}/${res.data.fid}` // 资料存储url
  404. asyncUploadFile(option).then(async () => {
  405. const params = {
  406. excelUrl: fileUrl,
  407. partnerId: this.queryForm.partnerId,
  408. }
  409. const [err, res] = await to(partnerApi.exportFile(params))
  410. if (err) return
  411. if (res.code == 200) {
  412. _this.$message({
  413. type: 'success',
  414. message: '上传成功',
  415. })
  416. this.fetchData()
  417. }
  418. })
  419. } else {
  420. _this.$message({
  421. type: 'warning',
  422. message: '未上传成功!请刷新界面重新上传!',
  423. })
  424. }
  425. })
  426. .catch(function () {
  427. _this.$message({
  428. type: 'warning',
  429. message: '未上传成功!请重新上传!',
  430. })
  431. })
  432. },
  433. },
  434. }
  435. </script>
  436. <style>
  437. .el-form-item--small {
  438. margin: 0 0 10px 0 !important;
  439. }
  440. </style>