index.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. <?php
  2. /**
  3. * @link:http://www.goodmall.com/
  4. * @copyright: Copyright (c) 2020
  5. * 文件描述
  6. * Author: xuyaoxiang
  7. * Date: 2021/1/29
  8. * Time: 18:29
  9. */
  10. ?>
  11. <div id="app" v-cloak>
  12. <el-card shadow="never" style="border:0;min-width: 1200px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  13. <div slot="header" style="display: flex;justify-content: space-between;align-items: center;">
  14. <div>个人PK 活动列表</div>
  15. <el-button style="display: none;" type="primary"
  16. @click="test"
  17. size="small">测试推荐活动
  18. </el-button>
  19. <el-button type="primary" size="small" @click="$navigate({r: 'pk/personal/personal-add'})">+新增个人PK</el-button>
  20. </div>
  21. <div class="table-body">
  22. <div class="head" style="display: flex;margin-bottom: 30px;">
  23. <div style="display: flex;width: 220px;margin-right: 20px;align-items: center;">
  24. <div style="flex-shrink: 0;align-items: center;">活动名称:</div>
  25. <el-input clearable size="small" type="text" v-model="search.name" @keyup.enter.native="toSearch" placeholder="请输入活动名称"></el-input>
  26. </div>
  27. <div style="display: flex;margin-right: 20px;align-items: center;">
  28. <div style="flex-shrink: 0;align-items: center;">活动时间:</div>
  29. <el-date-picker
  30. size="small"
  31. v-model="time"
  32. @change="datetimeChange"
  33. :picker-options="pickerOptions"
  34. type="daterange"
  35. range-separator="至"
  36. start-placeholder="开始日期"
  37. end-placeholder="结束日期"
  38. value-format="yyyy-MM-dd"
  39. align="center">
  40. </el-date-picker>
  41. </div>
  42. <div style="display: flex;width: 220px;margin-right: 20px;align-items: center;">
  43. <div style="flex-shrink: 0;align-items: center;">活动状态:</div>
  44. <el-select size="small" v-model="search.status" @change='toSearch' class="select" placeholder="请选择活动状态">
  45. <el-option :key="index" :label="item.name" :value="item.value" v-for="(item, index) in statusList"></el-option>
  46. </el-select>
  47. </div>
  48. <div style="display: flex;width: 220px;margin-right: 20px;align-items: center;">
  49. <div style="flex-shrink: 0;align-items: center;">PK类型:</div>
  50. <el-select size="small" v-model="search.performance_type" @change='toSearch' class="select" placeholder="请选择PK类型">
  51. <el-option :key="index" :label="item.name" :value="item.value" v-for="(item, index) in PKlist"></el-option>
  52. </el-select>
  53. </div>
  54. <el-button type="primary" icon="el-icon-search" style="padding: 0 10px !important;" @click='toSearch'>搜索</el-button>
  55. <el-button type="danger" style="padding: 0 10px !important;" @click='resetFun'>重置</el-button>
  56. </div>
  57. <el-table
  58. class="table1"
  59. v-loading="loading"
  60. :data="list"
  61. size="small"
  62. :row-class-name="tableRowClassName"
  63. style="width: 100%">
  64. <el-table-column
  65. type="index"
  66. label="序号"
  67. align="center"
  68. min-width="60">
  69. </el-table-column>
  70. <el-table-column
  71. prop="name"
  72. label="活动名称"
  73. align="center"
  74. min-width="100">
  75. </el-table-column>
  76. <el-table-column
  77. label="PK类型"
  78. align="center"
  79. min-width="80">
  80. <template slot-scope="scope">
  81. <div v-if="scope.row.performance_type == 1">拉新</div>
  82. <div v-if="scope.row.performance_type == 2">业绩</div>
  83. </template>
  84. </el-table-column>
  85. <el-table-column
  86. prop="people_max_amount"
  87. title="设定人数"
  88. label="人数"
  89. align="center"
  90. min-width="100">
  91. <template slot-scope="scope">
  92. <div v-if="scope.row.people_max_amount == -1">无限制</div>
  93. <div v-else>{{scope.row.people_max_amount}}</div>
  94. </template>
  95. </el-table-column>
  96. <el-table-column
  97. prop="people_amount"
  98. label="参加人员数"
  99. align="center"
  100. min-width="100">
  101. </el-table-column>
  102. <el-table-column
  103. prop="performance"
  104. label="业绩"
  105. align="center"
  106. min-width="100">
  107. <template slot-scope="scope">
  108. {{scope.row.performance_type == 1? scope.row.new_num+'人':scope.row.order_amount+'元'}}
  109. </template>
  110. </el-table-column>
  111. <el-table-column
  112. prop="price"
  113. title="报名费用"
  114. label="费用"
  115. align="center"
  116. min-width="80">
  117. <template slot-scope="scope">
  118. ¥{{scope.row.price}}
  119. </template>
  120. </el-table-column>
  121. <el-table-column
  122. prop="price"
  123. label="活动状态"
  124. align="center"
  125. min-width="80">
  126. <template slot-scope="scope"><!-- 状态;0未开始;1进行中;2已结束;3已取消; -->
  127. <el-tag type="info" effect="dark" v-if="scope.row.open_status == 0">未开始</el-tag>
  128. <el-tag type="success" effect="dark" v-if="scope.row.open_status == 1">进行中</el-tag>
  129. <el-tag type="warning" effect="dark" v-if="scope.row.open_status == 2">已结束</el-tag>
  130. </template>
  131. </el-table-column>
  132. <el-table-column
  133. label="活动时间"
  134. align="center"
  135. min-width="200">
  136. <template slot-scope="scope">
  137. <div>{{scope.row.begin_time }}</div>
  138. <div>{{scope.row.end_time}}</div>
  139. </template>
  140. </el-table-column>
  141. <el-table-column
  142. label="奖品"
  143. align="center"
  144. min-width="80">
  145. <template slot-scope="scope">
  146. <div v-if="scope.row.prize && scope.row.prize.length" @click="seeprize(scope.row.prize);" style="text-align: left; cursor: pointer">
  147. 查看奖品
  148. </div>
  149. <el-tag type="info" v-if="!scope.row.prize || !scope.row.prize.length ">暂无数据</el-tag>
  150. </template>
  151. </el-table-column>
  152. <el-table-column
  153. label="是否开启"
  154. align="center"
  155. min-width="80">
  156. <template slot-scope="scope">
  157. <el-switch disabled v-if="scope.row.status==3"
  158. @change="((val)=>{switchFun(val,scope.row.id)})"
  159. v-model="scope.row.is_enable"
  160. :active-value="1"
  161. :inactive-value="0"
  162. >
  163. </el-switch>
  164. <el-switch v-else
  165. @change="((val)=>{switchFun(val,scope.row.id)})"
  166. v-model="scope.row.is_enable"
  167. :active-value="1"
  168. :inactive-value="0"
  169. >
  170. </el-switch>
  171. </template>
  172. </el-table-column>
  173. <el-table-column
  174. label="操作"
  175. align="center"
  176. min-width="220">
  177. <template slot-scope="scope">
  178. <div style="display: flex;align-items: center;justify-content: center;">
  179. <template v-if="scope.row.status==3">
  180. <el-button disabled type="text" size="mini" @click.native="edit(scope.row.id)">
  181. 编辑
  182. </el-button>
  183. </template>
  184. <template v-else>
  185. <el-button type="text" size="mini" @click.native="edit(scope.row.id)">
  186. 编辑
  187. </el-button>
  188. </template>
  189. <el-button size="mini" type="text" @click="delFun(scope.row, scope.$index)">
  190. 删除
  191. </el-button>
  192. <!-- <el-button style="margin: 4px;" type="primary" size="mini">战队申请</el-button> -->
  193. <el-button style="margin: 4px;" type="primary" size="mini" @click="goTo(scope.row)">人员列表</el-button>
  194. </div>
  195. </template>
  196. </el-table-column>
  197. </el-table>
  198. <div flex="box:last cross:center" style="margin-top: 15px;"><!-- v-if="list.length > 0" -->
  199. <div></div>
  200. <div>
  201. <el-pagination
  202. style="display: inline-block;float: right;"
  203. background
  204. @current-change="pageChange"
  205. layout="prev, pager, next"
  206. :page-count="pageCount"
  207. >
  208. </el-pagination>
  209. </div>
  210. </div>
  211. </div>
  212. </el-card>
  213. <!-- 弹框提示开始-->
  214. <el-dialog title="活动奖品" width="30%" :visible.sync="dialogAddgsVisible"
  215. @close="dialogAddgsVisible = false" :modal-append-to-body="false">
  216. <div style="text-align: left;">
  217. <el-table
  218. size="mini"
  219. :data="prize"
  220. border
  221. max-height="250"
  222. style="width: 100%">
  223. <el-table-column
  224. prop="prize_level"
  225. label="奖品等级"
  226. align="center"
  227. >
  228. </el-table-column>
  229. <el-table-column
  230. prop="prize_name"
  231. label="奖品名称"
  232. align="center"
  233. >
  234. </el-table-column>
  235. <el-table-column
  236. prop="prize_price"
  237. label="奖品价值"
  238. align="center"
  239. >
  240. </el-table-column>
  241. <el-table-column
  242. prop="prize_amount"
  243. label="奖品数量"
  244. align="center"
  245. >
  246. </el-table-column>
  247. <el-table-column
  248. prop="winner_amount"
  249. label="奖励人数"
  250. align="center"
  251. >
  252. </el-table-column>
  253. </el-table>
  254. </div>
  255. </el-dialog>
  256. <!-- 弹框提示结束-->
  257. </div>
  258. <script>
  259. const app = new Vue({
  260. el: '#app',
  261. data: {
  262. loading: false,
  263. prize:[],
  264. activeName: '-1',
  265. list: [],
  266. dialogAddgsVisible:false,
  267. pagination: null,
  268. agent_level_list: [],
  269. search: {
  270. page: 1,
  271. name:'',
  272. begin_time:'',
  273. end_time:'',
  274. status:'',
  275. performance_type:'',
  276. activity_type:1, //活动类型;1个人;2战队;
  277. /* goods_name:'',
  278. keyword:'',
  279. changes_dir:null,
  280. changes_type:null,
  281. is_settle:null */
  282. },
  283. pageCount:0,
  284. time:'',
  285. capitalChange:[//资金变动方向 全部 “” 收入1 支出2
  286. {name:'全部',value:''},
  287. {name:'收入',value:1},
  288. {name:'支出',value:2}
  289. ],
  290. capitalChangeType:[//资金变动类型;100会员买货平级奖;101会员买货越级奖;102会员买货货款;103补货平级奖励;104补货越级奖励;105补货货款;106补货奖励;200提现;
  291. {name:'全部',value:''},
  292. {name:'会员买货平级奖',value:100},
  293. {name:'会员买货越级奖',value:101},
  294. {name:'会员买货货款',value:102},
  295. {name:'补货平级奖励',value:103},
  296. {name:'补货越级奖励',value:104},
  297. {name:'补货货款',value:105},
  298. {name:'补货奖励',value:106},
  299. {name:'提现',value:200},
  300. ],
  301. settlementStatus:[//下拉框 收入结算状态 全部 “” 1已结算;0未结算;
  302. {name:'全部',value:''},
  303. {name:'已结算',value:1},
  304. {name:'未结算',value:0},
  305. ],
  306. statusList:[//状态;0未开始;1进行中;2已结束;3已取消;
  307. {name:'全部',value:''},
  308. {name:'未开始',value:0},
  309. {name:'进行中',value:1},
  310. {name:'已结束',value:2},
  311. {name:'已取消',value:3},
  312. ],
  313. PKlist:[//活动类型;1拉新;2业绩
  314. {name:'全部',value:''},
  315. {name:'拉新PK',value:1},
  316. {name:'业绩PK',value:2},
  317. ],
  318. pickerOptions: {
  319. shortcuts: [{
  320. text: '最近一周',
  321. onClick(picker) {
  322. const end = new Date();
  323. const start = new Date();
  324. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  325. picker.$emit('pick', [start, end]);
  326. }
  327. }, {
  328. text: '最近一个月',
  329. onClick(picker) {
  330. const end = new Date();
  331. const start = new Date();
  332. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  333. picker.$emit('pick', [start, end]);
  334. }
  335. }, {
  336. text: '最近三个月',
  337. onClick(picker) {
  338. const end = new Date();
  339. const start = new Date();
  340. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  341. picker.$emit('pick', [start, end]);
  342. }
  343. }]
  344. },
  345. },
  346. mounted() {
  347. this.loadData();
  348. },
  349. methods: {
  350. seeprize(data){
  351. this.dialogAddgsVisible = true;
  352. this.prize = data;
  353. },
  354. resetFun(){
  355. this.search = {
  356. page: 1,
  357. name:'',
  358. begin_time:'',
  359. end_time:'',
  360. status:'',
  361. performance_type:'',
  362. activity_type:1, //活动类型;1个人;2战队;
  363. }
  364. this.time = '';
  365. this.loadData();
  366. },
  367. formatTime(timeStamp) {
  368. var date = new Date();
  369. date.setTime(timeStamp * 1000);
  370. var y = date.getFullYear();
  371. var m = date.getMonth() + 1;
  372. m = m < 10 ? ('0' + m) : m;
  373. var d = date.getDate();
  374. d = d < 10 ? ('0' + d) : d;
  375. var h = date.getHours();
  376. h = h < 10 ? ('0' + h) : h;
  377. var minute = date.getMinutes();
  378. var second = date.getSeconds();
  379. minute = minute < 10 ? ('0' + minute) : minute;
  380. second = second < 10 ? ('0' + second) : second;
  381. return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
  382. },
  383. computedType(type){//资金变动类型;100会员买货平级奖;101会员买货越级奖;102会员买货货款;103补货平级奖励;104补货越级奖励;105补货货款;106补货奖励;200提现;
  384. if(type == 100){
  385. return '会员买货平级奖'
  386. }else if(type == 101){
  387. return '会员买货越级奖'
  388. }else if(type == 102){
  389. return '会员买货货款'
  390. }else if(type == 103){
  391. return '补货平级奖励'
  392. }else if(type == 104){
  393. return '补货越级奖励'
  394. }else if(type == 105){
  395. return '补货货款'
  396. }else if(type == 106){
  397. return '补货奖励'
  398. }else if(type == 200){
  399. return '提现'
  400. }
  401. },
  402. tableRowClassName({row, rowIndex}){
  403. row.index = rowIndex+1;
  404. },
  405. loadData() {
  406. let params = {
  407. r: 'pk/personal/index',//活动列表
  408. /* page:1, */
  409. limit:10
  410. };
  411. params = Object.assign(params, this.search);
  412. this.loading = true;
  413. request({
  414. params: params,
  415. method: 'get',
  416. }).then(e => {
  417. //console.log('个人活动列表='+JSON.stringify(e))
  418. this.loading = false;
  419. if (e.data.code == 0) {
  420. this.list = e.data.data.list;
  421. this.pageCount = e.data.data.page_count;
  422. } else {
  423. this.$message.error(e.data.msg);
  424. }
  425. }).catch(e => {
  426. this.loading = false;
  427. });
  428. },
  429. pageChange(page) {
  430. this.search.page = page;
  431. this.loadData();
  432. },
  433. handleClick(tab, event) {
  434. this.search.page = 1;
  435. this.search.status = this.activeName;
  436. this.loadData()
  437. },
  438. toSearch() {
  439. this.search.page = 1;
  440. this.loadData();
  441. },
  442. datetimeChange(){
  443. if(this.time){
  444. this.search.begin_time = this.time[0];
  445. this.search.end_time = this.time[1];
  446. }else{
  447. this.search.begin_time = '';
  448. this.search.end_time = '';
  449. }
  450. this.toSearch();
  451. },
  452. switchFun(event,id){
  453. this.loading = true;
  454. request({
  455. params: {
  456. r: 'pk/personal/patch'
  457. },
  458. method: 'post',
  459. data:{
  460. id:id,
  461. is_enable:event
  462. }
  463. }).then(e => {
  464. this.loading = false;
  465. //console.log('添加的结果='+JSON.stringify(e))
  466. if (e.data.code == 0) {
  467. this.$message.success('更改状态成功');
  468. this.loadData();
  469. } else {
  470. this.$message.error(e.data.msg);
  471. this.loadData();
  472. }
  473. }).catch(e => {
  474. this.loadData();
  475. this.$message.error(e.data.msg);
  476. this.loading = false;
  477. });
  478. },
  479. edit(id){
  480. //console.log(id)
  481. navigateTo({
  482. r: 'pk/personal/personal-add',
  483. id: id
  484. });
  485. },
  486. goTo(data){
  487. navigateTo({
  488. r: 'pk/personal/list',
  489. id:data.id,
  490. type:data.performance_type
  491. });
  492. },
  493. test(){
  494. let self = this;
  495. self.loading = true;
  496. let basic_params = {
  497. page: self.page,
  498. };
  499. params = Object.assign(basic_params, this.search);
  500. request({
  501. params: {
  502. r: 'pk/personal/test'
  503. },
  504. method: 'post',
  505. data: params
  506. }).then(e => {
  507. }).catch(e => {
  508. self.loading = false;
  509. });
  510. },
  511. delFun(row,index){
  512. let self = this;
  513. let message = '是否确认删除该活动?';
  514. if(row.status == 1){
  515. message = '该活动正在进行中,是否确认继续删除该活动?';
  516. }
  517. self.$confirm(message, '提示', {
  518. confirmButtonText: '确定',
  519. cancelButtonText: '取消',
  520. type: 'warning'
  521. }).then(() => {
  522. self.loading = true;
  523. request({
  524. params: {
  525. r: 'pk/personal/destroy',
  526. id:row.id
  527. },
  528. method: 'get',
  529. }).then(e => {
  530. self.loading = false;
  531. if (e.data.code === 0) {
  532. self.$message.success(e.data.msg);
  533. self.list.splice(index, 1);
  534. } else {
  535. self.$message.error(e.data.msg);
  536. }
  537. }).catch(e => {
  538. self.loading = false;
  539. //console.log('catch='+JSON.stringify(e));
  540. });
  541. }).catch(() => {
  542. self.$message.info('已取消删除')
  543. });
  544. }
  545. }
  546. });
  547. </script>
  548. <style>
  549. .el-tabs__header {
  550. font-size: 16px;
  551. }
  552. .table-body {
  553. padding: 20px;
  554. background-color: #fff;
  555. }
  556. .input-item {
  557. width: 250px;
  558. margin: 0 0 20px;
  559. display: inline-block;
  560. }
  561. .input-item .el-input__inner {
  562. border-right: 0;
  563. }
  564. .input-item .el-input__inner:hover {
  565. border: 1px solid #dcdfe6;
  566. border-right: 0;
  567. outline: 0;
  568. }
  569. .input-item .el-input__inner:focus {
  570. border: 1px solid #dcdfe6;
  571. border-right: 0;
  572. outline: 0;
  573. }
  574. .input-item .el-input-group__append {
  575. background-color: #fff;
  576. border-left: 0;
  577. width: 10%;
  578. padding: 0;
  579. }
  580. .input-item .el-input-group__append .el-button {
  581. padding: 0;
  582. }
  583. .input-item .el-input-group__append .el-button {
  584. margin: 0;
  585. }
  586. .batch {
  587. margin: 0 0 20px;
  588. display: inline-block;
  589. }
  590. .el-table thead{
  591. font-size: 14px;
  592. color: #333;
  593. }
  594. .table1 > .el-table__footer-wrapper,.table1 > .el-table__header-wrapper{
  595. border-bottom: 1.4px solid #D6D6D6;
  596. }
  597. /* .el-button+.el-button{
  598. margin-left: 0px !important;
  599. } */
  600. .el-date-editor .el-range-separator{/* 设置选择日期框的中间的 ‘至’ 的宽度 */
  601. width: 8%;
  602. }
  603. </style>