index.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('com-export-dialog');
  4. ?>
  5. <div id="app" v-cloak>
  6. <el-card shadow="never" style="border:0;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  7. <div slot="header">
  8. <div>
  9. <span>交易列表</span>
  10. <com-export-dialog style="float: right; margin-top: -5px;" :field_list='export_list' :action_url="export_url" :params="searchData"></com-export-dialog>
  11. </div>
  12. </div>
  13. <el-alert title="假设:用户提现10000元;" type="warning" :closable="false" style="margin-bottom: 10px; display: none;" id="alert-box">
  14. 1、首先平台需要收取服务费6%(平台服务费 = 10000 * 6% = 600);<br>
  15. 2、公司支付宝资金划拨到记账本金额,记账本会打款给用户(10000 - 平台服务费 = 9400[用户所得工资]);<br>
  16. 3、支付给兼职猫服务费[从公司支付宝账户支付](9400 * 6% = 576);<br>
  17. 4、实际总支出(9400 + 576 = 9976);<br>
  18. 5、平台利润(10000 - 9976 = 24);
  19. </el-alert>
  20. <!-- 统计 -->
  21. <el-card class="box-card" style="margin-bottom: 10px;">
  22. <div slot="header" class="clearfix">
  23. <span>统计</span>
  24. <el-button style="float: right; padding: 3px 0" type="text" @click="handleRule">发放规则</el-button>
  25. </div>
  26. <div class="headBox">
  27. <div class="headItem" >
  28. <div>
  29. <i class="el-icon-coin" style="font-size: 50px;margin-right: 10px;"></i>
  30. </div>
  31. <div>
  32. <div>
  33. <label slot="label">总佣金
  34. <el-tooltip class="item" effect="dark"
  35. content="会员申请提现的总金额"
  36. placement="top-start">
  37. <i class="el-icon-info"></i>
  38. </el-tooltip>
  39. </label>
  40. </div>
  41. <div style="font-weight: bold;font-size: 25px;">{{ statistic.withdraw_total }}</div>
  42. </div>
  43. </div>
  44. <div class="headItem">
  45. <div>
  46. <i class="el-icon-coin" style="font-size: 50px;margin-right: 10px;"></i>
  47. </div>
  48. <div>
  49. <div>
  50. <label slot="label">实际发放佣金
  51. <el-tooltip placement="top">
  52. <div slot="content">
  53. 实际发放佣金 = 总佣金 - 总佣金 * N%<br/>
  54. N% = 平台设置的手续费比例(“设置”-“资产”-“收益提现设置”:“提现手续费”进行设置)
  55. </div>
  56. <i class="el-icon-info"></i>
  57. </el-tooltip>
  58. </label>
  59. </div>
  60. <div style="font-weight: bold;font-size: 25px;">{{ statistic.payment_total }}</div>
  61. </div>
  62. </div>
  63. <div class="headItem" style="background-color: #F59C6C;">
  64. <div>
  65. <i class="el-icon-coin" style="font-size: 50px;margin-right: 10px;"></i>
  66. </div>
  67. <div>
  68. <div>
  69. <label slot="label">平台利润
  70. <el-tooltip class="item" effect="dark"
  71. content="平台利润 = 总佣金 - 实际发放佣金 - 应发税费总额"
  72. placement="top">
  73. <i class="el-icon-info"></i>
  74. </el-tooltip>
  75. </label>
  76. </div>
  77. <div style="font-weight: bold;font-size: 25px;">{{ (statistic.withdraw_total - statistic.payment_total - statistic.payment_fee_total).toFixed(2) }}</div>
  78. </div>
  79. </div>
  80. <div class="headItem" style="background-color: #1ABC9C;">
  81. <div>
  82. <i class="el-icon-coin" style="font-size: 50px;margin-right: 10px;"></i>
  83. </div>
  84. <div>
  85. <div>
  86. <label slot="label">应发税费总额
  87. <el-tooltip class="item" effect="dark"
  88. content="应发税费总额 = 实际发放佣金 * 6%(此比例为与第三方签约的比例)"
  89. placement="top">
  90. <i class="el-icon-info"></i>
  91. </el-tooltip>
  92. </label>
  93. </div>
  94. <div style="font-weight: bold;font-size: 25px;">{{ statistic.payment_fee_total }}</div>
  95. </div>
  96. </div>
  97. <div class="headItem" style="background-color: #6C9EF5;">
  98. <div>
  99. <i class="el-icon-coin" style="font-size: 50px;margin-right: 10px;"></i>
  100. </div>
  101. <div>
  102. <div>
  103. <label slot="label">实际发放税费总额
  104. <el-tooltip placement="top">
  105. <div slot="content">
  106. 实际发放税费总额 = 实际上已经支付给第三方公司的税费<br/>
  107. 注意:理论上“实际发放税费总额”应该等于“应发税费总额”,但有可能因为其他原因导致税费支付失败(如:支付宝限额)
  108. </div>
  109. <i class="el-icon-info"></i>
  110. </el-tooltip>
  111. </label>
  112. </div>
  113. <div style="font-weight: bold;font-size: 25px;">{{ statistic.fee_total }}</div>
  114. </div>
  115. </div>
  116. </div>
  117. </el-card>
  118. <!-- 统计 -->
  119. <div class="table-body">
  120. <el-form :inline="true" :model="searchData" class="demo-form-inline">
  121. <el-col :span="24">
  122. <el-form-item size="small" label="批次号">
  123. <el-input v-model="searchData.batch_num" placeholder="批次号"></el-input>
  124. </el-form-item>
  125. <el-form-item size="small" label="订单号">
  126. <el-input v-model="searchData.order_sn" placeholder="订单号"></el-input>
  127. </el-form-item>
  128. <el-form-item size="small" label="收款人">
  129. <el-input v-model="searchData.name" placeholder="收款人"></el-input>
  130. </el-form-item>
  131. <el-form-item size="small" label="收款账号">
  132. <el-input v-model="searchData.mobile" placeholder="收款账号"></el-input>
  133. </el-form-item>
  134. <br>
  135. <el-form-item label="时间筛选">
  136. <el-date-picker
  137. size="small"
  138. v-model="searchData.date"
  139. type="datetimerange"
  140. range-separator="至"
  141. start-placeholder="开始日期"
  142. end-placeholder="结束日期"
  143. format="yyyy-MM-dd"
  144. value-format="yyyy-MM-dd"
  145. >
  146. </el-date-picker>
  147. </el-form-item>
  148. <el-form-item size="small" label="状态">
  149. <el-select v-model="searchData.status" class="select">
  150. <el-option v-for="item in statusArr" :label="item.label" :value="item.value" :key="item.value"></el-option>
  151. </el-select>
  152. </el-form-item>
  153. <el-button type="primary" size="small" @click="onSubmit">查询</el-button>
  154. <el-button size="small" @click="resetForm">重置</el-button>
  155. </el-col>
  156. <!-- <el-form-item>
  157. <el-button type="success" v-loading="addLoading" size="small" @click="add()">添加交易</el-button>
  158. <el-button type="success" v-loading="addLoading" size="small" @click="addBatch()">批量汇款</el-button>
  159. </el-form-item> -->
  160. </el-form>
  161. <!-- 订单信息 -->
  162. <template>
  163. <el-table ref="multipleTable" :data="list" @selection-change="handleSelectionChange" v-loading="addLoading">
  164. <!-- 空数据 -->
  165. <template slot="empty">
  166. <el-empty description="暂无交易数据"></el-empty>
  167. </template>
  168. <el-table-column type="selection"></el-table-column>
  169. <el-table-column prop="title" align="center" label="标题"></el-table-column>
  170. <el-table-column prop="batch_num" align="center" label="批次号/提现订单号">
  171. <template slot-scope="scope">
  172. {{ scope.row.batch_num }}
  173. <br>
  174. {{
  175. scope.row.withdraw
  176. ? scope.row.withdraw.order_no
  177. : '--'
  178. }}
  179. </template>
  180. </el-table-column>
  181. <el-table-column prop="account" align="center" label="记账方">
  182. <template slot-scope="scope">
  183. {{
  184. scope.row.account
  185. ? scope.row.account.alipay_logon_id
  186. : '--'
  187. }}
  188. </template>
  189. </el-table-column>
  190. <el-table-column prop="name" align="center" label="收款人"></el-table-column>
  191. <el-table-column prop="mobile" align="center" label="收款账号"></el-table-column>
  192. <el-table-column prop="amount" align="center" label="打款金额"></el-table-column>
  193. <el-table-column prop="pay_fee" align="center" label="手续费"></el-table-column>
  194. <el-table-column prop="created_at" align="center" label="创建/修改时间">
  195. <template slot-scope="scope">
  196. {{ scope.row.created_at|dateTimeFormat('Y-m-d H:i:s') }}<br>
  197. {{ scope.row.updated_at|dateTimeFormat('Y-m-d H:i:s') }}
  198. </template>
  199. </el-table-column>
  200. <el-table-column prop="status_text" align="center" label="状态"></el-table-column>
  201. <el-table-column prop="account_type" align="center" label="资金类型">
  202. <template slot-scope="scope">
  203. <span v-if="scope.row.account_type == 1">打款</span>
  204. <span v-if="scope.row.account_type == 2">出款</span>
  205. </template>
  206. </el-table-column>
  207. <el-table-column prop="type_text" align="center" label="订单类型"></el-table-column>
  208. <el-table-column prop="error" align="center" label="错误信息"></el-table-column>
  209. <el-table-column prop="right_btn" label="操作" align="center">
  210. <template slot-scope="scope">
  211. <el-button v-loading="addLoading" size="mini" @click="fee(scope.row.batch_num)">手续费详情</el-button>
  212. <!-- <el-button @click="trans(scope.row.id)" :disabled="transLoading" v-loading="transLoading" type="text" size="small" v-if="scope.row.type == 1 && scope.row.status == 0">确认打款</el-button> -->
  213. <!-- <el-button @click="trans(scope.row.id)" :disabled="true" v-loading="transLoading" type="text" size="small" v-if="scope.row.type == 2 && scope.row.status == 0">确认打款</el-button> -->
  214. <!-- <el-button type="text" size="small" :disabled="true" v-if="scope.row.status == 2">已打款</el-button> -->
  215. </template>
  216. </el-table-column>
  217. </el-table>
  218. </template>
  219. <el-dialog
  220. title="详情"
  221. :visible.sync="dialogVisible"
  222. width="30%"
  223. >
  224. <el-row>
  225. <el-col :span="22">
  226. <el-form ref="feeForm" :model="feeForm" label-width="120px">
  227. <el-form-item label="订单号">
  228. <el-input v-model="feeForm.order_sn" :disabled="true"></el-input>
  229. </el-form-item>
  230. <el-form-item label="收款方名称">
  231. <el-input v-model="feeForm.name" :disabled="true"></el-input>
  232. </el-form-item>
  233. <el-form-item label="收款方账号">
  234. <el-input v-model="feeForm.mobile" :disabled="true"></el-input>
  235. </el-form-item>
  236. <el-form-item label="手续费">
  237. <el-input v-model="feeForm.amount" :disabled="true"></el-input>
  238. </el-form-item>
  239. <el-form-item label="状态">
  240. <!-- <el-input v-model="feeForm.status" :disabled="true"></el-input> -->
  241. <el-select v-model="feeForm.status" :disabled="true">
  242. <el-option label="打款失败" :value="-1"></el-option>
  243. <el-option label="打款失败" :value="1"></el-option>
  244. <el-option label="打款成功" :value="5"></el-option>
  245. </el-select>
  246. </el-form-item>
  247. </el-form>
  248. </el-col>
  249. </el-row>
  250. <span slot="footer" class="dialog-footer">
  251. <el-button type="primary" @click="dialogVisible = false">关闭</el-button>
  252. </span>
  253. </el-dialog>
  254. <!-- 分页 -->
  255. <el-row type="flex" class="page" justify="end">
  256. <el-pagination @current-change="pagination" background layout="prev, pager, next" :page-count="pageCount" v-if="list"></el-pagination>
  257. </el-row>
  258. </div>
  259. </el-card>
  260. </div>
  261. <script>
  262. const app = new Vue({
  263. el: '#app',
  264. data() {
  265. return {
  266. searchData: {
  267. status : '',
  268. title : '',
  269. batch_num : '',
  270. order_sn : '',
  271. name : '',
  272. mobile : '',
  273. start_time : '',
  274. end_time : '',
  275. date : '',
  276. },
  277. list: [],
  278. pageCount: 0,
  279. page: 1,
  280. currentPage: null,
  281. listLoading: false,
  282. btnLoading: false,
  283. checked: false,
  284. addLoading: false,
  285. addVisible: false,
  286. transaction: {}, // 交易数据
  287. selectOrder: [],
  288. transLoading: false,
  289. statistic: {
  290. payment_total: 0,// 出款成功总额
  291. payment_fee_total: 0,// 应发服务费总额
  292. fee_total: 0,// 实发服务总额
  293. withdraw_total: 0,// 总提现金额
  294. },
  295. dialogVisible: false,
  296. feeForm: {},
  297. export_list: {},
  298. export_url: 'avoid-tax/order/index',
  299. alertBox: false,
  300. statusArr: [
  301. {
  302. value: -1,
  303. label: '打款失败',
  304. },
  305. {
  306. value: 1,
  307. label: '待提交审核',
  308. },
  309. {
  310. value: 2,
  311. label: '税方审核中',
  312. },
  313. {
  314. value: 3,
  315. label: '税方审核成功',
  316. },
  317. {
  318. value: 4,
  319. label: '待出款',
  320. },
  321. {
  322. value: 5,
  323. label: '出款成功',
  324. },
  325. ]
  326. };
  327. },
  328. methods: {
  329. resetForm() {
  330. this.searchData = {
  331. status : '',
  332. title : '',
  333. batch_num : '',
  334. order_sn : '',
  335. name : '',
  336. mobile : '',
  337. start_time : '',
  338. end_time : '',
  339. date : '',
  340. }
  341. },
  342. handleSelectionChange(val) {
  343. let ids = []
  344. val.forEach((item) => {
  345. ids.push(item.id)
  346. })
  347. this.selectOrder = ids
  348. },
  349. // 全选
  350. allSelect() {
  351. if (this.checked) {
  352. this.goods_list.forEach(function(item, index) {
  353. if (!item.storage) {
  354. item.is_select = true
  355. }
  356. })
  357. } else {
  358. this.goods_list.forEach(function(item, index) {
  359. item.is_select = false
  360. })
  361. }
  362. },
  363. //搜索
  364. onSubmit() {
  365. this.page = 1
  366. this.getList()
  367. },
  368. pagination(currentPage) {
  369. this.page = currentPage
  370. this.getList()
  371. },
  372. // 获取列表
  373. getList() {
  374. this.listLoading = true;
  375. var param = {
  376. r: 'avoid-tax/order/index',
  377. page: this.page,
  378. limit: 20
  379. }
  380. Object.assign(param, param, this.searchData)
  381. request({
  382. params: param,
  383. }).then(e => {
  384. if (e.data.code === 0) {
  385. this.statistic = e.data.data.statistic
  386. this.export_list = e.data.data.export_list;
  387. this.list = e.data.data.list
  388. this.pageCount = e.data.data.page_count
  389. this.currentPage = e.data.data.pagination.current_page
  390. } else {
  391. this.$message.error(e.data.msg)
  392. }
  393. this.listLoading = false
  394. }).catch(e => {
  395. this.listLoading = false
  396. })
  397. },
  398. // 弹出交易界面
  399. add() {
  400. navigateTo({
  401. r: 'avoid-tax/order/add',
  402. })
  403. },
  404. // trans
  405. trans (id) {
  406. this.transLoading = true;
  407. request({
  408. params: {
  409. r: 'avoid-tax/order/trans',
  410. id: id,
  411. }
  412. }).then(e => {
  413. if (e.data.code === 0) {
  414. this.$message.success('打款成功')
  415. setTimeout(() => {
  416. this.getList()
  417. }, 1000)
  418. } else {
  419. this.$message.error(e.data.msg)
  420. }
  421. this.transLoading = false
  422. }).catch(e => {
  423. this.transLoading = false
  424. })
  425. },
  426. // 批量汇款
  427. addBatch () {
  428. if(this.selectOrder.length <= 0){
  429. this.$message.error("请选择记录")
  430. return
  431. }
  432. this.transLoading = true;
  433. request({
  434. method: 'post',
  435. params: {
  436. r: 'avoid-tax/order/batch-trans',
  437. },
  438. data: {
  439. ids: this.selectOrder,
  440. }
  441. }).then(e => {
  442. if (e.data.code === 0) {
  443. this.$message.success('添加批量打款成功 后台等待打款中~')
  444. } else {
  445. this.$message.error(e.data.msg)
  446. }
  447. this.transLoading = false
  448. }).catch(e => {
  449. this.transLoading = false
  450. })
  451. },
  452. /**
  453. * 手续费详情
  454. */
  455. fee(num) {
  456. this.dialogVisible = true
  457. this.feeForm = {}
  458. request({
  459. params: {
  460. r: 'avoid-tax/order/fee',
  461. num: num
  462. },
  463. }).then(e => {
  464. if (e.data.code === 0) {
  465. this.feeForm = e.data.data
  466. } else {
  467. this.$message.error(e.data.msg)
  468. }
  469. this.listLoading = false
  470. }).catch(e => {
  471. this.listLoading = false
  472. })
  473. },
  474. handleRule() {
  475. if (this.alertBox == false) {
  476. $("#alert-box").show("slow");
  477. this.alertBox = true;
  478. } else {
  479. $("#alert-box").hide("slow");
  480. this.alertBox = false;
  481. }
  482. }
  483. },
  484. mounted: function() {
  485. this.page = getQuery('page') ? getQuery('page') : 1
  486. this.getList()
  487. }
  488. });
  489. </script>
  490. <style>
  491. .add-body {
  492. padding: 10px 20px;
  493. }
  494. .page {
  495. padding: 20px 0;
  496. }
  497. /*统计样式*/
  498. .headBox {
  499. display: flex;
  500. flex-wrap: wrap;
  501. /*margin-bottom: 10px;*/
  502. color: #fff;
  503. }
  504. .headItem {
  505. width: 16%;
  506. margin:0 0.5%;
  507. height: 120px;
  508. border-radius: 10px;
  509. background-color: #F56C6C;
  510. /*margin-right: 20px;*/
  511. margin-bottom: 14px;
  512. display: flex;
  513. align-items: center;
  514. justify-content: center;
  515. }
  516. </style>