index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. <template>
  2. <div class="custom_page">
  3. <div class="content">
  4. <!-- 顶部搜索 -->
  5. <div class="toolbar">
  6. <!-- 顶部搜索 -->
  7. <el-form :inline="true" :model="formParams">
  8. <el-form-item label="客户昵称">
  9. <el-input v-model="formParams.name" maxlength="20" placeholder="请输入客户昵称" />
  10. </el-form-item>
  11. <el-form-item label="手机号">
  12. <el-input v-model="formParams.phone" maxlength="11" placeholder="请输入手机号" />
  13. </el-form-item>
  14. <el-form-item label="标签">
  15. <el-select v-model="formParams.labelId" placeholder="请选择">
  16. <el-option v-for="(item, index) in tipsList" :key="index" :label="item.labelName"
  17. :value="item.buyerLabelId" />
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item label="最近消费时间">
  21. <el-date-picker v-model="formParams.dates" type="daterange" range-separator="至" start-placeholder="开始时间"
  22. end-placeholder="结束时间" value-format="yyyy-MM-dd" />
  23. </el-form-item>
  24. <el-form-item>
  25. <el-form-item label="累计消费金额">
  26. <el-input v-model="formParams.minMoney" maxlength="9" placeholder="请输入最小值" @input="checkMinMoney" />
  27. </el-form-item>
  28. <el-form-item label="-">
  29. <el-input v-model="formParams.maxMoney" maxlength="9" placeholder="请输入最大值" @input="checkMaxMoney" />
  30. </el-form-item>
  31. </el-form-item>
  32. <el-form-item>
  33. <el-form-item label="购买次数">
  34. <el-input v-model="formParams.minBuyers" maxlength="9" oninput="value=value.replace(/[^\d]/g,'')"
  35. placeholder="请输入最小值" />
  36. </el-form-item>
  37. <el-form-item label="-">
  38. <el-input v-model="formParams.maxBuyers" maxlength="9" oninput="value=value.replace(/[^\d]/g,'')"
  39. placeholder="请输入最大值" />
  40. </el-form-item>
  41. </el-form-item>
  42. <el-form-item label-width="0">
  43. <el-button type="primary" plain @click="search">查询</el-button>
  44. <el-button plain @click="clear">重置</el-button>
  45. <el-button type="primary" plain @click="handleExport">导出</el-button>
  46. </el-form-item>
  47. </el-form>
  48. </div>
  49. <!-- 表格 -->
  50. <div class="content_table">
  51. <div class="table">
  52. <el-table :data="tableData" border :header-cell-style="{ background: '#EEF3FF', color: '#333333' }"
  53. style="width: 100%">
  54. <el-table-column prop="name" label="客户昵称" />
  55. <el-table-column prop="phone" label="手机号" />
  56. <el-table-column prop="memberLevelName" label="会员等级" />
  57. <el-table-column prop="total" label="消费总额" />
  58. <el-table-column prop="buyers" label="购买次数" />
  59. <el-table-column prop="credit" label="剩余积分" />
  60. <el-table-column prop="region" label="区域ID" />
  61. <el-table-column label="关系">
  62. <template slot-scope="scope">
  63. <span v-if="scope.row.roleId == null">无关系</span>
  64. <span v-if="scope.row.roleId == 1">加盟商</span>
  65. <span v-if="scope.row.roleId == 2">代理商</span>
  66. </template>
  67. </el-table-column>
  68. <el-table-column prop="time" label="最近消费时间" />
  69. <el-table-column prop="createTime" label="注册时间" />
  70. <el-table-column :formatter="row => row.registerIp ? row.registerIp : '-'" label="注册IP"
  71. show-overflow-tooltip />
  72. <el-table-column :formatter="row => row.lastLoginIp ? row.lastLoginIp : '-'" prop="time" label="最后登录IP"
  73. show-overflow-tooltip />
  74. <el-table-column label="操作" fixed="right">
  75. <template slot-scope="scope">
  76. <el-button type="text" @click.native.prevent="details(scope.row)">详情</el-button>
  77. <el-button type="text" @click.native.prevent="setIntegral(scope.row)">设置积分</el-button>
  78. <el-button type="text" @click.native.prevent="makeTag(scope.row)">打标签</el-button>
  79. <el-button type="text" size="small" @click.native.prevent="addBlackList(scope.row)">
  80. {{ scope.row.ifBlack ? "取消黑名单" : "加入黑名单" }}
  81. </el-button>
  82. <el-button type="text" size="small" @click.native.prevent="appointBtn(scope.row)">指定关系</el-button>
  83. </template>
  84. </el-table-column>
  85. </el-table>
  86. <div class="fenye">
  87. <el-pagination :current-page="currentPage" :page-sizes="[10, 20, 50, 100]" :page-size="10"
  88. layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange"
  89. @current-change="handleCurrentChange" />
  90. </div>
  91. </div>
  92. </div>
  93. </div>
  94. <!-- *************对话框开始************* -->
  95. <!-- 打标签 -->
  96. <el-dialog title="选择标签" :visible.sync="addFormDialog" width="30%" center :close-on-click-modal="false">
  97. <div>
  98. <!-- 表单搜索 -->
  99. <el-form :inline="true" :model="tipsForm" class="demo-form-inline">
  100. <el-form-item label="标签名称">
  101. <el-input v-model="tipsForm.labelName" maxlength="20" placeholder="请输入标签名称" />
  102. </el-form-item>
  103. <el-form-item>
  104. <el-button @click="searchTips">查询</el-button>
  105. </el-form-item>
  106. <el-form-item>
  107. <el-button type="text" @click="runTips">管理标签</el-button>
  108. </el-form-item>
  109. </el-form>
  110. <!-- 多选 -->
  111. <el-checkbox-group v-model="checkList">
  112. <el-checkbox v-for="(item, index) in tipsList" :key="index" class="checkBoxStyle" :label="item.buyerLabelId">
  113. {{
  114. item.labelName }}
  115. </el-checkbox>
  116. </el-checkbox-group>
  117. </div>
  118. <span slot="footer" class="dialog-footer">
  119. <el-button @click="addFormDialog = false">取 消</el-button>
  120. <el-button type="primary" @click="saveTips">确定</el-button>
  121. </span>
  122. </el-dialog>
  123. <el-dialog title="修改会员积分" :visible.sync="editIntegral" width="30%" center :close-on-click-modal="false"
  124. @close="credit = 0">
  125. <el-form label-width="100px">
  126. <el-form-item label="修改积分">
  127. <el-radio-group v-model="updateWay" @change="changeWayRadio">
  128. <el-radio :label="true">增加</el-radio>
  129. <el-radio :label="false">减少</el-radio>
  130. </el-radio-group>
  131. </el-form-item>
  132. <el-form-item label="积分">
  133. <el-input-number v-if="updateWay" v-model="credit" :min="0" :max="9999999" />
  134. <el-input-number v-if="!updateWay" v-model="credit" :max="0" />
  135. </el-form-item>
  136. <el-form-item style="margin-top:-18px;color:#999999">
  137. <span>提示 : 在原有积分上增加或减少</span>
  138. </el-form-item>
  139. </el-form>
  140. <span slot="footer" class="dialog-footer">
  141. <el-button @click="editIntegral = false">取 消</el-button>
  142. <el-button type="primary" @click="saveIntegral">确定</el-button>
  143. </span>
  144. </el-dialog>
  145. <!-- 指定关系 -->
  146. <el-dialog title="选择关系" :visible.sync="appointDialog" width="25%" center :close-on-click-modal="false"
  147. @close="appintClose">
  148. <span slot="footer" class="dialog-footer">
  149. <el-form label-width="120px">
  150. <el-form-item label="请选择区域:">
  151. <el-cascader :props="areaData" ref="cascaderRef" @change="handleCascaderChange"></el-cascader>
  152. </el-form-item>
  153. <el-form-item label="是否为加盟商:">
  154. <template>
  155. <el-radio v-model="appintForm.isType" label="1">加盟商</el-radio>
  156. <el-radio v-model="appintForm.isType" label="2">代理商</el-radio>
  157. <el-radio v-model="appintForm.isType" label="3">撤销状态</el-radio>
  158. </template>
  159. </el-form-item>
  160. </el-form>
  161. <el-button @click="appintCan">取消</el-button>
  162. <el-button type="primary" @click="appintDetermine">确定</el-button>
  163. </span>
  164. </el-dialog>
  165. <member-details ref="memberDetails" @reset="reset" />
  166. </div>
  167. </template>
  168. <script>
  169. import {
  170. customerMageGetAll,
  171. getLabels,
  172. customerSaveUserLabel,
  173. customerBlacklist,
  174. updateBuyerCredit,
  175. exportBuyerUser,
  176. appointRelationship
  177. } from '@/api/customerMage'
  178. import { getProvinceList, getChildAreaList } from '@/api/address'
  179. // import { getSelect } from '../../../api/renovation'
  180. import memberDetails from './details'
  181. // import { constants } from 'fs';
  182. export default {
  183. components: { memberDetails },
  184. data() {
  185. return {
  186. showMore: false,
  187. formParams: {
  188. name: '', // 用户昵称
  189. phone: '', // 手机号
  190. labelId: '', // 标签id
  191. dates: [], // 最近消费时间日期数组
  192. minMoney: '', // 累计消费金额最小值
  193. maxMoney: '', // 累计消费金额最大值
  194. minBuyers: '', // 购买次数最小值
  195. maxBuyers: '', // 购买次数最大值
  196. startTime: '', // 申请开始时间
  197. endTime: '', // 申请结束时间
  198. page: 1,
  199. pageSize: 10
  200. },
  201. tipsForm: {
  202. labelName: ''
  203. },
  204. date: [],
  205. total: 1,
  206. tableData: [],
  207. currentPage: 1,
  208. dialog: {},
  209. tipsList: [],
  210. checkList: [],
  211. addFormDialog: false,
  212. editIntegral: false,
  213. buyerUserId: '', // 用户id
  214. credit: '', // 积分值 扣减积分则传负数
  215. updateWay: true, // 修改积分单选绑定
  216. appointDialog: false, // 指定关系的弹出框
  217. areaData: {
  218. lazy: true,
  219. label: 'name',
  220. value: 'id',
  221. lazyLoad(node, resolve) {
  222. const { level, value } = node;
  223. if (level === 0) {
  224. getProvinceList().then(res => {
  225. resolve(res.data)
  226. })
  227. } else if (level != 0) {
  228. getChildAreaList(value).then(res => {
  229. resolve(res.data.map(item => {
  230. item.leaf = level === 3
  231. return item
  232. }))
  233. })
  234. }
  235. }
  236. },
  237. appintForm: {
  238. buyerUserId: null,
  239. region: null,
  240. isType: '1'
  241. }
  242. }
  243. },
  244. created() {
  245. this.getAll(this.formParams)
  246. this.getSelect({ labelName: '' })
  247. },
  248. methods: {
  249. /**
  250. * 导出
  251. */
  252. async handleExport() {
  253. this.$message({
  254. message: '数据导出中,请勿重复操作!',
  255. type: 'success'
  256. })
  257. console.log(this.formParams, 'this.formParams')
  258. const res = await exportBuyerUser(this.formParams)
  259. if (!res) {
  260. return
  261. }
  262. const blob = new Blob([res], { type: 'application/vnd.ms-excel' })
  263. const fileName = '用户列表.xls'
  264. if ('download' in document.createElement('a')) {
  265. // 非IE下载
  266. const elink = document.createElement('a')
  267. elink.download = fileName
  268. elink.href = URL.createObjectURL(blob)
  269. elink.style.display = 'none'
  270. document.body.appendChild(elink)
  271. elink.click()
  272. URL.revokeObjectURL(elink.href) // 释放URL 对象
  273. document.body.removeChild(elink)
  274. } else {
  275. // IE10+下载
  276. navigator.msSaveBlob(blob, fileName)
  277. }
  278. },
  279. handleSizeChange(val) {
  280. this.formParams.pageSize = val
  281. this.getAll(this.formParams)
  282. },
  283. handleCurrentChange(val) {
  284. this.formParams.page = val
  285. this.getAll(this.formParams)
  286. },
  287. // 查询
  288. search() {
  289. this.total = 1
  290. this.formParams.page = 1
  291. this.getAll(this.formParams)
  292. },
  293. // 查询标签
  294. searchTips() {
  295. console.log(this.tipsForm)
  296. this.getSelect({ labelName: this.tipsForm.labelName })
  297. },
  298. changeWayRadio(val) {
  299. this.updateWay = val
  300. },
  301. // 设置积分(更新积分)
  302. setIntegral(row) {
  303. this.editIntegral = true
  304. this.buyerUserId = row.buyerUserId
  305. },
  306. async saveIntegral() {
  307. if (this.credit === '' || this.credit === undefined) {
  308. return this.$message('积分不能为空!')
  309. } else if (this.credit === 0) {
  310. this.editIntegral = false
  311. } else {
  312. const res = await updateBuyerCredit({
  313. buyerUserId: this.buyerUserId,
  314. credit: this.credit
  315. })
  316. if (res.code === '') {
  317. this.getAll(this.formParams)
  318. this.editIntegral = false
  319. this.$message.success('修改积分成功')
  320. }
  321. }
  322. },
  323. // 打标签
  324. async saveTips(row) {
  325. console.log(this.checkList)
  326. const res = await customerSaveUserLabel({
  327. buyerUserId: this.buyerUserId,
  328. buyerLabelIds: this.checkList
  329. })
  330. if (res.code === '') {
  331. this.$message({
  332. message: '成功',
  333. type: 'success'
  334. })
  335. this.checkList = []
  336. this.tipsForm.labelName = ''
  337. this.addFormDialog = false
  338. }
  339. },
  340. // 指定关系
  341. appointBtn(row) {
  342. this.appintForm.buyerUserId = row.buyerUserId
  343. this.appointDialog = true
  344. },
  345. // 获取省数据
  346. handleCascaderChange() {
  347. const checkedNode = this.$refs.cascaderRef.getCheckedNodes()
  348. const nodeData = checkedNode[0].data
  349. this.appintForm.region = nodeData.id
  350. },
  351. // 指定关系取消
  352. appintCan() {
  353. this.appointDialog = false
  354. },
  355. // 指定关系确认
  356. async appintDetermine() {
  357. if (this.appintForm.region == null && this.appintForm.isType != '3') {
  358. this.$message.error("请选择区域");
  359. return
  360. }
  361. let res = await appointRelationship(this.appintForm);
  362. if (res.code == "") {
  363. this.$message.success("指定关系成功")
  364. this.appointDialog = false
  365. }
  366. // 重新获取数据
  367. this.getAll(this.formParams)
  368. },
  369. // 弹窗关闭 把数据重置
  370. appintClose() {
  371. this.appintForm = {
  372. buyerUserId: null,
  373. region: null,
  374. isType: '1'
  375. }
  376. this.$refs.cascaderRef.inputValue = ""
  377. console.log(this.$refs.cascaderRef);
  378. },
  379. // 加入黑名单
  380. addBlackList(row) {
  381. // "ifBlack": "是否加入黑名单 1-是 0-否"
  382. console.log(row.ifBlack)
  383. this.$confirm(
  384. `${row.ifBlack
  385. ? '确认是否取消黑名单'
  386. : '加入黑名单后,对方将无法登录商城'
  387. }`,
  388. `${row.ifBlack ? '取消黑名单' : '加入黑名单'}`,
  389. {
  390. confirmButtonText: '确定',
  391. cancelButtonText: '取消',
  392. type: 'warning'
  393. }
  394. )
  395. .then(() => {
  396. if (!row.ifBlack) {
  397. customerBlacklist({
  398. buyerUserId: row.buyerUserId,
  399. ifBlack: 1
  400. }).then((res) => {
  401. if (res.code === '') {
  402. this.$message({
  403. type: 'success',
  404. message: '成功!'
  405. })
  406. this.getAll(this.formParams)
  407. }
  408. })
  409. } else {
  410. customerBlacklist({
  411. buyerUserId: row.buyerUserId,
  412. ifBlack: 0
  413. }).then((res) => {
  414. if (res.code === '') {
  415. this.$message({
  416. type: 'success',
  417. message: '成功!'
  418. })
  419. this.getAll(this.formParams)
  420. }
  421. })
  422. }
  423. })
  424. .catch(() => {
  425. this.$message({
  426. type: 'info',
  427. message: '已取消'
  428. })
  429. })
  430. },
  431. // 跳转标签页面
  432. runTips() {
  433. this.$router.push({
  434. path: '/member/tips'
  435. })
  436. },
  437. // 清除
  438. clear() {
  439. this.formParams = {
  440. name: '', // 用户昵称
  441. phone: '', // 手机号
  442. labelId: '', // 标签id
  443. dates: [], // 最近消费时间日期数组
  444. minMoney: '', // 累计消费金额最小值
  445. maxMoney: '', // 累计消费金额最大值
  446. minBuyers: '', // 购买次数最小值
  447. maxBuyers: '', // 购买次数最大值
  448. page: 1,
  449. pageSize: 10
  450. }
  451. this.getAll(this.formParams)
  452. },
  453. // 打标签
  454. makeTag(row) {
  455. this.checkList = row.labelIds
  456. this.tipsForm.labelName = ''
  457. this.addFormDialog = true
  458. this.buyerUserId = row.buyerUserId
  459. },
  460. details(row) {
  461. // this.$router.push({
  462. // name: 'customerDetails',
  463. // params: { buyerUserId: row.buyerUserId, orderFormid: row.orderFormid }
  464. // })
  465. this.$refs.memberDetails.checkList = row.labelIds
  466. console.log(this.$refs.memberDetails);
  467. this.$refs.memberDetails.getUser({ buyerUserId: row.buyerUserId, orderFormid: row.orderFormid })
  468. },
  469. // 初始化查询所有数据
  470. async getAll(formParams) {
  471. const res = await customerMageGetAll(formParams)
  472. this.tableData = res.data.list
  473. this.total = res.data.total
  474. },
  475. // 初始化查询所有标签
  476. async getSelect(name) {
  477. const res = await getLabels(name)
  478. this.tipsList = res.data
  479. },
  480. reset() {
  481. this.getAll(this.formParams)
  482. },
  483. checkMinMoney(e) {
  484. this.formParams.minMoney = e.match(/^\d*(\.?\d{0,2})/g)[0] || null
  485. },
  486. checkMaxMoney(e) {
  487. this.formParams.maxMoney = e.match(/^\d*(\.?\d{0,2})/g)[0] || null
  488. }
  489. }
  490. }
  491. </script>
  492. <style lang='scss' scoped>
  493. @import url("../../../styles/elDialog.scss");
  494. .custom_page {
  495. padding: 20px;
  496. }
  497. .checkBoxStyle {
  498. margin-bottom: 20px;
  499. }
  500. </style>