index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. <template>
  2. <div class='container'>
  3. <el-form :inline="true"
  4. v-model="topForm">
  5. <el-form-item label="分部">
  6. <el-select v-model="topForm.team" @change="handleItemChange" placeholder="请选择分部名称">
  7. <el-option v-for='(item,index) in brancheList'
  8. :key='index'
  9. :label="item.label"
  10. :value="item.value"></el-option>
  11. </el-select>
  12. <!-- <el-select v-model="topForm.instruments" placeholder="请选择乐团名称">
  13. <el-option v-for='(item,index) in instrumentList'
  14. :key='index'
  15. :label="item.label"
  16. :value="item.value"></el-option>
  17. </el-select> -->
  18. </el-form-item>
  19. <el-form-item label="支付时间">
  20. <el-date-picker
  21. v-model="paymentTime"
  22. type="datetimerange"
  23. :picker-options="pickerOptions"
  24. range-separator="至"
  25. format="yyyy-MM-dd"
  26. value-format="yyyy-MM-dd"
  27. start-placeholder="开始日期"
  28. end-placeholder="结束日期"
  29. align="right">
  30. </el-date-picker>
  31. </el-form-item>
  32. <el-button type="primary"
  33. icon="el-icon-search"
  34. plain
  35. @click="getstudentList">搜索</el-button>
  36. <el-button type="success"
  37. icon="el-icon-refresh"
  38. plain
  39. @click="resetStudentList">重置</el-button>
  40. <el-button plain
  41. @click="exportis">导出</el-button>
  42. <br />
  43. <p>
  44. <span style="padding-right: 12px;">总金额:{{ amountAll.amount }}元</span>
  45. <span style="padding-right: 12px;">课程:{{ amountAll.tuiFeeAmount }}元</span>
  46. <span style="padding-right: 12px;">商品:{{ amountAll.goodsFeeAmount }}元</span>
  47. <span style="padding-right: 12px;">教辅:{{ amountAll.sdFeeAmount }}元</span>
  48. <span style="padding-right: 12px;">手续费:{{ amountAll.commissionAmount }}元</span>
  49. </p>
  50. </el-form>
  51. <div class="tableWrap">
  52. <!-- height="calc(100vh - 174px)"
  53. show-summary
  54. :summary-method="getSummaries" -->
  55. <el-table :data='tableList'
  56. id='tableid'>
  57. <el-table-column type="index"
  58. width="55"></el-table-column>
  59. <el-table-column align="center"
  60. label="学生姓名"
  61. prop='userName'></el-table-column>
  62. <el-table-column align="center"
  63. label="订单编号"
  64. width="200"
  65. prop='orderNo'></el-table-column>
  66. <el-table-column align="center"
  67. label="收款账户"
  68. prop='account'></el-table-column>
  69. <el-table-column align="center"
  70. label="支付金额"
  71. prop='amount'></el-table-column>
  72. <el-table-column align="center"
  73. label="到账时间"
  74. prop='payTime'></el-table-column>
  75. <el-table-column align="center"
  76. label="课程费用"
  77. prop='tuiFee'></el-table-column>
  78. <el-table-column align="center"
  79. label="商品"
  80. prop="goodsFee"></el-table-column>
  81. <el-table-column align="center"
  82. label="教辅费用"
  83. prop="sdFee"></el-table-column>
  84. <el-table-column align="center"
  85. label="手续费"
  86. prop="commission"></el-table-column>
  87. <el-table-column align="center"
  88. label="专业"
  89. prop="voicyPart"></el-table-column>
  90. <el-table-column align="left"
  91. label="单位/学校"
  92. prop="poName"></el-table-column>
  93. <el-table-column align="left"
  94. label="备注"
  95. width="300"
  96. :formatter="filterRemark">
  97. </el-table-column>
  98. </el-table>
  99. <div class="paginationWrap">
  100. <el-pagination background
  101. class="pagination"
  102. layout="prev, pager, next"
  103. :total="total"
  104. :current-page.sync="currentPage"
  105. :page-size.sync="rows"
  106. @current-change="handleCurrentChange"></el-pagination>
  107. </div>
  108. </div>
  109. </div>
  110. </template>
  111. <script>
  112. import { getBranches, orderListPage, getMusicTeams } from "@/api/table";
  113. import qs from "qs";
  114. import { scrollTo } from '@/utils/scroll-to'
  115. export default {
  116. data () {
  117. return {
  118. pickerOptions: {
  119. shortcuts: [{
  120. text: '最近一周',
  121. onClick(picker) {
  122. const end = new Date();
  123. const start = new Date();
  124. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  125. picker.$emit('pick', [start, end]);
  126. }
  127. }, {
  128. text: '最近一个月',
  129. onClick(picker) {
  130. const end = new Date();
  131. const start = new Date();
  132. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  133. picker.$emit('pick', [start, end]);
  134. }
  135. }, {
  136. text: '最近三个月',
  137. onClick(picker) {
  138. const end = new Date();
  139. const start = new Date();
  140. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  141. picker.$emit('pick', [start, end]);
  142. }
  143. }]
  144. },
  145. paymentTime: '',
  146. topForm: {},
  147. tableList: [],
  148. rows: 20,
  149. total: 0,
  150. page: 1,
  151. brancheList: [],// 分部列表
  152. instrumentList: [], // 乐团列表
  153. idTmr: '',
  154. tableId: '',
  155. props: {
  156. value: 'value',
  157. label: 'label',
  158. children: 'children'
  159. },//cascader 数据格式化
  160. branchId: '',
  161. classId: '',
  162. account: this.$route.query.account, // 财务唯一标识
  163. amountAll: {}, // 金额集合
  164. }
  165. },
  166. computed: {
  167. currentPage: {
  168. get () {
  169. return this.page
  170. },
  171. set (val) {
  172. this.$emit('update:page', val)
  173. }
  174. },
  175. },
  176. mounted() {
  177. if(this.account) {
  178. this.getBranches();
  179. this.getstudentList()
  180. }
  181. },
  182. methods: {
  183. handleCurrentChange (val) {
  184. this.page = val;
  185. // this.rows = pageSize;
  186. this.getstudentList();
  187. },
  188. // 获取选项卡
  189. getBranches () {
  190. getBranches().then(res => {
  191. if (res.code == 200) {
  192. let arr = [];
  193. res.data.map(item => {
  194. arr.push({
  195. value: item.branchId,
  196. label: item.branchName,
  197. children: []
  198. })
  199. })
  200. this.brancheList = arr
  201. }
  202. });
  203. },
  204. getstudentList (rows, callBack) {
  205. if(!this.account) {
  206. this.$message.error('您没有权限')
  207. return false
  208. }
  209. if(this.account != 'per' && this.account != 'com') {
  210. this.$message.error('您没有权限')
  211. return false
  212. }
  213. if(rows && typeof rows == 'number' ) {
  214. this.rows = rows
  215. } else {
  216. this.rows = 20
  217. }
  218. let startTime = '', endTime = ''
  219. if(this.paymentTime) {
  220. startTime = this.paymentTime[0]
  221. endTime = this.paymentTime[1]
  222. }
  223. let params = this.topForm
  224. orderListPage(qs.stringify({
  225. account: this.account,
  226. page: this.page,
  227. rows: this.rows,
  228. branchId: params.team,
  229. classId: params.instruments,
  230. type: params.money,
  231. startTime: startTime,
  232. endTime: endTime})).then(res => {
  233. let data = res.data
  234. this.tableList = data.rows;
  235. this.total = data.total;
  236. this.amountAll = {
  237. amount: data.amount,
  238. tuiFeeAmount: data.tuiFeeAmount,
  239. goodsFeeAmount: data.goodsFeeAmount,
  240. sdFeeAmount: data.sdFeeAmount,
  241. commissionAmount: data.commissionAmount
  242. }
  243. // 回调函数
  244. if(callBack && typeof callBack == 'function') {
  245. callBack()
  246. }
  247. })
  248. },
  249. resetStudentList () {
  250. this.branchId = "";
  251. this.classId = '';
  252. this.topForm.money = "";
  253. this.topForm.team = '';
  254. this.topForm.instruments = '';
  255. this.page = 1;
  256. this.getstudentList();
  257. },
  258. filterRemark (val) {
  259. let remark = val.remark ? val.remark : '';
  260. let sdName = val.sdName ? val.sdName : '';
  261. return remark + ' ' + sdName;
  262. },
  263. exportis () {
  264. // this.topForm.money = "";
  265. // this.topForm.team = '';
  266. // this.topForm.instruments = '';
  267. this.rows = 9999
  268. this.page = 1
  269. this.getstudentList(9999, () => {
  270. setTimeout(() => {
  271. this.method5('tableid');
  272. }, 100);
  273. })
  274. // this.method5('tableid');
  275. },
  276. // 导出
  277. getExplorer () {
  278. var explorer = window.navigator.userAgent;
  279. //ie
  280. if (explorer.indexOf("MSIE") >= 0) {
  281. return 'ie';
  282. }
  283. //firefox
  284. else if (explorer.indexOf("Firefox") >= 0) {
  285. return 'Firefox';
  286. }
  287. //Chrome
  288. else if (explorer.indexOf("Chrome") >= 0) {
  289. return 'Chrome';
  290. }
  291. //Opera
  292. else if (explorer.indexOf("Opera") >= 0) {
  293. return 'Opera';
  294. }
  295. //Safari
  296. else if (explorer.indexOf("Safari") >= 0) {
  297. return 'Safari';
  298. }
  299. },
  300. method5 (tableid) {
  301. if (this.getExplorer() == 'ie') {
  302. var curTbl = document.getElementById(tableid);
  303. var oXL = new ActiveXObject("Excel.Application");
  304. var oWB = oXL.Workbooks.Add();
  305. var xlsheet = oWB.Worksheets(1);
  306. var sel = document.body.createTextRange();
  307. sel.moveToElementText(curTbl);
  308. sel.select();
  309. sel.execCommand("Copy");
  310. xlsheet.Paste();
  311. oXL.Visible = true;
  312. try {
  313. var fname = oXL.Application.GetSaveAsFilename("哈哈哈.xls", "Excel Spreadsheets (*.xls), *.xls");
  314. } catch (e) {
  315. print("Nested catch caught " + e);
  316. } finally {
  317. oWB.SaveAs(fname);
  318. oWB.Close(savechanges = false);
  319. oXL.Quit();
  320. oXL = null;
  321. this.idTmr = window.setInterval("Cleanup();", 1);
  322. }
  323. }
  324. else {
  325. this.tableToExcel();
  326. }
  327. },
  328. Cleanup () {
  329. window.clearInterval(this.idTmr);
  330. this.CollectGarbage();
  331. },
  332. tableToExcel () {
  333. (function () {
  334. var uri = 'data:application/vnd.ms-excel;base64,',
  335. template = '<html><head><meta charset="UTF-8"></head><body><table>{table}</table></body></html>',
  336. base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) },
  337. format = function (s, c) {
  338. return s.replace(/{(\w+)}/g,
  339. function (m, p) { return c[p]; }) }
  340. // table name
  341. let table = document.getElementById('tableid')
  342. // || name
  343. var ctx = { worksheet: 'Worksheet', table: table.innerHTML }
  344. window.location.href = uri + base64(format(template, ctx))
  345. //
  346. // return function () {
  347. // }
  348. })()
  349. },
  350. // 多选框选项卡
  351. handleItemChange (val) {
  352. // 发请求 获取分部下的乐团
  353. if (!val) {
  354. return false
  355. }
  356. // getMusicTeams(qs.stringify({ branchId: val })).then(res => {
  357. // this.topForm.instruments = ''
  358. // if (res.code == 200) {
  359. // let arr = [];
  360. // res.data.rows.map(item => {
  361. // arr.push({
  362. // label: item.name,
  363. // value: item.id
  364. // })
  365. // })
  366. // this.instrumentList = arr
  367. // for (let item in this.brancheList) {
  368. // if (this.brancheList[item].value == val) {
  369. // this.brancheList[item].children = arr;
  370. // }
  371. // }
  372. // }
  373. // })
  374. },
  375. handleChange (val) {
  376. if (val) {
  377. this.branchId = val[0];
  378. this.classId = val[1];
  379. }
  380. },
  381. getSummaries(param) {
  382. const { columns, data } = param;
  383. const sums = [];
  384. columns.forEach((column, index) => {
  385. if (index === 0) {
  386. sums[index] = '总价';
  387. return;
  388. }
  389. if(index === 2 || index === 3 || index === 9 || index === 10) {
  390. sums[index] = 'N/A'
  391. return
  392. }
  393. const values = data.map(item => Number(item[column.property]));
  394. if (!values.every(value => isNaN(value))) {
  395. sums[index] = values.reduce((prev, curr) => {
  396. const value = Number(curr);
  397. let temp
  398. if (!isNaN(value)) {
  399. temp = parseFloat(prev) + parseFloat(curr);
  400. } else {
  401. temp = prev;
  402. }
  403. return parseFloat(temp).toFixed(2)
  404. }, 0);
  405. sums[index] += ' 元';
  406. } else {
  407. sums[index] = 'N/A';
  408. }
  409. });
  410. return sums;
  411. }
  412. }
  413. }
  414. </script>
  415. <style lang="scss">
  416. .container {
  417. padding: 30px;
  418. .paginationWrap {
  419. display: flex;
  420. flex-direction: row;
  421. justify-content: flex-end;
  422. }
  423. .pagination {
  424. margin-top: 20px;
  425. }
  426. }
  427. </style>