wait_expend.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. <template>
  2. <div v-if="jobData && packageData && hireData">
  3. <!-- <div-->
  4. <!-- class="header"-->
  5. <!-- >云端托管:{{jobData.sumJob.totalAmount/100}}元,整包托管:{{packageData.sumPackage.totalAmount/100}}元,雇佣托管:{{hireData.sumHire.totalAmount/100 || 0}}元</div>-->
  6. <div
  7. class="header"
  8. >全站待支出总金额{{ ((jobData.sumJob.totalAmount/100) + (packageData.sumPackage.totalAmount/100)+(hireData.sumHire.totalAmount/100 || 0)+(frozenCoins * 1) +(balanceTotal/100)+(incomeTotal/100)).toFixed(2)}}元</div>
  9. <el-tabs v-model="activeName" type="border-card" @tab-click="handleClick">
  10. <el-tab-pane label="云端" name="job">
  11. <div
  12. class="tab-header"
  13. >云端项目待支出总额{{jobData.sumJob.totalAmount/100}}元,共{{jobData.sumJob.totalNum}}笔</div>
  14. <div style="text-align: right;margin-bottom: 10px">
  15. <el-button @click="exportZhichuList(9)" class="export-excel" type="primary">导出报表</el-button>
  16. </div>
  17. <div class="tab-content">
  18. <el-table :data="jobData.orders" border :stripe="true">
  19. <el-table-column prop="product_title" label="订单名称" width="150" />
  20. <el-table-column prop="user_info.nickname" label="用户" />
  21. <el-table-column prop="real_amount_yuan" label="实际金额" />
  22. <el-table-column prop="real_amount" label="收支类型">
  23. <template slot-scope="scope">
  24. <span>{{parseInt(scope.row.real_amount_yuan)>=0?"收入":"支出"}}</span>
  25. </template>
  26. </el-table-column>
  27. <el-table-column prop="channel_name" label="支付方式" />
  28. <el-table-column prop="order_state_name" label="订单状态" />
  29. <el-table-column label="创建时间">
  30. <template slot-scope="scope">
  31. <span>{{formatDate(scope.row.created_at)}}</span>
  32. </template>
  33. </el-table-column>
  34. <el-table-column label="到账时间">
  35. <template slot-scope="scope">
  36. <span>{{formatDate(scope.row.pay_time)}}</span>
  37. </template>
  38. </el-table-column>
  39. <el-table-column label="订单编号">
  40. <template slot-scope="scope">
  41. <nuxt-link
  42. target="_blank"
  43. :to="{path:'/main/orders_detail?id='+scope.row.order_no}"
  44. >{{scope.row.order_no}}</nuxt-link>
  45. </template>
  46. </el-table-column>
  47. <el-table-column prop="out_order_id" label="支付编号" />
  48. <el-table-column prop="product_type_name" label="订单类型" />
  49. <el-table-column prop="order_type_name" label="交易类型" />
  50. <el-table-column label="关联项目">
  51. <template slot-scope="scope">
  52. <a
  53. :href="scope.row.related_project.url?scope.row.related_project.url:'#'"
  54. target="_blank"
  55. >
  56. <span
  57. class="lblue"
  58. >{{scope.row.related_project.name?scope.row.related_project.name:"--"}}</span>
  59. </a>
  60. </template>
  61. </el-table-column>
  62. <el-table-column label="人工">
  63. <template slot-scope="scope">
  64. <span v-if="scope.row.operator_info.nickname">{{scope.row.operator_info.nickname}}</span>
  65. <span>({{scope.row.operator_uid}})</span>
  66. </template>
  67. </el-table-column>
  68. </el-table>
  69. </div>
  70. <el-pagination
  71. class="order-footer"
  72. background
  73. layout="prev, pager, next"
  74. :page-size="10"
  75. :total="Number(jobData.sumJob.totalNum)"
  76. @current-change="handleJobCurrentChange"
  77. />
  78. </el-tab-pane>
  79. <el-tab-pane label="整包" name="package">
  80. <div
  81. class="tab-header"
  82. >整包项目待支出总额{{packageData.sumPackage.totalAmount/100}}元,共{{packageData.sumPackage.totalNum}}笔</div>
  83. <div style="text-align: right;margin-bottom: 10px">
  84. <el-button @click="exportZhichuList(2)" class="export-excel" type="primary">导出报表</el-button>
  85. </div>
  86. <div class="tab-content">
  87. <el-table :data="packageData.orders" border :stripe="true">
  88. <el-table-column prop="product_title" label="订单名称" width="150" />
  89. <el-table-column prop="user_info.nickname" label="用户" />
  90. <el-table-column prop="real_amount_yuan" label="实际金额" />
  91. <el-table-column prop="real_amount" label="收支类型">
  92. <template slot-scope="scope">
  93. <span>{{parseInt(scope.row.real_amount_yuan)>=0?"收入":"支出"}}</span>
  94. </template>
  95. </el-table-column>
  96. <el-table-column prop="channel_name" label="支付方式" />
  97. <el-table-column prop="order_state_name" label="订单状态" />
  98. <el-table-column label="创建时间">
  99. <template slot-scope="scope">
  100. <span>{{formatDate(scope.row.created_at)}}</span>
  101. </template>
  102. </el-table-column>
  103. <el-table-column label="到账时间">
  104. <template slot-scope="scope">
  105. <span>{{formatDate(scope.row.pay_time)}}</span>
  106. </template>
  107. </el-table-column>
  108. <el-table-column label="订单编号">
  109. <template slot-scope="scope">
  110. <nuxt-link
  111. target="_blank"
  112. :to="{path:'/main/orders_detail?id='+scope.row.order_no}"
  113. >{{scope.row.order_no}}</nuxt-link>
  114. </template>
  115. </el-table-column>
  116. <el-table-column prop="out_order_id" label="支付编号" />
  117. <el-table-column prop="product_type_name" label="订单类型" />
  118. <el-table-column prop="order_type_name" label="交易类型" />
  119. <el-table-column label="关联项目">
  120. <template slot-scope="scope">
  121. <a
  122. :href="scope.row.related_project.url?scope.row.related_project.url:'#'"
  123. target="_blank"
  124. >
  125. <span
  126. class="lblue"
  127. >{{scope.row.related_project.name?scope.row.related_project.name:"--"}}</span>
  128. </a>
  129. </template>
  130. </el-table-column>
  131. <el-table-column label="人工">
  132. <template slot-scope="scope">
  133. <span v-if="scope.row.operator_info.nickname">{{scope.row.operator_info.nickname}}</span>
  134. <span>({{scope.row.operator_uid}})</span>
  135. </template>
  136. </el-table-column>
  137. </el-table>
  138. </div>
  139. <el-pagination
  140. class="order-footer"
  141. background
  142. layout="prev, pager, next"
  143. :page-size="10"
  144. :total="Number(packageData.sumPackage.totalNum)"
  145. @current-change="handlePackageCurrentChange"
  146. />
  147. </el-tab-pane>
  148. <el-tab-pane label="雇佣" name="hire">
  149. <div
  150. class="tab-header"
  151. >整包项目待支出总额{{hireData.sumHire.totalAmount/100}}元,共{{hireData.sumHire.totalNum}}笔</div>
  152. <div style="text-align: right;margin-bottom: 10px">
  153. <el-button @click="exportZhichuList(4)" class="export-excel" type="primary">导出报表</el-button>
  154. </div>
  155. <div class="tab-content">
  156. <el-table :data="hireData.orders" border :stripe="true">
  157. <el-table-column prop="product_title" label="订单名称" width="150" />
  158. <el-table-column prop="user_info.nickname" label="用户" />
  159. <el-table-column prop="real_amount_yuan" label="实际金额" />
  160. <el-table-column prop="real_amount" label="收支类型">
  161. <template slot-scope="scope">
  162. <span>{{parseInt(scope.row.real_amount)>=0?"收入":"支出"}}</span>
  163. </template>
  164. </el-table-column>
  165. <el-table-column prop="channel_name" label="支付方式" />
  166. <el-table-column prop="order_state_name" label="订单状态" />
  167. <el-table-column label="创建时间">
  168. <template slot-scope="scope">
  169. <span>{{formatDate(scope.row.created_at)}}</span>
  170. </template>
  171. </el-table-column>
  172. <el-table-column label="到账时间">
  173. <template slot-scope="scope">
  174. <span>{{formatDate(scope.row.pay_time)}}</span>
  175. </template>
  176. </el-table-column>
  177. <el-table-column label="订单编号">
  178. <template slot-scope="scope">
  179. <nuxt-link
  180. target="_blank"
  181. :to="{path:'/main/orders_detail?id='+scope.row.order_no}"
  182. >{{scope.row.order_no}}</nuxt-link>
  183. </template>
  184. </el-table-column>
  185. <el-table-column prop="out_order_id" label="支付编号" />
  186. <el-table-column prop="product_type_name" label="订单类型" />
  187. <el-table-column prop="order_type_name" label="交易类型" />
  188. <el-table-column label="关联项目">
  189. <template slot-scope="scope">
  190. <a
  191. :href="scope.row.related_project.url?scope.row.related_project.url:'#'"
  192. target="_blank"
  193. >
  194. <span
  195. class="lblue"
  196. >{{scope.row.related_project.name?scope.row.related_project.name:"--"}}</span>
  197. </a>
  198. </template>
  199. </el-table-column>
  200. <el-table-column label="人工">
  201. <template slot-scope="scope">
  202. <span v-if="scope.row.operator_info.nickname">{{scope.row.operator_info.nickname}}</span>
  203. <span>({{scope.row.operator_uid}})</span>
  204. </template>
  205. </el-table-column>
  206. </el-table>
  207. </div>
  208. <el-pagination
  209. class="order-footer"
  210. background
  211. layout="prev, pager, next"
  212. :page-size="10"
  213. :total="Number(hireData.sumHire.totalNum)"
  214. @current-change="handleHireCurrentChange"
  215. />
  216. </el-tab-pane>
  217. <el-tab-pane label="待解冻" name="frozen">
  218. <div
  219. class="tab-header"
  220. >用户冻结账户待解冻余额总额{{frozenCoins}}元,共{{waitUnfrozenCount}}笔</div>
  221. <div style="text-align: right;margin-bottom: 10px">
  222. <el-button @click="exportFrozenList" class="export-excel" type="primary">导出报表</el-button>
  223. </div>
  224. <div class="tab-content">
  225. <el-table :data="frozenData" border style="width: 100%">
  226. <el-table-column label="项目名称">
  227. <template slot-scope="scope">
  228. <!-- @click="clickDev(scope.row.uid)" -->
  229. <span class="lblue point">
  230. <a :href="scope.row.url" target="_blank">{{scope.row.name}}</a>
  231. </span>
  232. </template>
  233. </el-table-column>
  234. <el-table-column prop="name" label="用户">
  235. <template slot-scope="scope">
  236. <span class="lblue point">
  237. <a
  238. :href="scope.row.user_url"
  239. target="_blank"
  240. >{{scope.row.nickname}}({{scope.row.uid}})</a>
  241. </span>
  242. </template>
  243. </el-table-column>
  244. <el-table-column prop="name" label="关联订单ID">
  245. <template slot-scope="scope">
  246. <span>{{scope.row.order_no}}</span>
  247. </template>
  248. </el-table-column>
  249. <el-table-column prop="name" label="类型">
  250. <template slot-scope="scope">
  251. <span>{{scope.row.target_type_name}}</span>
  252. </template>
  253. </el-table-column>
  254. <el-table-column prop="name" label="冻结金额">
  255. <template slot-scope="scope">
  256. <span>{{scope.row.coins}}</span>
  257. </template>
  258. </el-table-column>
  259. <el-table-column prop="name" label="冻结方式">
  260. <template slot-scope="scope">
  261. <span>{{scope.row.end_time_type_name}}</span>
  262. </template>
  263. </el-table-column>
  264. <el-table-column prop="name" label="创建日期">
  265. <template slot-scope="scope">
  266. <span>{{scope.row.create_time}}</span>
  267. </template>
  268. </el-table-column>
  269. <el-table-column prop="name" label="解冻日期">
  270. <template slot-scope="scope">
  271. <span>{{scope.row.end_time}}</span>
  272. </template>
  273. </el-table-column>
  274. <el-table-column prop="name" label="当前状态">
  275. <template slot-scope="scope">
  276. <span>{{scope.row.status_name}}</span>
  277. </template>
  278. </el-table-column>
  279. </el-table>
  280. </div>
  281. <el-pagination
  282. class="order-footer"
  283. background
  284. layout="prev, pager, next"
  285. :page-size="10"
  286. :total="frozenCount"
  287. @current-change="handlefrozenCurrentChange"
  288. />
  289. </el-tab-pane>
  290. <el-tab-pane label="客栈余额待提现" name="balance">
  291. <div
  292. class="tab-header"
  293. >用户客栈账户余额待提现总额{{balanceTotal/100}}元,共{{balanceCount}}笔</div>
  294. <div style="text-align: right;margin-bottom: 10px">
  295. <el-button @click="exportBalanceList" class="export-excel" type="primary">导出报表</el-button>
  296. </div>
  297. <div class="tab-content">
  298. <el-table :data="balanceData" border style="width: 100%">
  299. <el-table-column prop="name" label="用户">
  300. <template slot-scope="scope">
  301. <span class="lblue point">
  302. <a
  303. :href="scope.row.user_url"
  304. target="_blank"
  305. >{{scope.row.nickname}}({{scope.row.uid}})</a>
  306. </span>
  307. </template>
  308. </el-table-column>
  309. <el-table-column prop="name" label="可用余额">
  310. <template slot-scope="scope">
  311. <span>{{scope.row.total_balance/100}}</span>
  312. </template>
  313. </el-table-column>
  314. </el-table>
  315. </div>
  316. <el-pagination
  317. class="order-footer"
  318. background
  319. layout="prev, pager, next"
  320. :page-size="10"
  321. :total="balanceCount"
  322. @current-change="handlebalanceCurrentChange"
  323. />
  324. </el-tab-pane>
  325. <el-tab-pane label="薪资余额待提现" name="income">
  326. <div
  327. class="tab-header"
  328. >用户客栈账户余额待提现总额{{incomeTotal/100}}元,共{{incomeCount}}笔</div>
  329. <div style="text-align: right;margin-bottom: 10px">
  330. <el-button @click="exportIncomeList" class="export-excel" type="primary">导出报表</el-button>
  331. </div>
  332. <div class="tab-content">
  333. <el-table :data="incomeData" border style="width: 100%">
  334. <el-table-column prop="name" label="用户">
  335. <template slot-scope="scope">
  336. <span class="lblue point">
  337. <a
  338. :href="scope.row.user_url"
  339. target="_blank"
  340. >{{scope.row.nickname}}({{scope.row.uid}})</a>
  341. </span>
  342. </template>
  343. </el-table-column>
  344. <el-table-column prop="name" label="可用余额">
  345. <template slot-scope="scope">
  346. <span>{{scope.row.income_tax_balance/100}}</span>
  347. </template>
  348. </el-table-column>
  349. </el-table>
  350. </div>
  351. <el-pagination
  352. class="order-footer"
  353. background
  354. layout="prev, pager, next"
  355. :page-size="10"
  356. :total="incomeCount"
  357. @current-change="handleincomeCurrentChange"
  358. />
  359. </el-tab-pane>
  360. </el-tabs>
  361. </div>
  362. </template>
  363. <script>
  364. export default {
  365. data() {
  366. return {
  367. activeName: "job",
  368. jobPage: 1,
  369. jobData: "",
  370. packagePage: 1,
  371. packageData: "",
  372. hirePage: 1,
  373. hireData: "",
  374. //待解冻
  375. frozenPage:1,
  376. frozenCount:0,
  377. frozenCoins:0,
  378. waitUnfrozenCount:0,
  379. frozenData:[],
  380. //余额
  381. balancePage:1,
  382. balanceCount:0,
  383. balanceTotal:0,
  384. balanceData:[],
  385. //薪资
  386. incomePage:1,
  387. incomeCount:0,
  388. incomeTotal:0,
  389. incomeData:[],
  390. };
  391. },
  392. mounted() {
  393. this.activeName = this.$route.query.activeName || "job";
  394. this.getJobOrders();
  395. this.getPackageOrders();
  396. this.getHireOrders();
  397. this.getFrozenOrders();
  398. this.getBalanceOrders();
  399. this.getIncomeOrders();
  400. },
  401. methods: {
  402. async getJobOrders() {
  403. const data = {
  404. page: this.jobPage,
  405. pageSize: 10,
  406. productType: 9
  407. };
  408. let res = await this.$post("/api/admin/order/getWaitExpenseOrders", data);
  409. if (res) {
  410. this.jobData = res.data;
  411. // console.log(this.jobData)
  412. }
  413. },
  414. async exportZhichuList(type){
  415. let url = window.location.host + "/api/admin/order/exportZhichu?productType="+type;
  416. window.location.href = "https://" + url;
  417. },
  418. async getPackageOrders() {
  419. const data = {
  420. page: this.packagePage,
  421. pageSize: 10,
  422. productType: 2
  423. };
  424. let res = await this.$post("/api/admin/order/getWaitExpenseOrders", data);
  425. if (res) {
  426. this.packageData = res.data;
  427. // console.log(this.packageData)
  428. }
  429. },
  430. async getHireOrders() {
  431. const data = {
  432. page: this.hirePage,
  433. pageSize: 10,
  434. productType: 4
  435. };
  436. let res = await this.$post("/api/admin/order/getWaitExpenseOrders", data);
  437. if (res) {
  438. this.hireData = res.data;
  439. // console.log(this.hireData)
  440. }
  441. },
  442. //待解冻订单
  443. async getFrozenOrders() {
  444. const data = {
  445. page: this.frozenPage,
  446. size: 10,
  447. status: 1
  448. };
  449. let res = await this.$post("/api/admin/order/get_frozen_coins", data);
  450. if (res) {
  451. this.frozenData = res.data.list;
  452. this.frozenCount = res.data.totalCount * 1;
  453. this.frozenCoins = res.data.waitUnfrozenCoins;
  454. this.waitUnfrozenCount = res.data.waitUnfrozenCount;
  455. }
  456. },
  457. async exportFrozenList(){
  458. let url = window.location.host + "/api/admin/order/exportFrozen?status=1";
  459. window.location.href = "https://" + url;
  460. },
  461. //账户余额
  462. async getBalanceOrders() {
  463. const data = {
  464. page: this.balancePage,
  465. size: 10,
  466. };
  467. let res = await this.$post("/api/admin/UserFinancial/getBalanceList", data);
  468. if (res.status === 1) {
  469. this.balanceData = res.data.list || [];
  470. this.balanceCount = res.data.total * 1;
  471. this.balanceTotal = res.data.totalBalance * 1;
  472. }
  473. },
  474. async exportBalanceList(){
  475. let url = window.location.host + "/api/admin/UserFinancial/exportBalance";
  476. window.location.href = "https://" + url;
  477. },
  478. //薪资余额
  479. async getIncomeOrders() {
  480. const data = {
  481. page: this.incomePage,
  482. size: 10,
  483. };
  484. let res = await this.$post("/api/admin/UserFinancial/getIncomeList", data);
  485. if (res.status === 1) {
  486. this.incomeData = res.data.list || [];
  487. this.incomeCount = res.data.total * 1;
  488. this.incomeTotal = res.data.totalIncome * 1;
  489. }
  490. },
  491. async exportIncomeList(){
  492. let url = window.location.host + "/api/admin/UserFinancial/exportIncome";
  493. window.location.href = "https://" + url;
  494. },
  495. handleClick(tab, event) {
  496. return;
  497. switch (tab.name){
  498. case 'frozen':
  499. this.getFrozenOrders();
  500. break;
  501. }
  502. },
  503. handleJobCurrentChange(val) {
  504. this.jobPage = val;
  505. this.getJobOrders();
  506. },
  507. handlePackageCurrentChange(val) {
  508. this.packagePage = val;
  509. this.getPackageOrders();
  510. },
  511. handleHireCurrentChange(val) {
  512. this.hirePage = val;
  513. this.getHireOrders();
  514. },
  515. handlefrozenCurrentChange(val) {
  516. this.frozenPage = val;
  517. this.getFrozenOrders();
  518. },
  519. handleincomeCurrentChange(val) {
  520. this.incomePage = val;
  521. this.getIncomeOrders();
  522. },
  523. handlebalanceCurrentChange(val) {
  524. this.balancePage = val;
  525. this.getBalanceOrders();
  526. },
  527. formatDate(time) {
  528. var now = new Date(time * 1000);
  529. var year = now.getFullYear();
  530. var month = now.getMonth() + 1;
  531. var date = now.getDate();
  532. var hour = now.getHours();
  533. var minute = now.getMinutes();
  534. var second = now.getSeconds();
  535. if (hour < 10) {
  536. hour = "0" + hour;
  537. }
  538. if (minute < 10) {
  539. minute = "0" + minute;
  540. }
  541. if (second < 10) {
  542. second = "0" + second;
  543. }
  544. return (
  545. year +
  546. "-" +
  547. month +
  548. "-" +
  549. date +
  550. " " +
  551. hour +
  552. ":" +
  553. minute +
  554. ":" +
  555. second
  556. );
  557. }
  558. }
  559. };
  560. </script>
  561. <style scoped lang="scss">
  562. .header {
  563. margin-top: 20px;
  564. margin-bottom: 30px;
  565. line-height: 1.5;
  566. }
  567. .tab-header {
  568. margin-bottom: 10px;
  569. line-height: 1.5;
  570. }
  571. .tab-content {
  572. white-space: nowrap;
  573. overflow-x: scroll;
  574. height: calc(100vh - 300px);
  575. }
  576. .order-footer {
  577. margin-top: 10px;
  578. }
  579. .el-form-item {
  580. margin-bottom: 0;
  581. }
  582. .el-form:last-child {
  583. margin-bottom: 22px;
  584. }
  585. </style>