StatementsIndex.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. <!--
  2. * @Description: 财务管理 => 对账单
  3. * @Author: Rockery
  4. * @Date: 2021-07-28 15:14:06
  5. * @LastEditors: gcz
  6. * @LastEditTime: 2024-08-01 16:53:36
  7. * @FilePath: \great_webui\src\views\finance\Statements\StatementsIndex.vue
  8. * @Copyright: Copyright (c) 2016~2021 Rockery(1113269755@qq.com)
  9. -->
  10. <template>
  11. <div class="app-container app-container-scheduling">
  12. <div class="app-container-queryform" v-show="showSearch">
  13. <!-- 页面查询表单 Start -->
  14. <el-form :model="queryParams" ref="queryForm" :rules="rules" :inline="true" label-width="68px">
  15. <el-form-item label="订单号" prop="orderNo" v-if="queryShow.orderNo">
  16. <el-input
  17. v-model="queryParams.orderNo"
  18. placeholder="请输入订单号"
  19. clearable
  20. size="small"
  21. @keyup.enter.native="handleQuery"
  22. />
  23. <span @click="clearQuery('orderNo')" class="query_clear"><i class="el-icon-circle-close"></i></span>
  24. </el-form-item>
  25. <el-form-item label="支付单号" prop="trackId" v-if="queryShow.trackId">
  26. <el-input
  27. v-model="queryParams.trackId"
  28. placeholder="请输入支付单号"
  29. clearable
  30. size="small"
  31. @keyup.enter.native="handleQuery"
  32. />
  33. <span @click="clearQuery('trackId')" class="query_clear"><i class="el-icon-circle-close"></i></span>
  34. </el-form-item>
  35. <el-form-item label="购票渠道" prop="source" v-if="queryShow.source">
  36. <el-select v-model="queryParams.source" placeholder="请选择购票渠道" clearable>
  37. <el-option
  38. v-for="dict in dict.type.order_form_type"
  39. :key="dict.value"
  40. :label="dict.label"
  41. :value="dict.value"
  42. />
  43. </el-select>
  44. <span @click="clearQuery('source')" class="query_clear"><i class="el-icon-circle-close"></i></span>
  45. </el-form-item>
  46. <el-form-item label="支付方式" prop="payWay" v-if="queryShow.payWay">
  47. <el-select v-model="queryParams.payWay" placeholder="请选择支付方式" clearable>
  48. <el-option
  49. v-for="dict in dict.type.pay_way_type"
  50. :key="dict.value"
  51. :label="dict.label"
  52. :value="dict.value"
  53. />
  54. </el-select>
  55. <span @click="clearQuery('payWay')" class="query_clear"><i class="el-icon-circle-close"></i></span>
  56. </el-form-item>
  57. <el-form-item label="交易类型" prop="payType" v-if="queryShow.payType">
  58. <el-select v-model="queryParams.payType" placeholder="请选择交易类型" clearable>
  59. <el-option
  60. v-for="dict in dict.type.transaction_type"
  61. :key="dict.value"
  62. :label="dict.label"
  63. :value="dict.value"
  64. />
  65. </el-select>
  66. <span @click="clearQuery('payType')" class="query_clear"><i class="el-icon-circle-close"></i></span>
  67. </el-form-item>
  68. <el-form-item label="交易时间" v-if="queryShow.dateRange">
  69. <el-date-picker
  70. v-model="dateRange"
  71. size="small"
  72. style="width: 240px"
  73. value-format="yyyy-MM-dd HH:mm:ss"
  74. type="datetimerange"
  75. range-separator="-"
  76. start-placeholder="开始时间"
  77. end-placeholder="结束时间"
  78. ></el-date-picker>
  79. <span @click="clearQuery('dateRange')" class="query_clear"><i class="el-icon-circle-close"></i></span>
  80. </el-form-item>
  81. <el-form-item>
  82. <el-dropdown @command="openQuery">
  83. <el-button size="mini" type="primary" icon="el-icon-plus"></el-button>
  84. <el-dropdown-menu slot="dropdown">
  85. <el-dropdown-item command="orderNo">订单号</el-dropdown-item>
  86. <el-dropdown-item command="trackId">支付单号</el-dropdown-item>
  87. <el-dropdown-item command="source">购票渠道</el-dropdown-item>
  88. <el-dropdown-item command="payWay">支付方式</el-dropdown-item>
  89. <el-dropdown-item command="payType">交易类型</el-dropdown-item>
  90. <el-dropdown-item command="dateRange">交易时间</el-dropdown-item>
  91. </el-dropdown-menu>
  92. </el-dropdown>
  93. <el-button
  94. style="margin-left: 10px;"
  95. type="primary"
  96. icon="el-icon-search"
  97. size="mini"
  98. @click="handleQuery"
  99. >搜索</el-button
  100. >
  101. <el-button
  102. icon="el-icon-refresh"
  103. size="mini"
  104. @click="resetQuery"
  105. >重置</el-button
  106. >
  107. </el-form-item>
  108. <!-- <el-form-item>
  109. <el-button
  110. v-hasPermi="['financeMr:statements:query']"
  111. type="primary"
  112. icon="el-icon-search"
  113. size="mini"
  114. @click="handleQuery"
  115. >搜索</el-button
  116. >
  117. <el-button
  118. v-hasPermi="['financeMr:statements:reset']"
  119. icon="el-icon-refresh"
  120. size="mini"
  121. @click="resetQuery"
  122. >重置</el-button
  123. >
  124. </el-form-item> -->
  125. </el-form>
  126. <!-- 页面查询表单 End -->
  127. </div>
  128. <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
  129. <!-- 页面批量操作按钮 -->
  130. <el-row :gutter="10" class="mb8">
  131. <el-col :span="1.5">
  132. <div style="border: 1px solid #dfe4ed;padding: 3px;">
  133. <span style="color: #ff4949">请选择导出账单记录类型:</span>
  134. <el-switch
  135. v-model="exportType"
  136. inactive-color="#ffba00"
  137. active-color="#13ce66"
  138. inactive-text="运营方"
  139. active-text="银联"
  140. inactive-value="1"
  141. active-value="2"
  142. ></el-switch>
  143. </div>
  144. </el-col>
  145. <el-col :span="1.5">
  146. <el-button
  147. v-hasPermi="['financeMr:statements:export']"
  148. type="warning"
  149. plain
  150. icon="el-icon-download"
  151. size="mini"
  152. :disabled="tableDataList.length < 1"
  153. @click="handleExport"
  154. v-loading.fullscreen.lock="handleExportLoading"
  155. element-loading-text="正在拼命生成数据中..."
  156. element-loading-spinner="el-icon-loading"
  157. element-loading-background="rgba(0, 0, 0, 0.5)"
  158. >导出</el-button>
  159. </el-col>
  160. <right-toolbar :showSearch.sync="showSearch" @queryTable="initData"></right-toolbar>
  161. </el-row>
  162. <el-row :gutter="10">
  163. <el-col :span="24">
  164. <!-- 页面表格数据区域 Start -->
  165. <el-table
  166. v-loading="loading"
  167. ref="statementsTableRef"
  168. :data="tableDataList"
  169. border
  170. lazy
  171. :load="load"
  172. row-key="id"
  173. @sort-change="handleSortChang"
  174. :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
  175. class="cust-table"
  176. height="400px"
  177. >
  178. <el-table-column label="订单号" align="center" :show-overflow-tooltip="true" width="200">
  179. <template slot-scope="scope">
  180. <template v-if="!scope.row.hasOwnProperty('children')">
  181. <div
  182. class="statements-column-orderNo"
  183. @click="handleViewOrder(scope.row)"
  184. style="display: inline-block"
  185. >
  186. {{ scope.row.orderNo }}
  187. </div>
  188. </template>
  189. <template v-else>
  190. <div style="display: inline-block">{{ scope.row.orderNo }}</div>
  191. </template>
  192. </template>
  193. </el-table-column>
  194. <el-table-column label="支付单号" align="center" prop="trackId" :show-overflow-tooltip="true" />
  195. <el-table-column label="交易金额(元)" align="center" prop="payMoney" :show-overflow-tooltip="true" />
  196. <el-table-column label="手续费(元)" align="center" prop="proceMoney" :show-overflow-tooltip="true" />
  197. <el-table-column label="清算金额(元)" align="center" prop="clearMoney" :show-overflow-tooltip="true" />
  198. <el-table-column label="购票渠道" align="center" prop="source">
  199. <template slot-scope="scope">
  200. <dict-tag :options="dict.type.order_form_type" :value="scope.row.source"/>
  201. </template>
  202. </el-table-column>
  203. <el-table-column label="支付方式" align="center" prop="payWay">
  204. <template slot-scope="scope">
  205. <dict-tag :options="dict.type.pay_way_type" :value="scope.row.payWay"/>
  206. </template>
  207. </el-table-column>
  208. <el-table-column label="交易类型" align="center" prop="payType">
  209. <template slot-scope="scope">
  210. <dict-tag :options="dict.type.transaction_type" :value="scope.row.payType"/>
  211. </template>
  212. </el-table-column>
  213. <el-table-column label="交易时间" align="center" prop="payTime" :show-overflow-tooltip="true" />
  214. </el-table>
  215. <!-- 页面表格数据区域 End -->
  216. </el-col>
  217. <el-col :span="24">
  218. <!-- 表格右下角数据 -->
  219. <div class="fl statements-total">
  220. <!-- <div class="til">账单数据汇总:</div> -->
  221. <div class="summary" v-html="summary"></div>
  222. <!-- <div class="til">明细如下:</div>
  223. <div class="other-summary" v-for="(item,index) in otherSummary" :key="index" v-html="item"></div> -->
  224. </div>
  225. </el-col>
  226. <el-col v-show="total > 0" :span="24" class="mb20">
  227. <!-- 页面分页控件 -->
  228. <pagination
  229. :total="total"
  230. :page.sync="queryParams.pageNum"
  231. :limit.sync="queryParams.pageSize"
  232. @pagination="initData"
  233. />
  234. </el-col>
  235. </el-row>
  236. </div>
  237. <!-- 详情 -->
  238. <details-dia ref="detailsDia" @getList="getList"></details-dia>
  239. </div>
  240. </template>
  241. <script>
  242. import { listStatements, exportStatements, queryStatementsBillTotal } from '@/api/financeMr/Statements';
  243. // import { indoorParkList } from '@/api/ParkingPointMgr/IndoorMgr';
  244. import { exportExcel } from '@/utils/exportexcel';
  245. import detailsDia from "../../order/orderMr/dialog/details";
  246. export default {
  247. name: 'Statements',
  248. components: {
  249. detailsDia,
  250. 'parkingrecord-pagination-select': () => import('@/components/CustPaginationSelect') // 支持分页搜索功能的[el-select]下拉框
  251. },
  252. dicts: ['order_form_type', 'pay_way_type','transaction_type'],
  253. data() {
  254. return {
  255. // 遮罩层
  256. loading: true,
  257. // 显示搜索条件
  258. showSearch: true,
  259. // 购票渠道格式化
  260. sourceOptions: [],
  261. // 支付渠道格式化
  262. payWayOptions: [],
  263. // 交易类型格式化
  264. tranTypeOptions: [],
  265. // 交易日期范围
  266. dateRange: [],
  267. rules: {
  268. orderNo: [
  269. {
  270. pattern: /^[+]{0,1}(\d+)$/,
  271. message: '订单号必须为纯数字',
  272. trigger: 'blur'
  273. }
  274. ],
  275. // trackId: [
  276. // {
  277. // pattern: /^[+]{0,1}(\d+)$/,
  278. // message: '支付单号必须为纯数字',
  279. // trigger: 'blur'
  280. // }
  281. // ]
  282. },
  283. exportType: 1,
  284. exportTypeObj: {
  285. 1: '运营方账单记录',
  286. 2: '银联账单记录'
  287. },
  288. // 总条数
  289. total: 0,
  290. // 表格数据
  291. tableDataList: [],
  292. // 查询参数
  293. queryParams: {
  294. pageNum: 1,
  295. pageSize: 10,
  296. orderNo: undefined,
  297. trackId: undefined,
  298. payWay: undefined,
  299. payType: undefined,
  300. source: undefined,
  301. },
  302. queryShow: {
  303. orderNo: true,
  304. trackId: true,
  305. source: true,
  306. payWay: true,
  307. payType: false,
  308. dateRange: false,
  309. },
  310. oweTotalObj: {},
  311. // 导出数据状态
  312. handleExportLoading: false,
  313. summary:'',
  314. otherSummary:[],
  315. };
  316. },
  317. created() {
  318. this.initData();
  319. },
  320. methods: {
  321. /** 初始化数据 */
  322. async initData() {
  323. this.loading = true;
  324. // this.getRevenueReportOwetotal();
  325. this.getList();
  326. },
  327. /** 查询列表信息 */
  328. getList() {
  329. this.loading = true;
  330. listStatements(this.formatDateRange(this.queryParams, this.dateRange))
  331. .then((response) => {
  332. this.tableDataList = response?.data?.result?.rows|| [];
  333. this.total = response?.data?.result?.total ?? 0;
  334. this.summary = response?.data?.summary || '';
  335. this.otherSummary = response?.data?.otherSummary || [];
  336. this.loading = false;
  337. })
  338. .catch(() => {
  339. this.tableDataList = [];
  340. this.total = 0;
  341. this.loading = false;
  342. });
  343. },
  344. getRevenueReportOwetotal() {
  345. let { pageNum, pageSize, sortField, sortOrder, ...otherObj } = this.formatDateRange(
  346. this.queryParams,
  347. this.dateRange
  348. );
  349. queryStatementsBillTotal(otherObj).then((response) => {
  350. this.oweTotalObj = response?.data || {};
  351. });
  352. },
  353. /** 搜索按钮操作 */
  354. handleQuery() {
  355. this.$refs?.['queryForm']?.validate?.((valid) => {
  356. if (valid) {
  357. this.loading = true;
  358. this.$refs.statementsTableRef?.clearSort?.();
  359. this.queryParams = {
  360. ...this.queryParams,
  361. pageNum: 1,
  362. sortField: undefined,
  363. sortOrder: undefined,
  364. payBeginTime: undefined,
  365. payEndTime: undefined
  366. };
  367. // 初始化表格数据
  368. this.tableDataList = [];
  369. this.total = 0;
  370. this.$nextTick(() => {
  371. // 重新加载表格数据
  372. this.initData();
  373. });
  374. }
  375. });
  376. },
  377. /** 重置按钮操作 */
  378. resetQuery() {
  379. this.dateRange = [];
  380. this.resetForm('queryForm');
  381. this.handleQuery();
  382. },
  383. /** 导出按钮操作 */
  384. handleExport() {
  385. this.$confirm(`确定要导出“${this.exportTypeObj[this.exportType] || ''}”的数据吗?`, '提示', {
  386. confirmButtonText: '确定 ',
  387. cancelButtonText: '取消 ',
  388. type: 'warning'
  389. })
  390. .then(() => {
  391. // 开启导出遮护罩
  392. this.handleExportLoading = true;
  393. // 排除不需要的属性
  394. let { pageNum, pageSize, ...otherObj } = this.formatDateRange(this.queryParams, this.dateRange);
  395. let handleExportReq = { ...otherObj, exportType: this.exportType };
  396. // 发送导出请求
  397. exportStatements(handleExportReq)
  398. .then((response) => {
  399. exportExcel(response, this.exportTypeObj[this.exportType] || '', '.xlsx');
  400. // 关闭导出遮护罩
  401. this.handleExportLoading = false;
  402. })
  403. .catch(() => {
  404. this.$message.error('导出异常!');
  405. // 关闭导出遮护罩
  406. this.handleExportLoading = false;
  407. });
  408. })
  409. .catch(() => {
  410. this.$message.info('您已取消导出!');
  411. // 关闭导出遮护罩
  412. this.handleExportLoading = false;
  413. });
  414. },
  415. /**
  416. * 格式参数数据
  417. */
  418. formatDateRange(params, dateRange) {
  419. var search = params;
  420. if (null != dateRange && '' != dateRange) {
  421. search['payBeginTime'] = dateRange[0];
  422. search['payEndTime'] = dateRange[1];
  423. } else {
  424. search['payBeginTime'] = undefined;
  425. search['payEndTime'] = undefined;
  426. }
  427. return search;
  428. },
  429. /**
  430. * 当表格的排序条件发生变化的时候会触发该事件
  431. */
  432. handleSortChang({ column, prop, order }) {
  433. this.loading = true;
  434. this.queryParams = {
  435. ...this.queryParams,
  436. pageNum: 1,
  437. sortField: prop,
  438. sortOrder: order == 'descending' ? 'desc' : 'asc'
  439. };
  440. this.initData();
  441. },
  442. load(tree, treeNode, resolve) {
  443. console.log('tree',tree);
  444. resolve(tree.orderList);
  445. },
  446. /**
  447. * 查看原订单
  448. */
  449. handleViewOrder(row) {
  450. console.log('handleViewOrder row',row);
  451. this.$refs["detailsDia"].openDialog("详情", row);
  452. return
  453. // orderNo不存在
  454. if (!row?.orderNo) return;
  455. if (row.businessType != '2') {
  456. // 保存当前路由信息
  457. this.$store.dispatch('PushCurrRouteInfo', {
  458. name: 'OwnerinfoBillingDetails',
  459. metaTitle: `查看原订单【${row?.orderNo}】`,
  460. key: `OwnerinfoBillingDetails_${row?.orderNo}`
  461. });
  462. // 跳转详情页面
  463. if (Number(row.orderType) === 1) {
  464. this.$router.push(`/ownerinfobilling/details/${row?.orderNo}&type=parking`);
  465. } else {
  466. this.$router.push(`/ownerinfobilling/details/${row?.orderNo}`);
  467. }
  468. } else {
  469. // 保存当前路由信息
  470. this.$store.dispatch('PushCurrRouteInfo', {
  471. name: 'MonthlyVehicleDetails',
  472. metaTitle: `查看原订单【${row?.orderNo}】`,
  473. key: `MonthlyVehicleDetails_${row?.orderNo}`
  474. });
  475. // 跳转详情页面
  476. this.$router.push(`/monthlyvehicle/details/${row?.orderNo}`);
  477. }
  478. },
  479. clearQuery(key) {
  480. this.$set(this.queryShow,key,false)
  481. this.$set(this.queryParams,key,'')
  482. if(key == 'performDate') {
  483. this.$set(this.queryParams,'performTimeId','')
  484. }
  485. },
  486. openQuery(key) {
  487. this.$set(this.queryShow,key,true)
  488. }
  489. }
  490. };
  491. </script>
  492. <style lang="scss" scoped>
  493. ::v-deep {
  494. .pagination-container {
  495. text-align: center;
  496. .el-pagination {
  497. position: initial;
  498. }
  499. }
  500. }
  501. .cust-table {
  502. .statements-column-orderNo {
  503. color: #337ab7;
  504. text-decoration: none;
  505. cursor: pointer;
  506. &:hover {
  507. color: #409eff;
  508. text-decoration: underline;
  509. }
  510. }
  511. }
  512. .statements-total {
  513. margin-top: 15px;
  514. .til{
  515. font-weight: bold;
  516. margin-bottom: 2px;
  517. margin-top: 10px;
  518. }
  519. .summary{
  520. ::v-deep span{
  521. color: blue;
  522. }
  523. }
  524. .other-summary{
  525. ::v-deep span{
  526. color: #f5bb00;
  527. }
  528. }
  529. }
  530. .app-container-scheduling ::v-deep .el-select__tags {
  531. flex-wrap: inherit !important;
  532. overflow-x: auto !important;
  533. }
  534. .app-container-scheduling ::v-deep .el-form-item__content {
  535. position: relative;
  536. }
  537. .app-container-scheduling ::v-deep .el-form-item__content .query_clear{
  538. position: absolute;
  539. top: -15px;
  540. right: -10px;
  541. display: none;
  542. cursor: pointer;
  543. z-index: 99;
  544. }
  545. .app-container-scheduling ::v-deep .el-form-item__content:hover .query_clear {
  546. display: block;
  547. }
  548. </style>