index.vue 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. <template>
  2. <div class="subPage">
  3. <div class="system-table-search">
  4. <div class="flex-h">
  5. <div class="flex-item flex-h">
  6. <el-button size="mini" type="success" @click="addCard">新增课程体验卡</el-button>
  7. </div>
  8. <ul>
  9. <li>
  10. <!-- <span>选择案场:</span> -->
  11. <el-select v-model="CaseId" placeholder="请选择案场">
  12. <el-option
  13. v-for="item in cases"
  14. :key="item.CaseId"
  15. :label="item.CaseName"
  16. :value="item.CaseId">
  17. </el-option>
  18. </el-select>
  19. </li>
  20. </ul>
  21. <el-button
  22. size="mini"
  23. type="primary" @click="search">搜索</el-button>
  24. </div>
  25. <div class="moreFilter"></div>
  26. </div>
  27. <div class="system-table-box">
  28. <el-table
  29. :data="cardList.list"
  30. stripe
  31. style="width: 100%">
  32. <el-table-column
  33. prop="CardName"
  34. label="卡名称">
  35. </el-table-column>
  36. <!-- <el-table-column
  37. prop="xxx"
  38. label="卡类型">
  39. </el-table-column> -->
  40. <el-table-column
  41. prop="Price"
  42. label="卡价格">
  43. </el-table-column>
  44. <el-table-column
  45. prop="StartDate"
  46. label="有效期"
  47. width="150">
  48. <template slot-scope="scope">
  49. <span style="width:100%;display:block;text-align:center;white-space: nowrap;">{{toolClass.dateFormat(scope.row.StartDate, 'yyyy-MM-dd')}}</span>
  50. <span style="width:100%;display:block;text-align:center;white-space: nowrap;"></span>
  51. <span style="width:100%;display:block;text-align:center;white-space: nowrap;">{{toolClass.dateFormat(scope.row.EndDate, 'yyyy-MM-dd')}}</span>
  52. </template>
  53. </el-table-column>
  54. <el-table-column
  55. prop="SendType"
  56. label="发放类型">
  57. <template slot-scope="scope">
  58. <span>{{SendType(scope.row.SendType)}}</span>
  59. </template>
  60. </el-table-column>
  61. <el-table-column
  62. prop="TotalCount"
  63. label="总数量">
  64. </el-table-column>
  65. <!-- <el-table-column
  66. prop="SentCount"
  67. label="已发">
  68. </el-table-column>
  69. <el-table-column
  70. prop="UsedCount"
  71. label="实际使用">
  72. </el-table-column> -->
  73. <el-table-column
  74. prop="Status"
  75. label="状态">
  76. <template slot-scope="scope">
  77. {{scope.row.Status == 1 ? '正常' : '已过期'}}
  78. </template>
  79. </el-table-column>
  80. <el-table-column label="操作" fixed='right' width="350">
  81. <template slot-scope="scope">
  82. <el-button
  83. size="mini"
  84. type="warning"
  85. @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
  86. <el-button
  87. size="mini"
  88. type="danger"
  89. @click="sendCard(scope.$index, scope.row)">赠送客户</el-button>
  90. <el-button
  91. size="mini"
  92. type="success"
  93. v-if="scope.row.SendType === 'channel'"
  94. v-clipboard:copy="clientUrl + '/user.html#/receiveChannelShared/' + scope.row.CardId + '/card/receive'"
  95. v-clipboard:success="onCopy"
  96. v-clipboard:error="onError"
  97. >点击复制链接</el-button>
  98. </template>
  99. </el-table-column>
  100. </el-table>
  101. </div>
  102. <el-pagination
  103. @current-change="handleCurrentChange"
  104. :current-page.sync="postData.page"
  105. :page-size="postData.pagesize"
  106. layout="prev, pager, next, jumper"
  107. :total="total">
  108. </el-pagination>
  109. <el-dialog
  110. title="选择赠送客户"
  111. :visible.sync="centerDialogVisible"
  112. width="800px"
  113. center>
  114. <div>
  115. <ul class="dialogSearchList flex-h" style="margin-bottom:10px;">
  116. <li class="flex-item">
  117. <el-input
  118. placeholder="请输入用户名"
  119. v-model="dialogPostData.username"
  120. clearable>
  121. </el-input>
  122. </li>
  123. <li class="flex-item">
  124. <el-input
  125. placeholder="请输入手机号"
  126. v-model="dialogPostData.phone"
  127. clearable>
  128. </el-input>
  129. </li>
  130. <li class="flex-item">
  131. <el-input
  132. placeholder="请输入推荐人"
  133. v-model="dialogPostData.recommendname"
  134. clearable>
  135. </el-input>
  136. </li>
  137. <li>
  138. <el-button type="primary" @click="dialogSearch">搜索</el-button>
  139. </li>
  140. </ul>
  141. <ul class="dialogSearchList flex-h">
  142. <li class="flex-item">
  143. <el-date-picker
  144. v-model="dialogPostData.begindate"
  145. type="date"
  146. placeholder="选择起始日期">
  147. </el-date-picker>
  148. <el-date-picker
  149. v-model="dialogPostData.enddate"
  150. type="date"
  151. placeholder="选择截止日期">
  152. </el-date-picker>
  153. </li>
  154. </ul>
  155. </div>
  156. <div>
  157. <el-table
  158. ref="multipleTable"
  159. :data="customers.list"
  160. tooltip-effect="dark"
  161. style="width: 100%"
  162. @selection-change="handleSelectionChange">
  163. <el-table-column
  164. type="selection">
  165. </el-table-column>
  166. <el-table-column
  167. prop="Name"
  168. label="姓名">
  169. </el-table-column>
  170. <el-table-column
  171. prop="CustomerName"
  172. label="微信昵称">
  173. </el-table-column>
  174. <el-table-column
  175. prop="Phone"
  176. label="手机号">
  177. </el-table-column>
  178. <el-table-column
  179. prop="CreatDate"
  180. label="创建时间">
  181. <template slot-scope="scope">
  182. <span>{{toolClass.dateFormat(scope.row.CreateDate, 'yyyy-MM-dd')}}</span>
  183. </template>
  184. </el-table-column>
  185. <el-table-column
  186. prop="RecommendName"
  187. label="推荐人">
  188. </el-table-column>
  189. </el-table>
  190. </div>
  191. <div>
  192. <el-pagination
  193. @current-change="handleCurrentChangeDialog"
  194. :current-page.sync="dialogPostData.page"
  195. :page-size="dialogPostData.pagesize"
  196. layout="prev, pager, next, jumper"
  197. :total="dialogTotal">
  198. </el-pagination>
  199. </div>
  200. <span slot="footer" class="dialog-footer">
  201. <el-button @click="closeDialog">取 消</el-button>
  202. <el-button type="primary" @click="toSendCard">确 定</el-button>
  203. </span>
  204. </el-dialog>
  205. <el-dialog
  206. title="手动复制"
  207. :visible.sync="copyDialogVisible"
  208. width="300px"
  209. center>
  210. <div>
  211. <el-input
  212. placeholder="请输入内容"
  213. v-model="currentCopyUrl"
  214. clearable>
  215. </el-input>
  216. <!-- <a :data-clipboard-text="currentCopyUrl" ref="copy" @click="toCopy">复制链接</a> -->
  217. </div>
  218. <span slot="footer" class="dialog-footer">
  219. <el-button type="primary" @click="copyDialogVisible = false">确 定</el-button>
  220. </span>
  221. </el-dialog>
  222. </div>
  223. </template>
  224. <script>
  225. import Clipboard from 'clipboard'
  226. import { mapState, createNamespacedHelpers } from 'vuex'
  227. const { mapState: mapCardState, mapActions: mapCardActions } = createNamespacedHelpers('card')
  228. const { mapState: mapCustomerState, mapActions: mapCustomerActions } = createNamespacedHelpers('customer')
  229. export default {
  230. name: '',
  231. data () {
  232. return {
  233. currentCopyUrl: '',
  234. copyDialogVisible: false,
  235. selectCustomer: [],
  236. dialogTotal: 0,
  237. dialogPostData: {
  238. username: '',
  239. phone: '',
  240. recommendname: '',
  241. begindate: '',
  242. enddate: '',
  243. page: 1, // 当前页码
  244. pagesize: 10, // 请求数据量
  245. },
  246. customerList: [],
  247. centerDialogVisible: false,
  248. total: 0,
  249. postData: { // 表格搜索条件
  250. caseid: '', // 案场id
  251. page: 1, // 当前页码
  252. pagesize: 10, // 请求数据量
  253. },
  254. }
  255. },
  256. mounted () {
  257. this.$nextTick(function () {
  258. this.getList()
  259. })
  260. },
  261. computed: {
  262. ...mapCardState({
  263. cardList: x => x.cardList,
  264. }),
  265. ...mapState({
  266. clientUrl: x => x.app.clientUrl,
  267. cases: x => x.app.cases.list,
  268. defaultCaseId: x => x.app.cases.default
  269. }),
  270. ...mapCustomerState({
  271. customers: x => x.customers,
  272. }),
  273. CaseId: {
  274. get () {
  275. return this.postData.caseid || this.defaultCaseId
  276. },
  277. set (val) {
  278. this.postData.caseid = val
  279. }
  280. }
  281. },
  282. methods: {
  283. ...mapCardActions([
  284. 'GetCardList',
  285. 'giveCard',
  286. ]),
  287. ...mapCustomerActions([
  288. 'GetCustomerList',
  289. 'SetCustomerListNull',
  290. ]),
  291. SendType (type) {
  292. if (type === 'channel') {
  293. return '渠道'
  294. }
  295. if (type === 'case') {
  296. return '案场'
  297. }
  298. if (type === 'system') {
  299. return '系统'
  300. }
  301. },
  302. toSendHistory () { // 查看赠送记录
  303. this.$router.push({ name: 'givingRecords' })
  304. },
  305. dialogSearch () { // 赠送客户搜索
  306. this.GetCustomerList(this.dialogPostData)
  307. },
  308. handleCurrentChangeDialog (val) {
  309. this.dialogPostData.page = val
  310. this.GetCustomerList(this.dialogPostData)
  311. },
  312. handleSelectionChange (val) {
  313. // console.log(val)
  314. this.selectCustomer = val
  315. },
  316. toSendCard () { // 赠送卡
  317. if (this.selectCustomer.length) {
  318. this.selectCustomer = this.selectCustomer.map(x => x.CustomerId).join(',')
  319. this.giveCard({
  320. id: this.currentCardId,
  321. users: this.selectCustomer,
  322. }).then(res => {
  323. this.$message({
  324. type: 'success',
  325. message: '赠送成功!'
  326. })
  327. this.centerDialogVisible = false
  328. this.selectCustomer = []
  329. if (this.customers.list.length) {
  330. this.customers.list = []
  331. }
  332. this.getList()
  333. })
  334. } else {
  335. this.$message({
  336. type: 'error',
  337. message: '请先选择需要赠送的客户!'
  338. })
  339. }
  340. },
  341. closeDialog () { // 关闭弹窗
  342. this.centerDialogVisible = false
  343. if (this.customers.list.length) {
  344. this.customers.list = []
  345. }
  346. },
  347. sendCard (index, row) { // 赠送卡弹窗
  348. this.currentCardId = row.CardId
  349. this.centerDialogVisible = true
  350. },
  351. search () { // 搜索
  352. this.postData.page = 1
  353. this.currentList = []
  354. this.getList()
  355. },
  356. getList () { // 获取列表
  357. this.GetCardList({
  358. ...this.postData,
  359. caseid: this.CaseId || this.defaultCaseId
  360. }).then((res) => {
  361. this.total = res.pagenum
  362. // console.log(JSON.stringify(res))
  363. })
  364. },
  365. handleCurrentChange (val) { // 跳转到分页
  366. this.getList()
  367. },
  368. handleEdit (index, row) { // 编辑
  369. this.$router.push({ name: 'editCard', query: { id: row.CardId } })
  370. },
  371. // handleCopy (url) { // 复制弹窗
  372. // this.currentCopyUrl = url
  373. // this.copyDialogVisible = true
  374. // },
  375. toCopy (index, row) { // 复制
  376. console.log(1)
  377. var clipboard = new Clipboard(this.$refs['copy' + index])
  378. clipboard.on('success', e => {
  379. console.log('复制成功')
  380. clipboard.destroy()
  381. })
  382. clipboard.on('error', e => {
  383. console.log('该浏览器不支持自动复制')
  384. clipboard.destroy()
  385. })
  386. },
  387. addCard () {
  388. this.$router.push({ name: 'editCard', query: {} })
  389. },
  390. onCopy () {
  391. this.$message({
  392. type: 'success',
  393. message: '复制成功!'
  394. })
  395. },
  396. onError () {
  397. this.$message({
  398. type: 'error',
  399. message: '复制失败!'
  400. })
  401. },
  402. }
  403. }
  404. </script>
  405. <!-- Add "scoped" attribute to limit CSS to this component only -->
  406. <style lang="scss" scoped>
  407. @import "page.scss";
  408. .dialogSearchList {
  409. align-items: center;
  410. > li {
  411. font-size: 0;
  412. margin-left: 10px;
  413. &:first-child {
  414. margin-left: 0;
  415. }
  416. > *:nth-child(2) {
  417. margin-left: 10px;
  418. }
  419. }
  420. }
  421. .copyBtn{
  422. line-height: 29px;
  423. border-radius: 3px;
  424. color: #fff;
  425. background: #67c23a;
  426. display: inline-block;
  427. padding: 0 15px;
  428. margin-left: 10px;
  429. }
  430. </style>