balance-record.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. <template>
  2. <div class="page-box" v-loading="loading > 0">
  3. <Header :title="title"></Header>
  4. <div class="tabs">
  5. <div
  6. class="tab"
  7. :class="{ active: tabActive === item.value }"
  8. v-for="item in moneyType"
  9. :key="item.value"
  10. @click="tabChange(item.value)"
  11. >
  12. {{ item.name }}
  13. <div class="tab-line"></div>
  14. </div>
  15. </div>
  16. <div class="container">
  17. <!-- tab -->
  18. <div class="content">
  19. <!-- 表格 -->
  20. <div class="filter-box">
  21. <div class="filter">
  22. <!-- <div class="filter-item">
  23. <div class="label">货币类型:</div>
  24. <el-select
  25. v-model="filter.genre"
  26. size="small"
  27. class="select"
  28. placeholder="请选择"
  29. >
  30. <el-option
  31. v-for="item in moneyType"
  32. :key="item.value"
  33. :label="item.name"
  34. :value="item.value"
  35. >
  36. </el-option>
  37. </el-select>
  38. </div> -->
  39. <div class="filter-item">
  40. <div class="label">变动类型:</div>
  41. <el-select
  42. v-model="filter.fundType"
  43. size="small"
  44. class="select"
  45. placeholder="请选择"
  46. >
  47. <el-option
  48. v-for="item in statusType"
  49. :key="item.value"
  50. :label="item.name"
  51. :value="item.value"
  52. >
  53. </el-option>
  54. </el-select>
  55. </div>
  56. <div class="filter-item">
  57. <div class="label">利润获得者ID:</div>
  58. <el-input
  59. class="input"
  60. v-model="filter.uid"
  61. placeholder="请输入内容"
  62. size="small"
  63. ></el-input>
  64. </div>
  65. <div class="filter-item">
  66. <div class="label">利润发起者ID:</div>
  67. <el-input
  68. class="input"
  69. v-model="filter.fid"
  70. placeholder="请输入内容"
  71. size="small"
  72. ></el-input>
  73. </div>
  74. <div class="filter-item">
  75. <div class="label">申请时间:</div>
  76. <el-date-picker
  77. v-model="date"
  78. type="datetimerange"
  79. align="right"
  80. unlink-panels
  81. class="date-input"
  82. range-separator="至"
  83. start-placeholder="开始日期"
  84. end-placeholder="结束日期"
  85. value-format="yyyy-MM-dd HH:mm:ss"
  86. :default-time="['00:00:00', '23:59:59']"
  87. size="small"
  88. >
  89. </el-date-picker>
  90. </div>
  91. </div>
  92. <div class="btn-box">
  93. <button class="search" @click="search">筛选</button>
  94. <button class="reset" @click="reset">重置</button>
  95. <button
  96. class="search"
  97. style="margin-left: 60px"
  98. @click="order2excel"
  99. >
  100. 导出
  101. </button>
  102. </div>
  103. </div>
  104. <el-table
  105. :data="list"
  106. class="order-table table no-border-table"
  107. ref="orderTable"
  108. :header-cell-style="{
  109. border: 'none',
  110. color: '#333',
  111. background: '#f6f6f6',
  112. borderBottom: '1px solid #E8E8E8',
  113. height: '54px',
  114. }"
  115. :row-style="{
  116. height: '54px',
  117. }"
  118. >
  119. <el-table-column
  120. prop="uid"
  121. align="center"
  122. label="奖励获得者ID"
  123. ></el-table-column>
  124. <el-table-column prop="genre" align="center" label="货币类型">
  125. <div>
  126. {{ moneyMap[tabActive] }}
  127. </div>
  128. </el-table-column>
  129. <el-table-column
  130. prop="describe"
  131. align="center"
  132. label="描述"
  133. ></el-table-column>
  134. <el-table-column
  135. prop="fid"
  136. align="center"
  137. label="奖励发起者ID"
  138. v-if="tabActive !==5"
  139. ></el-table-column>
  140. <el-table-column
  141. prop="amount"
  142. align="center"
  143. label="额度"
  144. ></el-table-column>
  145. <el-table-column
  146. prop="afterAmount"
  147. align="center"
  148. label="操作后额度/元"
  149. ></el-table-column>
  150. <el-table-column
  151. prop="created"
  152. align="center"
  153. label="创建时间"
  154. ></el-table-column>
  155. </el-table>
  156. </div>
  157. <!-- 分页按钮 -->
  158. <div class="footer">
  159. <el-pagination
  160. @current-change="handleCurrentChange"
  161. :current-page.sync="currentPage"
  162. background
  163. layout="total, prev, pager, next, jumper"
  164. :page-size="size"
  165. :total="total"
  166. ></el-pagination>
  167. </div>
  168. </div>
  169. <el-dialog
  170. :show-close="false"
  171. :close-on-click-modal="false"
  172. title="生成中..."
  173. :visible.sync="showProgressDialog"
  174. width="30%"
  175. center
  176. >
  177. <el-progress
  178. :percentage="progress"
  179. :text-inside="true"
  180. :stroke-width="18"
  181. ></el-progress>
  182. </el-dialog>
  183. </div>
  184. </template>
  185. <script type="text/ecmascript-6">
  186. import Header from '../../components/common/header';
  187. import myUtils from '../../components/common/whatever2excel';
  188. export default {
  189. components: {
  190. Header
  191. },
  192. name: 'balanceRecord',
  193. data() {
  194. return {
  195. currentPage: 1, // 当前页码
  196. size: 20, // 每页条数
  197. total: 0, // 总页数
  198. loading: 0, // 加载中
  199. title: {
  200. // 页面标题
  201. firstTitile: '资金管理',
  202. secondTitle: '变动记录'
  203. },
  204. filter: {
  205. uid: null,
  206. fid: null,
  207. fundType: null
  208. },
  209. tabActive: 1,
  210. statusType: [],
  211. moneyType: [
  212. {
  213. name: '积分',
  214. value: 1
  215. },
  216. {
  217. name: '代金券',
  218. value: 2
  219. },
  220. {
  221. name: '余额',
  222. value: 3
  223. },
  224. // {
  225. // name: '金豆',
  226. // value: 4
  227. // },
  228. // {
  229. // name: '生命值',
  230. // value: 5
  231. // }
  232. ],
  233. moneyMap: {
  234. 1: '积分',
  235. 2: '代金券',
  236. 3: '余额',
  237. 4: '金豆',
  238. 5: '生命值'
  239. },
  240. hzType: [],
  241. hqType: [],
  242. balanceType: [],
  243. bean: [],
  244. tgType: [],
  245. hpType: [],
  246. list: [], // 列表
  247. date: [],
  248. showProgressDialog: false,
  249. progress: 0
  250. };
  251. },
  252. mounted() {
  253. this.statusType = this.hzType;
  254. // 获取列表
  255. this.getFundTypeMap();
  256. this.getList();
  257. },
  258. computed: {},
  259. methods: {
  260. // 切换页码
  261. handleCurrentChange(page) {
  262. this.currentPage = page;
  263. this.getList();
  264. },
  265. tabChange(val) {
  266. this.filter = {
  267. fundType: null,
  268. uid: null
  269. };
  270. switch (val) {
  271. case 1:
  272. this.statusType = this.hzType;
  273. break;
  274. case 2:
  275. this.statusType = this.hqType;
  276. break;
  277. case 3:
  278. this.statusType = this.balanceType;
  279. break;
  280. case 4:
  281. this.statusType = this.beanType;
  282. break;
  283. case 5:
  284. this.statusType = this.hpType;
  285. break;
  286. default:
  287. return;
  288. }
  289. this.tabActive = val;
  290. this.currentPage = 1;
  291. this.getList();
  292. },
  293. getFundTypeMap() {
  294. this.loading++;
  295. this.httpGet(this.$root.getFundTypeMap, {}).then(
  296. (res) => {
  297. this.loading--;
  298. // this.typeMap = res.balanceLog;
  299. let hzType = [
  300. {
  301. name: '全部',
  302. value: ''
  303. }
  304. ];
  305. for (let key in res.balanceLog.integral) {
  306. hzType.push({
  307. name: res.balanceLog.integral[key],
  308. value: key
  309. });
  310. }
  311. this.hzType = hzType;
  312. let hqType = [
  313. {
  314. name: '全部',
  315. value: ''
  316. }
  317. ];
  318. for (let key in res.balanceLog.gold) {
  319. hqType.push({
  320. name: res.balanceLog.gold[key],
  321. value: key
  322. });
  323. }
  324. this.hqType = hqType;
  325. let balanceType = [
  326. {
  327. name: '全部',
  328. value: ''
  329. }
  330. ];
  331. for (let key in res.balanceLog.balance) {
  332. balanceType.push({
  333. name: res.balanceLog.balance[key],
  334. value: key
  335. });
  336. }
  337. this.balanceType = balanceType;
  338. let beanType = [
  339. {
  340. name: '全部',
  341. value: ''
  342. }
  343. ];
  344. for (let key in res.balanceLog.bean) {
  345. beanType.push({
  346. name: res.balanceLog.bean[key],
  347. value: key
  348. });
  349. }
  350. this.beanType = beanType;
  351. let hpType = [
  352. {
  353. name: '全部',
  354. value: ''
  355. }
  356. ];
  357. for (let key in res.balanceLog.hp) {
  358. hpType.push({
  359. name: res.balanceLog.hp[key],
  360. value: key
  361. });
  362. }
  363. this.hpType = hpType;
  364. this.statusType = this.hzType;
  365. },
  366. (res) => {
  367. this.loading--;
  368. this.$message.error(res);
  369. }
  370. );
  371. },
  372. // 获取列表
  373. getList() {
  374. this.filter.begin = this.date[0] || '';
  375. this.filter.end = this.date[1] || '';
  376. this.loading++;
  377. let url = '';
  378. switch (this.tabActive) {
  379. case 1:
  380. url = 'getIntegralList';
  381. break;
  382. case 2:
  383. url = 'getGoldList';
  384. break;
  385. case 3:
  386. url = 'getBalance';
  387. break;
  388. case 4:
  389. url = 'getBean';
  390. break;
  391. case 5:
  392. url = 'getHpList';
  393. break;
  394. default:
  395. return;
  396. }
  397. this.httpGet(this.$root[url], {
  398. page: this.currentPage,
  399. size: this.size,
  400. ...this.filter
  401. }).then(
  402. (res) => {
  403. this.loading--;
  404. this.list = res.list;
  405. this.total = res.total;
  406. },
  407. (res) => {
  408. this.loading--;
  409. this.$message.error(res);
  410. }
  411. );
  412. },
  413. // 过滤
  414. search() {
  415. this.currentPage = 1;
  416. this.getList();
  417. },
  418. // 重置过滤
  419. reset() {
  420. this.filter = {
  421. uid: null,
  422. fundType: null
  423. };
  424. this.date = [];
  425. this.getList();
  426. },
  427. async order2excel() {
  428. this.loading++;
  429. let list = [];
  430. let totalPage = null;
  431. let data = {
  432. page: this.currentPage,
  433. size: this.size,
  434. ...this.filter
  435. };
  436. let url = '';
  437. switch (this.tabActive) {
  438. case 1:
  439. url = 'getIntegralList';
  440. break;
  441. case 2:
  442. url = 'getGoldList';
  443. break;
  444. case 3:
  445. url = 'getBalance';
  446. break;
  447. case 4:
  448. url = 'getBean';
  449. break;
  450. case 5:
  451. url = 'getHpList';
  452. break;
  453. default:
  454. return;
  455. }
  456. await this.httpGet(this.$root[url], data).then(
  457. (res) => {
  458. this.loading--;
  459. totalPage = Math.ceil(parseInt(res.total) / this.size);
  460. },
  461. () => {
  462. this.loading--;
  463. }
  464. );
  465. this.showProgressDialog = true;
  466. this.progress = 0;
  467. await this.getAllPages(totalPage, list).then(
  468. () => {
  469. this.showProgressDialog = false;
  470. this.jsonFormatAndToExcel(list);
  471. },
  472. (err) => {
  473. console.error(err);
  474. this.showProgressDialog = false;
  475. }
  476. );
  477. },
  478. async getAllPages(totalPage, list) {
  479. for (let i = 1; i <= totalPage; i++) {
  480. let data = {
  481. page: i,
  482. size: this.size,
  483. ...this.filter
  484. };
  485. let url = '';
  486. switch (this.tabActive) {
  487. case 1:
  488. url = 'getIntegralList';
  489. break;
  490. case 2:
  491. url = 'getGoldList';
  492. break;
  493. case 3:
  494. url = 'getBalance';
  495. break;
  496. case 4:
  497. url = 'getBean';
  498. break;
  499. case 5:
  500. url = 'getHpList';
  501. break;
  502. default:
  503. return;
  504. }
  505. await this.httpGet(this.$root[url], data).then((res) => {
  506. list.push(...res.list);
  507. this.progress = Math.floor((i / totalPage) * 100);
  508. console.log('page' + i, list.length);
  509. });
  510. // console.log(5555, list);
  511. }
  512. },
  513. jsonFormatAndToExcel(list) {
  514. let formatList = [];
  515. list.forEach((item) => {
  516. let obj = {
  517. 用户ID: item.uid,
  518. 货币类型: this.moneyMap[this.tabActive],
  519. 描述: item.describe,
  520. 关联ID: item.fid,
  521. 额度: item.amount,
  522. '操作前额度/元': item.BeforeAmount,
  523. 创建时间: item.created
  524. };
  525. formatList.push(obj);
  526. });
  527. myUtils.json2excel(formatList);
  528. }
  529. }
  530. };
  531. </script>
  532. <style lang="stylus" rel="stylesheet/stylus">
  533. @import '~assets/public.styl';
  534. </style>
  535. <style lang="stylus" rel="stylesheet/stylus" scoped>
  536. @import '~assets/main.styl';
  537. .page-box {
  538. height: 100%;
  539. width: 100%;
  540. flex-y(flex-start, flex-start);
  541. overflow-y: hidden;
  542. background: bg-color;
  543. .container {
  544. box-sizing: border-box;
  545. height: 100%;
  546. width: 100%;
  547. overflow-y: auto;
  548. flex-y(flex-start, flex-start);
  549. padding: 10px;
  550. // content 表格
  551. .content {
  552. flex: 1;
  553. width: 100%;
  554. font-size: 14px;
  555. background: white;
  556. box-sizing: border-box;
  557. padding: 24px 32px;
  558. border-radius: 2px;
  559. // 按钮
  560. .btn {
  561. width: 100px;
  562. height: 32px;
  563. line-height: 32px;
  564. confirm-btn();
  565. font-size: 14px;
  566. margin: 16px 0;
  567. }
  568. // 表格按钮
  569. .table-btn {
  570. // width: 65px;
  571. height: 24px;
  572. line-height: 24px;
  573. color: gray3;
  574. font-size: 12px;
  575. margin-right: 8px;
  576. cancel-btn();
  577. padding: 0 8px;
  578. }
  579. .filter-item {
  580. margin-right: 12px;
  581. }
  582. .select, .input {
  583. width: 125px;
  584. }
  585. .date-input {
  586. width: 360px;
  587. }
  588. .btn-box {
  589. margin: 0;
  590. }
  591. .table {
  592. margin-top: 24px !important;
  593. }
  594. }
  595. }
  596. .footer {
  597. width: 100%;
  598. padding: 24px;
  599. box-sizing: border-box;
  600. flex-x(flex-end);
  601. background: white;
  602. }
  603. .dialog-content {
  604. flex-y();
  605. }
  606. .form {
  607. width: 100%;
  608. flex-center();
  609. margin: 8px 0;
  610. }
  611. }
  612. .tabs {
  613. width: 100%;
  614. background: #fff;
  615. height: 60px;
  616. flex-x(flex-start);
  617. padding: 0 30px;
  618. box-sizing: border-box;
  619. margin-top: 8px;
  620. flex-shrink: 0;
  621. .tab {
  622. background: #fff;
  623. cursor: pointer;
  624. padding: 0 15px;
  625. position: relative;
  626. width: auto;
  627. margin-right: 100px;
  628. height: 100%;
  629. flex-x(center);
  630. word(16px, #999);
  631. &.active {
  632. word(16px, #333);
  633. .tab-line {
  634. width: 100%;
  635. position: absolute;
  636. background: #4678E6;
  637. height: 4px;
  638. border-radius: 2px;
  639. left: 0;
  640. bottom: 3px;
  641. }
  642. }
  643. }
  644. }
  645. </style>