足力健前端,vue版本

index.vue 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. <template>
  2. <div class="app-container">
  3. <search-filter
  4. :search-datas.sync="searchDatas"
  5. :selected-id="selectedId"
  6. showadd
  7. @transfer="btn_transfer"
  8. @search="btn_search"
  9. @delorders="btn_deletes"
  10. @export="btn_export"
  11. @merge="btn_file_merge"
  12. @split="btn_file_split"
  13. />
  14. <el-table
  15. v-loading="loading"
  16. :data="dataLists"
  17. border
  18. stripe
  19. @selection-change="changeSelects"
  20. >
  21. <el-table-column type="selection" width="40" fixed/>
  22. <el-table-column
  23. prop="F_Name"
  24. label="客户姓名"
  25. align="center"
  26. width=""
  27. />
  28. <el-table-column
  29. prop="F_Sex"
  30. label="客户性别"
  31. align="center"
  32. width=""
  33. />
  34. <el-table-column
  35. prop="F_Age"
  36. label="客户年龄"
  37. align="center"
  38. width=""
  39. />
  40. <el-table-column label="主号码" align="center" width="100px">
  41. <template slot-scope="scope">
  42. {{ scope.row.F_Phone | phoneFilter }}
  43. <i
  44. class="el-icon-phone phoneIcon"
  45. @click="clickCut(scope.row.F_ID)"
  46. />
  47. </template>
  48. </el-table-column>
  49. <el-table-column label="备用号码" align="center" width="">
  50. <template slot-scope="scope">
  51. {{ scope.row.F_Mobile | mobileFilter }}
  52. <i
  53. class="el-icon-phone phoneIcon"
  54. @click="clickCut2(scope.row.F_ID)"
  55. />
  56. </template>
  57. </el-table-column>
  58. <el-table-column
  59. prop="F_Label"
  60. label="会员标签"
  61. align="center"
  62. width=""
  63. />
  64. <el-table-column label="详细地址" align="center" width="100px">
  65. <template slot-scope="scoped">
  66. <!-- <span v-show="scoped.row.F_Province==null?false:true">{{scoped.row.F_Province}}</span>
  67. <span v-show="scoped.row.F_City==null?false:true">{{scoped.row.F_City}}</span>
  68. <span v-show="scoped.row.F_Area==null?false:true">{{scoped.row.F_Area}}</span>
  69. <span v-show="scoped.row.F_Town==null?false:true">{{scoped.row.F_Town}}</span> -->
  70. <span v-show="scoped.row.F_Address == null ? false : true">{{
  71. scoped.row.F_Address
  72. }}</span>
  73. </template>
  74. </el-table-column>
  75. <el-table-column
  76. prop="F_Address1"
  77. label="备用地址"
  78. align="center"
  79. width=""
  80. />
  81. <el-table-column
  82. prop="F_ShoeSize"
  83. label="鞋码"
  84. align="center"
  85. width=""
  86. />
  87. <el-table-column
  88. prop="Birthday"
  89. label="会员生日"
  90. align="center"
  91. width="100px"
  92. />
  93. <el-table-column
  94. prop="F_Score"
  95. label="会员积分"
  96. align="center"
  97. width=""
  98. />
  99. <el-table-column
  100. prop="F_Recommender"
  101. label="推荐人"
  102. align="center"
  103. width=""
  104. />
  105. <el-table-column
  106. prop="F_Saleperson"
  107. label="销售负责人"
  108. align="center"
  109. width="90px"
  110. />
  111. <el-table-column
  112. prop="F_Money"
  113. label="累计消费金额"
  114. align="center"
  115. width=""
  116. />
  117. <el-table-column
  118. prop="F_Firstcalltime"
  119. label="首次通话记录"
  120. align="center"
  121. width=""
  122. />
  123. <el-table-column
  124. prop="F_Lastholetime"
  125. label="末联通话记录"
  126. align="center"
  127. width=""
  128. />
  129. <el-table-column
  130. prop="F_TotalScore"
  131. label="累计积分"
  132. align="center"
  133. width=""
  134. />
  135. <el-table-column
  136. label="操作"
  137. width="140"
  138. align="center"
  139. class-name="oparate_btn"
  140. fixed="right"
  141. >
  142. <template slot-scope="scope">
  143. <el-button
  144. v-permission="'HY_add_order'"
  145. type="text"
  146. @click="btn_add_order(scope.row.F_ID)"
  147. >添加订单</el-button
  148. >
  149. <el-button
  150. v-permission="'HY_addTodo'"
  151. type="text"
  152. @click="btn_addTodo(scope.row.F_Phone,scope.row.F_Name)"
  153. >添加待办</el-button
  154. >
  155. <el-button
  156. type="text"
  157. @click="btn_detail(scope.row.F_ID.toString())"
  158. >详情</el-button
  159. >
  160. <el-button
  161. type="text"
  162. @click="btn_edit(scope.row.F_ID)"
  163. >编辑</el-button
  164. >
  165. <el-button
  166. type="text"
  167. @click="btn_delete(scope.row.F_ID)"
  168. >删除</el-button
  169. >
  170. </template>
  171. </el-table-column>
  172. </el-table>
  173. <pagination
  174. v-show="pageParams.total > 0"
  175. :total="pageParams.total"
  176. :pageindex.sync="pageParams.pageindex"
  177. :pagesize.sync="pageParams.pagesize"
  178. class="pagination"
  179. @pagination="getList"
  180. />
  181. </div>
  182. </template>
  183. <script>
  184. import { mapGetters } from 'vuex'
  185. import {
  186. getOrderLists,
  187. deleteOrder,
  188. deletesMember,
  189. encryptphone,
  190. split
  191. } from '@/api/memberManagement/memberList'
  192. import searchFilter from './components/searchFilter'
  193. import addOrEdit from './components/addOrEdit'
  194. import addTodo from './components/addTodo'
  195. import detail from './components/detail'
  196. import transfer from './components/transfer'
  197. import addOrder from './components/addOrder'
  198. import { formatterContent } from '@/utils'
  199. import Pagination from '@/components/Pagination' // 对el-pagination 二次封装
  200. import mergeId from './components/mergeId'
  201. export default {
  202. name: 'MemberLabel',
  203. components: {
  204. Pagination,
  205. searchFilter
  206. },
  207. filters: {
  208. phoneFilter(status) {
  209. if (status) {
  210. const mtel = status.substr(0, 3) + '****' + status.substr(7)
  211. return mtel
  212. }
  213. },
  214. mobileFilter(status) {
  215. if (status) {
  216. const arr = status.split(',')
  217. var mtel = ''
  218. for (let i = 0; i < arr.length; i++) {
  219. mtel += arr[i].substr(0, 3) + '****' + arr[i].substr(7) + ','
  220. }
  221. }
  222. return mtel
  223. }
  224. },
  225. data() {
  226. return {
  227. phoneOne: '', // 加密主号码
  228. phoneOne2: '', // 加密备用号码
  229. phoneNumOne: '',
  230. searchDatas: {
  231. VIPCode: '', // 会员卡编号
  232. customerName: '', // 客户姓名
  233. phoneNumber: '', // 手机号码
  234. labelList: '', // 会员标签
  235. province: '', // 省份
  236. city: '', // 市
  237. county: '', // 县区
  238. township: '', // 乡镇
  239. address: '', // 详细地址
  240. birthday: '', // 会员生日
  241. referrer: '', // 推荐人
  242. saleperson: '', // 销售负责人
  243. // contactFrequency: '', //联系频次
  244. provinceCity: [], // 省市下拉绑定的值
  245. provinceCityText: [] // 省市下拉绑定文本值
  246. },
  247. loading: false,
  248. pageParams: {
  249. pageindex: 1, // 当前第几页
  250. pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
  251. total: 0 // 总共多少数据
  252. },
  253. dataLists: [], // 列表数据
  254. multipleSelection: [], // 选中的数据
  255. selectedId: [], // 选中的id
  256. namesData: []
  257. }
  258. },
  259. created() {
  260. this.getList()
  261. document.onkeyup = (e) => {
  262. if (e.keyCode === 13) {
  263. this.getList()
  264. }
  265. }
  266. },
  267. computed: {
  268. ...mapGetters(['token'])
  269. },
  270. methods: {
  271. getList() {
  272. this.loading = true
  273. return new Promise((resolve) => {
  274. const params = {
  275. pageindex: this.pageParams.pageindex, // int 第几页
  276. pagesize: this.pageParams.pagesize, // int 每页几条信息
  277. name: this.searchDatas.customerName.trim(), // 客户姓名
  278. phone: this.searchDatas.phoneNumber.trim(), // 手机号码
  279. label: this.searchDatas.labelList, // 会员标签
  280. province:
  281. this.searchDatas.provinceCityText &&
  282. this.searchDatas.provinceCityText[0], // 省份
  283. city:
  284. this.searchDatas.provinceCityText[1] &&
  285. this.searchDatas.provinceCityText[1], // 市
  286. area:
  287. this.searchDatas.provinceCityText[2] &&
  288. this.searchDatas.provinceCityText[2], // 县区
  289. town:
  290. this.searchDatas.provinceCityText[3] &&
  291. this.searchDatas.provinceCityText[3], // 乡镇
  292. address: this.searchDatas.address.trim(), // 详细地址
  293. birthday: this.searchDatas.memberBirthday, // 会员生日
  294. recommender: this.searchDatas.referrer.trim(), // 推荐人
  295. saleperson: this.searchDatas.saleperson.trim() // 销售负责人
  296. // contact: this.searchDatas.contactFrequency.trim(), //联系频次
  297. }
  298. getOrderLists(params).then((response) => {
  299. this.loading = false
  300. if (response.state.toLowerCase() === 'success') {
  301. this.pageParams.total = response.rows.Totals
  302. this.dataLists = response.rows.Rows
  303. }
  304. })
  305. resolve()
  306. })
  307. },
  308. btn_search(val, data) {
  309. this.searchDatas.provinceCityText = data
  310. this.pageParams.pageindex = 1
  311. this.getList()
  312. },
  313. btn_export(val, data) {
  314. this.searchDatas.provinceCityText = data
  315. window.location.href =
  316. this.$store.getters.serverConfig.BASE_API +
  317. 'api/vipinfo/exportexcel?name=' +
  318. this.searchDatas.customerName +
  319. '&phone=' +
  320. this.searchDatas.phoneNumber + // 手机号码
  321. '&province=' +
  322. (this.searchDatas.provinceCityText.length > 0
  323. ? this.searchDatas.provinceCityText[0]
  324. : '') +
  325. '&city=' +
  326. (this.searchDatas.provinceCityText.length > 1
  327. ? this.searchDatas.provinceCityText[1]
  328. : '') +
  329. '&area=' +
  330. (this.searchDatas.provinceCityText.length > 2
  331. ? this.searchDatas.provinceCityText[2]
  332. : '') +
  333. '&town=' +
  334. (this.searchDatas.provinceCityText.length > 3
  335. ? this.searchDatas.provinceCityText[3]
  336. : '') +
  337. '&label=' +
  338. this.searchDatas.labelList + // 会员类型
  339. '&address=' +
  340. this.searchDatas.address + // 地址
  341. '&recommender=' +
  342. this.searchDatas.referrer + // 推荐人
  343. '&saleperson=' +
  344. this.searchDatas.saleperson + // 销售负责人
  345. // '&token=' + this.token +
  346. '&birthday=' +
  347. this.searchDatas.birthday
  348. },
  349. btn_detail(editId) {
  350. this.$layer.iframe({
  351. content: {
  352. content: detail, // 传递的组件对象
  353. parent: this, // 当前的vue对象
  354. data: { rowid: editId } // props
  355. },
  356. area: ['80%', '90%'],
  357. title: '详情'
  358. })
  359. },
  360. btn_edit(editId) {
  361. this.$layer.iframe({
  362. content: {
  363. content: addOrEdit, // 传递的组件对象
  364. parent: this, // 当前的vue对象
  365. data: { rowid: editId.toString() } // props
  366. },
  367. area: ['80%', '90%'],
  368. title: '编辑会员信息'
  369. })
  370. },
  371. // 添加订单
  372. btn_add_order(id) {
  373. this.$layer.iframe({
  374. content: {
  375. content: addOrder, // 传递的组件对象
  376. parent: this, // 当前的vue对象
  377. data: { rowid: id.toString() } // props
  378. },
  379. area: ['80%', '90%'],
  380. title: '添加订单'
  381. })
  382. },
  383. // 添加待办
  384. btn_addTodo(phone, name) {
  385. this.$layer.iframe({
  386. content: {
  387. content: addTodo, // 传递的组件对象
  388. parent: this, // 当前的vue对象
  389. data: { rowPhone: phone, rowName: name } // props
  390. },
  391. area: ['40%', '70%'],
  392. title: '添加待办信息'
  393. })
  394. },
  395. // 批量删除
  396. btn_deletes() {
  397. if (this.selectedId.length == 0) {
  398. this.$message('请选择一个选项')
  399. return
  400. } else {
  401. this.$confirm('您确定要删除吗?', '提示', {
  402. confirmButtonText: '确定',
  403. cancelButtonText: '取消',
  404. type: 'warning'
  405. })
  406. .then(() => {
  407. deletesMember(this.selectedId).then((response) => {
  408. if (response.state.toLowerCase() === 'success') {
  409. this.getList()
  410. this.$message.success('删除成功!')
  411. }
  412. })
  413. })
  414. .catch(() => {
  415. this.$message.info('已取消删除')
  416. })
  417. }
  418. },
  419. // 档案合并
  420. btn_file_merge() {
  421. if (this.selectedId.length == 1) {
  422. this.$message('请选择两个选项')
  423. return
  424. } else {
  425. this.$layer.iframe({
  426. content: {
  427. content: mergeId, // 传递的组件对象
  428. parent: this, // 当前的vue对象
  429. data: { name: this.namesData, ids: this.selectedId } // props
  430. },
  431. area: ['40%', '70%'],
  432. title: '选择主档案'
  433. })
  434. }
  435. },
  436. // 档案拆分
  437. btn_file_split() {
  438. if (this.selectedId.length == 0) {
  439. this.$message('请选择一个选项')
  440. return
  441. } else {
  442. this.$confirm('您确定要拆分吗?', '提示', {
  443. confirmButtonText: '确定',
  444. cancelButtonText: '取消',
  445. type: 'warning'
  446. })
  447. .then(() => {
  448. const params = {
  449. id: this.selectedId[0]
  450. }
  451. split(params).then((response) => {
  452. if (response.state.toLowerCase() === 'success') {
  453. this.getList()
  454. this.$message.success('拆分成功!')
  455. }
  456. })
  457. })
  458. .catch(() => {
  459. this.$message.info('已取消拆分')
  460. })
  461. }
  462. },
  463. // 转移
  464. btn_transfer() {
  465. if (this.selectedId.length == 0) {
  466. this.$message('请选择一个选项')
  467. return
  468. } else {
  469. this.$layer.iframe({
  470. content: {
  471. content: transfer, // 传递的组件对象
  472. parent: this, // 当前的vue对象
  473. data: { rowid: this.selectedId } // props
  474. },
  475. area: ['40%', '40%'],
  476. title: '转移档案'
  477. })
  478. }
  479. },
  480. btn_delete(editId) {
  481. this.$confirm('您确定要将此会员删除吗?', '提示', {
  482. confirmButtonText: '确定',
  483. cancelButtonText: '取消',
  484. type: 'warning'
  485. })
  486. .then(() => {
  487. deletesMember(editId).then((response) => {
  488. if (response.state.toLowerCase() === 'success') {
  489. this.getList()
  490. this.$message.success('删除成功!')
  491. }
  492. })
  493. })
  494. .catch(() => {
  495. this.$message.info('已取消删除')
  496. })
  497. },
  498. changeSelects(val) {
  499. const ids = []
  500. const names = []
  501. this.multipleSelection = val
  502. for (let i = 0; i < this.multipleSelection.length; i++) {
  503. ids.push(this.multipleSelection[i].F_ID)
  504. names.push(this.multipleSelection[i].F_Name)
  505. }
  506. this.selectedId = ids
  507. this.namesData = names
  508. console.log(this.selectedId, this.namesData)
  509. },
  510. // 主号码加密
  511. clickCut(id) {
  512. const params = {
  513. id: id,
  514. type: 0
  515. }
  516. encryptphone(params)
  517. .then((response) => {
  518. if (response.state.toLowerCase() === 'success') {
  519. this.phoneOne = response.data
  520. this.$copyText(this.phoneOne).then(
  521. (e) => {
  522. this.$message.success(
  523. '号码复制成功成功,请联系管理员进行解密!'
  524. )
  525. },
  526. (e) => {
  527. this.$toast('复制失败')
  528. }
  529. )
  530. }
  531. })
  532. .catch(() => {
  533. this.$message.info('查询失败')
  534. })
  535. },
  536. // 备用号码解密
  537. clickCut2(id) {
  538. const params = {
  539. id: id,
  540. type: 1
  541. }
  542. encryptphone(params)
  543. .then((response) => {
  544. if (response.state.toLowerCase() === 'success') {
  545. this.phoneOne2 = response.data
  546. this.$copyText(this.phoneOne2).then(
  547. (e) => {
  548. this.$message.success('号码复制成功成功!')
  549. },
  550. (e) => {
  551. this.$toast('复制失败')
  552. }
  553. )
  554. }
  555. })
  556. .catch(() => {
  557. this.$message.info('查询失败')
  558. })
  559. }
  560. }
  561. }
  562. </script>
  563. <style rel="stylesheet/scss" lang="scss" scoped>
  564. </style>