index.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. <?php
  2. /**
  3. * @link:http://www.gdqijianshi.com/
  4. * @copyright: Copyright (c) 2020 广东七件事集团
  5. * Created by PhpStorm
  6. * Author: ganxiaohao
  7. * Date: 2020-05-08
  8. * Time: 15:48
  9. */
  10. use common\helpers\ComponentHelper;
  11. ComponentHelper::loadComponentView('component/boss/boss-batch', dirname(__DIR__));
  12. ComponentHelper::loadComponentView('component/boss/boss-edit', dirname(__DIR__));
  13. ComponentHelper::loadComponentView('component/boss/boss-level', dirname(__DIR__));
  14. ?>
  15. <div id="app" v-cloak>
  16. <el-card shadow="never" style="border:0;min-width: 1000px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  17. <div slot="header">
  18. <span>股东列表</span>
  19. <el-form size="small" :inline="true" :model="search" style="float: right;margin-top: -5px;">
  20. <el-form-item>
  21. <com-export-dialog :field_list='exportList' :params="search" @selected="confirmSubmit">
  22. </com-export-dialog>
  23. </el-form-item>
  24. </el-form>
  25. </div>
  26. <div class="table-body">
  27. <el-select size="small" v-model="search.platform" @change='toSearch' class="select">
  28. <el-option key="all" label="全部平台" value=""></el-option>
  29. <el-option key="wxapp" label="微信" value="wxapp"></el-option>
  30. </el-select>
  31. <el-select size="small" v-model="search.level" @change='toSearch' class="select">
  32. <el-option key="all" label="全部等级" value=""></el-option>
  33. <el-option :key="index" :label="item.name" :value="item.level"
  34. v-for="(item, index) in bossLevelList"></el-option>
  35. </el-select>
  36. <div class="input-item">
  37. <el-input @keyup.enter.native="loadData" size="small" placeholder="请输入用户ID" v-model="search.keyword"
  38. clearable @clear="toSearch">
  39. <el-button slot="append" icon="el-icon-search" @click="toSearch"></el-button>
  40. </el-input>
  41. </div>
  42. <div class="batch">
  43. <boss-batch :choose-list="choose_list" :boss-level-list="bossLevelList"
  44. @to-search="loadData"></boss-batch>
  45. </div>
  46. <div style="float: right">
  47. <el-button type="primary" size="small" style="padding: 9px 15px !important;" @click="editClick">添加股东
  48. </el-button>
  49. </div>
  50. <el-tabs v-model="activeName" @tab-click="handleClick">
  51. <el-table :data="list" stripe v-loading="loading" size="small" style="margin-bottom: 15px;"
  52. @selection-change="handleSelectionChange">
  53. <el-table-column align='center' type="selection" width="60" ></el-table-column>
  54. <el-table-column prop="user_id" width="80" label="用户ID" align="center"></el-table-column>
  55. <el-table-column label="基本信息" width="200">
  56. <template slot-scope="scope">
  57. <com-image style="float: left;margin-right: 5px;" mode="aspectFill"
  58. :src="scope.row.avatar_url"></com-image>
  59. <div>{{scope.row.nickname}}</div>
  60. <div>
  61. <img v-if="scope.row.userInfo.platform == 'wxapp'" src="resources/img/mall/wx.png" alt="">
  62. <img v-if="scope.row.userInfo.platform == 'aliapp'" src="resources/img/mall/ali.png"
  63. alt="">
  64. <img v-if="scope.row.userInfo.platform == 'ttapp'" src="resources/img/mall/toutiao.png"
  65. alt="">
  66. <img v-if="scope.row.userInfo.platform == 'bdapp'" src="resources/img/mall/baidu.png"
  67. alt="">
  68. </div>
  69. </template>
  70. </el-table-column>
  71. <el-table-column label="手机号" prop="mobile" align="center" min-width="150">
  72. <template slot-scope="scope">
  73. <div>{{scope.row.userInfo.mobile}}</div>
  74. </template>
  75. </el-table-column>
  76. <el-table-column label="累计佣金" prop="total_price" align="center">
  77. <template slot-scope="scope">
  78. <div>{{scope.row.total_price}}</div>
  79. </template>
  80. </el-table-column>
  81. <el-table-column label="推荐人" prop="parent_name" align="center"></el-table-column>
  82. <el-table-column label="股东等级" width="120" prop="level" align="center">
  83. <template slot-scope="scope">
  84. <el-tag size="small" type="info" v-if="scope.row.level == 0">默认等级</el-tag>
  85. <el-tag size="small" v-else>{{scope.row.level_name}}</el-tag>
  86. <br />
  87. <span v-if="scope.row.upgrade_status == 1">条件升级</span>
  88. <span v-else-if="scope.row.upgrade_status == 2">购物升级</span>
  89. <span v-else>手动升级</span>
  90. </template>
  91. </el-table-column>
  92. </el-table-column>
  93. <el-table-column label="时间" width="200" align="center">
  94. <template slot-scope="scope">
  95. <div>成为股东时间:<br>{{scope.row.created_at|dateTimeFormat('Y-m-d H:i:s')}}</div>
  96. </template>
  97. </el-table-column>
  98. </el-table-column>
  99. <el-table-column label="备注信息" prop="remarks" align="center"></el-table-column>
  100. <el-table-column label="操作" width="300px" align="center">
  101. <template slot-scope="scope">
  102. <!-- <el-button type="text" size="mini" circle style="margin-top: 10px"-->
  103. <!-- @click.native="order(scope.row.user_id)">-->
  104. <!-- <el-tooltip class="item" effect="dark" content="查看订单" placement="top">-->
  105. <!-- <img src="resources/img/mall/boss/order.png" alt="">-->
  106. <!-- </el-tooltip>-->
  107. <!-- </el-button>-->
  108. <!-- <el-button type="text" size="mini" circle style="margin-left: 10px;margin-top: 10px"-->
  109. <!-- @click.native="cash(scope.row.user_id)">-->
  110. <!-- <el-tooltip class="item" effect="dark" content="提现详情" placement="top">-->
  111. <!-- <img src="resources/img/mall/boss/detail.png" alt="">-->
  112. <!-- </el-tooltip>-->
  113. <!-- </el-button>-->
  114. <el-button type="text" size="mini" circle style="margin-left: 10px;margin-top: 10px"
  115. @click.native="remarks(scope.row)">
  116. <el-tooltip class="item" effect="dark" content="添加备注" placement="top">
  117. <img src="resources/img/mall/order/add_remark.png" alt="">
  118. </el-tooltip>
  119. </el-button>
  120. <el-button type="text" size="mini" circle style="margin-left: 10px;margin-top: 10px"
  121. @click.native="editLevel(scope.row)">
  122. <el-tooltip class="item" effect="dark" content="修改股东等级" placement="top">
  123. <img src="resources/img/mall/edit.png" alt="">
  124. </el-tooltip>
  125. </el-button>
  126. <el-button circle size="mini" type="text" @click="agentDelete(scope.row, scope.$index)">
  127. <el-tooltip class="item" effect="dark" content="删除" placement="top">
  128. <img src="resources/img/mall/del.png" alt="">
  129. </el-tooltip>
  130. </el-button>
  131. </template>
  132. </el-table-column>
  133. </el-table>
  134. </el-tabs>
  135. <div flex="box:last cross:center">
  136. <div></div>
  137. <div>
  138. <el-pagination
  139. v-if="list.length > 0"
  140. style="display: inline-block;float: right;"
  141. background :page-size="pagination.pageSize"
  142. @current-change="pageChange"
  143. layout="prev, pager, next" :current-page="pagination.current_page"
  144. :total="pagination.total_count">
  145. </el-pagination>
  146. </div>
  147. </div>
  148. </div>
  149. </el-card>
  150. <el-dialog
  151. title="下线情况"
  152. :visible.sync="dialogChild"
  153. width="40%">
  154. <div>
  155. <el-table :data="childList" border v-loading="dialogLoading">
  156. <el-table-column type="index" label="序号"></el-table-column>
  157. <el-table-column label="股东">
  158. <template slot-scope="scope">
  159. <span>{{select.nickname}}</span>
  160. </template>
  161. </el-table-column>
  162. <el-table-column label="下线等级" prop="nickname">
  163. <template slot-scope="scope">
  164. <span v-if="select.status == 1">{{share_name.first}}</span>
  165. <span v-if="select.status == 2">{{share_name.second}}</span>
  166. <span v-if="select.status == 3">{{share_name.third}}</span>
  167. </template>
  168. </el-table-column>
  169. <el-table-column label="昵称" prop="nickname"></el-table-column>
  170. <el-table-column label="成为下线时间" prop="junior_at"></el-table-column>
  171. </el-table>
  172. </div>
  173. <div slot="footer" class="dialog-footer">
  174. <el-button @click="dialogChild = false">取 消</el-button>
  175. <el-button type="primary" @click="dialogChild = false">确 定</el-button>
  176. </div>
  177. </el-dialog>
  178. <el-dialog title="添加备注" :visible.sync="dialogContent">
  179. <el-form :model="remarksForm">
  180. <el-form-item label="备注">
  181. <el-input type="textboss" v-model="remarksForm.remarks" autocomplete="off"></el-input>
  182. <el-input style="display: none" :readonly="true" v-model="remarksForm.id"></el-input>
  183. </el-form-item>
  184. </el-form>
  185. <div slot="footer" class="dialog-footer">
  186. <el-button @click="dialogContent = false">取 消</el-button>
  187. <el-button type="primary" @click="remarksSubmit" :loading="remarksLoading">确 定</el-button>
  188. </div>
  189. </el-dialog>
  190. <boss-edit v-model="edit.show"></boss-edit>
  191. <boss-level v-model="level.show" :boss="level.boss" @success="levelSuccess"></boss-level>
  192. </div>
  193. <script>
  194. const app = new Vue({
  195. el: '#app',
  196. data: {
  197. qrimg: '',
  198. showqr: false,
  199. avatar: '',
  200. nickname: '',
  201. search: {
  202. keyword: '',
  203. status: -1,
  204. page: 1,
  205. platform: '',
  206. level: ''
  207. },
  208. loading: false,
  209. activeName: '-1',
  210. list: [],
  211. pagination: null,
  212. dialogChild: false,
  213. dialogLoading: false,
  214. childList: [],
  215. share_name: {
  216. first: '一级',
  217. second: '二级',
  218. third: '三级'
  219. },
  220. select: {
  221. nickname: '',
  222. status: 'first',
  223. },
  224. dialogContent: false,
  225. remarksForm: {
  226. remarks: '',
  227. id: ''
  228. },
  229. remarksLoading: false,
  230. exportList: [],
  231. edit: {
  232. show: false,
  233. },
  234. level: {
  235. show: false,
  236. boss: null,
  237. },
  238. bossLevelList: [],
  239. choose_list: [],
  240. },
  241. mounted() {
  242. this.loadData();
  243. },
  244. methods: {
  245. agentDelete(row, index) {
  246. let self = this;
  247. self.$confirm('删除该股东, 是否继续?', '提示', {
  248. confirmButtonText: '确定',
  249. cancelButtonText: '取消',
  250. type: 'warning'
  251. }).then(() => {
  252. self.listLoading = true;
  253. request({
  254. params: {
  255. r: 'store/client/store-boss/delete',
  256. },
  257. method: 'post',
  258. data: {
  259. id: row.id,
  260. }
  261. }).then(e => {
  262. self.listLoading = false;
  263. if (e.data.code === 0) {
  264. self.$message.success(e.data.msg);
  265. self.list.splice(index, 1);
  266. } else {
  267. self.$message.error(e.data.msg);
  268. }
  269. }).catch(e => {
  270. console.log(e);
  271. });
  272. }).catch(() => {
  273. self.$message.info('已取消删除')
  274. });
  275. },
  276. down() {
  277. var alink = document.createElement("a");
  278. alink.href = this.qrimg;
  279. alink.download = this.nickname;
  280. alink.click();
  281. },
  282. confirmSubmit() {
  283. this.search.status = this.activeName
  284. },
  285. loadData() {
  286. this.loading = true;
  287. let params = {
  288. r: 'store/client/store-boss/index'
  289. };
  290. params = Object.assign(params, this.search);
  291. request({
  292. params: params,
  293. method: 'get',
  294. }).then(e => {
  295. this.loading = false;
  296. if (e.data.code == 0) {
  297. this.list = e.data.data.list;
  298. this.pagination = e.data.data.pagination;
  299. this.exportList = e.data.data.export_list;
  300. this.bossLevelList = e.data.data.bossLevelList;
  301. } else {
  302. this.$message.error(e.data.msg);
  303. }
  304. }).catch(e => {
  305. this.loading = false;
  306. });
  307. },
  308. pageChange(page) {
  309. this.search.page = page;
  310. this.loadData();
  311. },
  312. handleClick(tab, event) {
  313. this.search.page = 1;
  314. this.search.status = this.activeName;
  315. this.loadData()
  316. },
  317. apply(user_id, status) {
  318. this.$prompt('请输入原因', '提示', {
  319. confirmButtonText: '确定',
  320. cancelButtonText: '取消',
  321. beforeClose: (action, instance, done) => {
  322. if (action === 'confirm') {
  323. instance.confirmButtonLoading = true;
  324. instance.confirmButtonText = '执行中...';
  325. request({
  326. params: {
  327. r: 'store/client/store-boss/apply', ///未改
  328. user_id: user_id,
  329. status: status,
  330. reason: instance.inputValue
  331. },
  332. method: 'get'
  333. }).then(e => {
  334. done();
  335. instance.confirmButtonLoading = false;
  336. if (e.data.code == 0) {
  337. this.loadData();
  338. } else {
  339. this.$message.error(e.data.msg);
  340. }
  341. }).catch(e => {
  342. done();
  343. instance.confirmButtonLoading = false;
  344. });
  345. } else {
  346. done();
  347. }
  348. }
  349. }).then(({value}) => {
  350. }).catch(() => {
  351. this.$message({
  352. type: 'info',
  353. message: '取消输入'
  354. });
  355. });
  356. },
  357. order(id) {
  358. navigateTo({
  359. r: 'store/client/store-boss/order',
  360. id: id
  361. })
  362. },
  363. cash(user_id) {
  364. navigateTo({
  365. r: 'store/clent/store-boss/cash',
  366. user_id: user_id
  367. })
  368. },
  369. toSearch() {
  370. this.search.page = 1;
  371. this.loadData();
  372. },
  373. remarks(row) {
  374. this.dialogContent = true;
  375. this.remarksForm = {
  376. remarks: row.remarks,
  377. id: row.id
  378. }
  379. },
  380. remarksSubmit() {
  381. this.remarksLoading = true;
  382. request({
  383. params: {
  384. r: 'store/client/store-boss/remarks-edit',
  385. },
  386. method: 'post',
  387. data:{
  388. remarks: this.remarksForm.remarks,
  389. id: this.remarksForm.id
  390. }
  391. }).then(e => {
  392. this.remarksLoading = false;
  393. if (e.data.code == 0) {
  394. this.dialogContent = false;
  395. this.loadData();
  396. this.$message.success(e.data.msg);
  397. } else {
  398. this.$message.error(e.data.data.msg);
  399. }
  400. }).catch(e => {
  401. this.remarksLoading = false;
  402. this.$message.error('未知错误');
  403. });
  404. },
  405. dialogChildShow(share, status) {
  406. this.dialogChild = true;
  407. this.dialogLoading = true;
  408. this.select = {
  409. nickname: share.nickname,
  410. status: status
  411. };
  412. request({
  413. params: {
  414. r: 'store/client/store-boss/team',
  415. status: status,
  416. id: share.user_id
  417. },
  418. method: 'get'
  419. }).then(e => {
  420. this.dialogLoading = false;
  421. if (e.data.code == 0) {
  422. this.childList = e.data.data.list;
  423. }
  424. }).catch(e => {
  425. this.dialogLoading = false;
  426. this.$message.error('未知错误');
  427. });
  428. },
  429. editClick() {
  430. this.edit.show = true;
  431. },
  432. editLevel(row) {
  433. this.level.show = true;
  434. this.level.boss = row;
  435. },
  436. handleSelectionChange(val) {
  437. let self = this;
  438. self.choose_list = [];
  439. val.forEach(function (item) {
  440. self.choose_list.push(item.id);
  441. })
  442. },
  443. levelSuccess() {
  444. this.loadData();
  445. }
  446. }
  447. });
  448. </script>
  449. <style>
  450. .el-tabs__header {
  451. font-size: 16px;
  452. }
  453. .table-body {
  454. padding: 20px;
  455. background-color: #fff;
  456. }
  457. .table-body .el-button {
  458. padding: 0 !important;
  459. border: 0;
  460. margin: 0 5px;
  461. }
  462. .input-item {
  463. width: 250px;
  464. margin: 0 0 20px;
  465. display: inline-block;
  466. }
  467. .input-item .el-input__inner {
  468. border-right: 0;
  469. }
  470. .input-item .el-input__inner:hover {
  471. border: 1px solid #dcdfe6;
  472. border-right: 0;
  473. outline: 0;
  474. }
  475. .input-item .el-input__inner:focus {
  476. border: 1px solid #dcdfe6;
  477. border-right: 0;
  478. outline: 0;
  479. }
  480. .input-item .el-input-group__append {
  481. background-color: #fff;
  482. border-left: 0;
  483. width: 10%;
  484. padding: 0;
  485. }
  486. .input-item .el-input-group__append .el-button {
  487. padding: 0;
  488. }
  489. .input-item .el-input-group__append .el-button {
  490. margin: 0;
  491. }
  492. .batch {
  493. margin: 0 0 20px;
  494. display: inline-block;
  495. }
  496. .batch .el-button {
  497. padding: 9px 15px !important;
  498. }
  499. .el-table th>.cell{
  500. color: #333;
  501. font-weight: bold;
  502. font-size: 14px;
  503. }
  504. .el-table__footer-wrapper, .el-table__header-wrapper{
  505. border-bottom: 1.4px solid #D6D6D6;
  506. }
  507. </style>