金币系统前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

579 lines
16 KiB

  1. <script setup>
  2. import { ref, onMounted, reactive, computed } from "vue";
  3. import ElementPlus from "element-plus";
  4. import { AiFillRead } from "vue-icons-plus/ai";
  5. import { ElMessage, ElMessageBox } from "element-plus";
  6. import axios from "axios";
  7. import moment from "moment";
  8. import API from "../../api/index.js";
  9. // 变量
  10. // 充值明细表格
  11. const tableData = ref([]);
  12. // 搜索======================================
  13. // 搜索detail
  14. const detail = ref({});
  15. // 搜索对象
  16. const getObj = ref({
  17. pageNum: 1,
  18. pageSize: 10,
  19. });
  20. //分页总条目
  21. const total = ref(100);
  22. // 搜索对象时间
  23. const getTime = ref([]);
  24. // 所有信息
  25. const allData = ref([]);
  26. // 搜索地区列表
  27. const area = ref([]);
  28. //标签页默认高亮选项
  29. const activeName = ref("all");
  30. // 退款类型
  31. const consumeType = [
  32. {
  33. value: "退款金币",
  34. label: "退款金币",
  35. },
  36. {
  37. value: "退款商品",
  38. label: "退款商品",
  39. },
  40. ];
  41. // //表格高度
  42. // const tableHeight = computed(function () {
  43. // return (getObj.value.pageSize + 2) * 45 + "px";
  44. // });
  45. // 方法
  46. // 搜索==============================================================
  47. // 搜索方法
  48. const get = async function (val) {
  49. try {
  50. // 搜索参数页码赋值
  51. if (typeof val === "number") {
  52. getObj.value.pageNum = val;
  53. }
  54. // 搜索参数时间赋值
  55. if (getTime.value != null) {
  56. if (getTime.value.startDate != "" && getTime.value.endDate != "") {
  57. detail.value.startDate = getTime.value[0];
  58. detail.value.endDate = getTime.value[1];
  59. }
  60. } else {
  61. detail.value.startDate = "";
  62. detail.value.endDate = "";
  63. }
  64. console.log("搜索参数", getObj.value);
  65. // 发送POST请求
  66. const result = await API.post("http://54.251.137.151:10702/refund/search", {
  67. ...getObj.value,
  68. detail: { ...detail.value },
  69. });
  70. // 将响应结果存储到响应式数据中
  71. console.log("请求成功", result);
  72. // 存储表格数据
  73. tableData.value = result.data.list;
  74. console.log("tableData", tableData.value);
  75. // 存储分页总数
  76. total.value = result.data.total;
  77. console.log("total", total.value);
  78. } catch (error) {
  79. console.log("请求失败", error);
  80. // 在这里可以处理错误逻辑,比如显示错误提示等
  81. }
  82. };
  83. // 搜索
  84. const search = function () {
  85. getObj.value.pageNum = 1;
  86. get();
  87. };
  88. // 重置
  89. const reset = function () {
  90. detail.value.refundGoods = "";
  91. detail.value.refundType = "";
  92. detail.value.area = "";
  93. detail.value.startDate = "";
  94. detail.value.endDate = "";
  95. getTime.value = {};
  96. };
  97. // 今天
  98. const getToday = function () {
  99. const today = new Date();
  100. const startDate = new Date(
  101. today.getFullYear(),
  102. today.getMonth(),
  103. today.getDate()
  104. );
  105. const endDate = new Date(
  106. today.getFullYear(),
  107. today.getMonth(),
  108. today.getDate() + 1
  109. );
  110. getTime.value = [startDate, endDate];
  111. console.log("getTime", getTime.value);
  112. get();
  113. };
  114. // 昨天
  115. const getYesterday = function () {
  116. const yesterday = new Date();
  117. yesterday.setDate(yesterday.getDate() - 1);
  118. const startDate = new Date(
  119. yesterday.getFullYear(),
  120. yesterday.getMonth(),
  121. yesterday.getDate()
  122. );
  123. const endDate = new Date(
  124. yesterday.getFullYear(),
  125. yesterday.getMonth(),
  126. yesterday.getDate() + 1
  127. );
  128. getTime.value = [startDate, endDate];
  129. console.log("getTime", getTime.value);
  130. get();
  131. };
  132. // 近7天
  133. const get7Days = function () {
  134. const today = new Date();
  135. const startDate = new Date(
  136. today.getFullYear(),
  137. today.getMonth(),
  138. today.getDate() - 6
  139. );
  140. const endDate = new Date(
  141. today.getFullYear(),
  142. today.getMonth(),
  143. today.getDate() + 1
  144. );
  145. getTime.value = [startDate, endDate];
  146. console.log("getTime", getTime.value);
  147. get();
  148. };
  149. //全部充值明细
  150. const adminAll = function () {
  151. console.log("adminAll");
  152. detail.value.status = "";
  153. getObj.value.pageNum = 1;
  154. get();
  155. };
  156. //待审核充值明细
  157. const adminWait = function () {
  158. detail.value.status = 0;
  159. getObj.value.pageNum = 1;
  160. get();
  161. console.log("adminWait");
  162. };
  163. //已通过充值明细
  164. const adminPass = function () {
  165. detail.value.status = 1;
  166. getObj.value.pageNum = 1;
  167. get();
  168. console.log("adminPass");
  169. };
  170. //已驳回充值明细
  171. const adminReject = function () {
  172. detail.value.status = 2;
  173. getObj.value.pageNum = 1;
  174. get();
  175. console.log("adminReject");
  176. };
  177. //点击标签页
  178. const handleClick = function (tab, event) {
  179. if (tab.props.name === "all") {
  180. adminAll();
  181. } else if (tab.props.name === "wait") {
  182. adminWait();
  183. } else if (tab.props.name === "pass") {
  184. adminPass();
  185. } else if (tab.props.name === "reject") {
  186. adminReject();
  187. }
  188. };
  189. // 获取地区
  190. const getArea = async function () {
  191. try {
  192. // 发送POST请求
  193. const result = await API.post(
  194. "http://54.251.137.151:10702/recharge/user/search",
  195. {}
  196. );
  197. // 将响应结果存储到响应式数据中
  198. console.log("请求成功", result);
  199. // 存储地区信息
  200. area.value = result.data;
  201. console.log("地区", area.value);
  202. } catch (error) {
  203. console.log("请求失败", error);
  204. // 在这里可以处理错误逻辑,比如显示错误提示等
  205. }
  206. };
  207. // 挂载
  208. onMounted(async function () {
  209. await get();
  210. await getArea();
  211. });
  212. //删除气泡
  213. const delObj = ref({});
  214. const del = function (row) {
  215. delObj.value.detailId = row.detailId;
  216. console.log("delObj", delObj.value);
  217. };
  218. // 删除按钮的气泡弹出框确认按钮
  219. const delConfirm = async function () {
  220. try {
  221. console.log("delObj", delObj.value);
  222. // 发送POST请求
  223. const result = await API.post(
  224. "http://54.251.137.151:10702/refund/softDelete?detailId=" +
  225. delObj.value.detailId,
  226. {}
  227. );
  228. // 将响应结果存储到响应式数据中
  229. console.log("请求成功", result);
  230. // 刷新表格数据
  231. get();
  232. } catch (error) {
  233. console.log("请求失败", error);
  234. // 在这里可以处理错误逻辑,比如显示错误提示等
  235. }
  236. };
  237. // 查询商品的接口
  238. const goods = ref([]);
  239. const getGoods = async function () {
  240. try {
  241. // 发送POST请求
  242. const result = await API.post("http://54.251.137.151:10702/product", {});
  243. // 将响应结果存储到响应式数据中
  244. console.log("请求成功", result);
  245. // 存储全部数据
  246. goods.value = result.data;
  247. console.log("allData", allData.value);
  248. console.log("地区", area.value);
  249. } catch (error) {
  250. console.log("请求失败", error);
  251. // 在这里可以处理错误逻辑,比如显示错误提示等
  252. }
  253. };
  254. getGoods();
  255. // 验证跳转输入框的数字是否合法
  256. const checkNumber = function () {
  257. if (typeof parseInt(getObj.value.pageNum) === "number") {
  258. console.log(
  259. "总共有多少页" + Math.ceil(total.value / getObj.value.pageSize)
  260. );
  261. if (
  262. getObj.value.pageNum > 0 &&
  263. getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
  264. ) {
  265. getObj.value.pageNum = parseInt(getObj.value.pageNum);
  266. console.log("输入的数字合法");
  267. get();
  268. } else {
  269. //提示
  270. ElMessage({
  271. type: "error",
  272. message: "请检查输入内容",
  273. });
  274. }
  275. } else {
  276. //提示
  277. ElMessage({
  278. type: "error",
  279. message: "请检查输入内容",
  280. });
  281. }
  282. };
  283. </script>
  284. <template>
  285. <el-row>
  286. <el-col>
  287. <el-card style="margin-bottom: 20px">
  288. <el-row style="margin-bottom: 10px">
  289. <el-col :span="8">
  290. <div class="head-card-element">
  291. <el-text class="mx-1" size="large">退款类型</el-text>
  292. <el-select
  293. v-model="detail.refundType"
  294. placeholder="请选择退款类型"
  295. size="large"
  296. style="width: 240px"
  297. clearable
  298. >
  299. <el-option
  300. v-for="item in consumeType"
  301. :key="item.value"
  302. :label="item.label"
  303. :value="item.value"
  304. />
  305. </el-select>
  306. </div>
  307. </el-col>
  308. <el-col :span="8">
  309. <div class="head-card-element">
  310. <el-text class="mx-1" size="large">退款商品</el-text>
  311. <el-select
  312. v-model="detail.refundGoods"
  313. placeholder="请选择退款商品"
  314. size="large"
  315. style="width: 240px"
  316. clearable
  317. >
  318. <el-option
  319. v-for="item in goods"
  320. :key="item.value"
  321. :label="item.name"
  322. :value="item.name"
  323. />
  324. </el-select>
  325. </div>
  326. </el-col>
  327. <el-col :span="8">
  328. <div class="head-card-element">
  329. <el-text class="mx-1" size="large">所属地区</el-text>
  330. <el-select
  331. v-model="detail.area"
  332. placeholder="请选择所属地区"
  333. size="large"
  334. style="width: 240px"
  335. clearable
  336. >
  337. <el-option
  338. v-for="item in area"
  339. :key="item"
  340. :label="item"
  341. :value="item"
  342. />
  343. </el-select>
  344. </div>
  345. </el-col>
  346. </el-row>
  347. <el-row>
  348. <el-col :span="21">
  349. <div class="head-card-element">
  350. <el-text class="mx-1" size="large">退款时间</el-text>
  351. <el-date-picker
  352. v-model="getTime"
  353. type="datetimerange"
  354. range-separator="至"
  355. start-placeholder="起始时间"
  356. end-placeholder="结束时间"
  357. />
  358. <el-button style="margin-left: 10px" @click="getToday()"
  359. ></el-button
  360. >
  361. <el-button @click="getYesterday()"></el-button>
  362. <el-button @click="get7Days()">近7天</el-button>
  363. </div>
  364. </el-col>
  365. <el-col :span="3">
  366. <div class="head-card-btn">
  367. <el-button @click="reset()">重置</el-button>
  368. <el-button type="primary" @click="search()">查询</el-button>
  369. </div>
  370. </el-col>
  371. </el-row>
  372. </el-card>
  373. </el-col>
  374. </el-row>
  375. <el-row>
  376. <el-col>
  377. <el-card>
  378. <el-tabs
  379. v-model="activeName"
  380. type="card"
  381. class="demo-tabs"
  382. @tab-click="handleClick"
  383. >
  384. <el-tab-pane label="全部" name="all"></el-tab-pane>
  385. <el-tab-pane label="待审核" name="wait"></el-tab-pane>
  386. <el-tab-pane label="已通过" name="pass"></el-tab-pane>
  387. <el-tab-pane label="已驳回" name="reject"></el-tab-pane>
  388. </el-tabs>
  389. <div>
  390. <el-table
  391. :data="tableData"
  392. v-if="(tableData.detaillFlag = 1)"
  393. :height="tableHeight"
  394. style="width: 100%"
  395. >
  396. <el-table-column
  397. type="index"
  398. label="序号"
  399. width="100px"
  400. fixed="left"
  401. >
  402. <template #default="scope">
  403. <span>{{
  404. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  405. }}</span>
  406. </template>
  407. </el-table-column>
  408. <el-table-column prop="username" label="姓名" width="150px" />
  409. <el-table-column prop="jwcode" label="精网号" width="120px" />
  410. <el-table-column prop="area" label="所属地区" width="120px" />
  411. <el-table-column prop="refundType" label="退款类型" width="100px" />
  412. <el-table-column
  413. prop="productName"
  414. label="退款商品"
  415. width="200px"
  416. />
  417. <el-table-column label="退款金币数" width="120px">
  418. <template #default="scope">
  419. {{
  420. scope.row.rechargeCoin +
  421. scope.row.freeCoin +
  422. scope.row.taskCoin
  423. }}
  424. </template>
  425. </el-table-column>
  426. <el-table-column
  427. prop="rechargeCoin"
  428. label="永久金币"
  429. width="100px"
  430. />
  431. <el-table-column prop="freeCoin" label="免费金币" width="100px" />
  432. <el-table-column prop="taskCoin" label="任务金币" width="100px" />
  433. <!-- 修改prop为taskGold -->
  434. <el-table-column
  435. prop="remark"
  436. label="备注"
  437. width="200px"
  438. show-overflow-tooltip
  439. />
  440. <el-table-column prop="adminName" label="提交人" width="100px" />
  441. <el-table-column prop="status" label="审核状态" width="120px">
  442. <!-- 模板内容 -->
  443. <template #default="scope">
  444. <span v-if="scope.row.status == 1">
  445. <div class="status">
  446. <span class="green-dot"></span>
  447. <span>已通过</span>
  448. </div>
  449. </span>
  450. <span v-if="scope.row.status == 0">
  451. <div class="status">
  452. <span class="grey-dot"></span>
  453. <span>待审核</span>
  454. </div>
  455. </span>
  456. <span v-if="scope.row.status == 2">
  457. <div class="status">
  458. <span class="red-dot"></span>
  459. <span>已驳回</span>
  460. </div>
  461. </span>
  462. </template>
  463. </el-table-column>
  464. <el-table-column
  465. prop="reson"
  466. label="驳回理由"
  467. width="200px"
  468. show-overflow-tooltip
  469. />
  470. <el-table-column prop="createTime" label="提交时间" width="180px">
  471. <template #default="scope">
  472. {{ moment(scope.row.createTime).format("YYYY-MM-DD HH:mm:ss") }}
  473. </template>
  474. </el-table-column>
  475. <el-table-column
  476. prop="operation"
  477. label="操作"
  478. fixed="right"
  479. width="120px"
  480. >
  481. <template #default="scope">
  482. <el-popconfirm
  483. title="确定将此条活动删除吗?"
  484. @confirm="delConfirm"
  485. >
  486. <template #reference>
  487. <el-button type="primary" text @click="del(scope.row)">
  488. 删除
  489. </el-button>
  490. </template>
  491. <template #actions="{ delConfirm, cancel }">
  492. <el-button size="small" @click="cancel">取消</el-button>
  493. <el-button type="primary" size="small" @click="delConfirm">
  494. 确定
  495. </el-button>
  496. </template>
  497. </el-popconfirm>
  498. </template>
  499. </el-table-column>
  500. </el-table>
  501. </div>
  502. <!-- 分页 -->
  503. <!-- 分页 -->
  504. <div class="pagination" style="margin-top: 20px">
  505. <el-pagination
  506. background
  507. :page-size="getObj.pageSize"
  508. layout="slot"
  509. :total="total"
  510. >
  511. <div>{{ total }},每页</div>
  512. <el-select
  513. v-model="getObj.pageSize"
  514. class="page-size"
  515. @change="get()"
  516. style="width: 80px"
  517. >
  518. <el-option
  519. v-for="item in [5, 10, 20, 50, 100]"
  520. :key="item"
  521. :label="item"
  522. :value="item"
  523. ></el-option>
  524. </el-select>
  525. <div></div>
  526. </el-pagination>
  527. <el-pagination
  528. background
  529. layout="prev, pager, next,slot"
  530. :page-size="getObj.pageSize"
  531. :total="total"
  532. :current-page="getObj.pageNum"
  533. @current-change="get"
  534. >
  535. <div>跳至</div>
  536. <el-input
  537. v-model="getObj.pageNum"
  538. style="width: 40px"
  539. @change="checkNumber"
  540. />
  541. <div></div>
  542. </el-pagination>
  543. </div>
  544. </el-card>
  545. </el-col>
  546. </el-row>
  547. </template>
  548. <style scoped>
  549. .status {
  550. display: flex;
  551. }
  552. .head-card {
  553. display: flex;
  554. }
  555. .head-card-element {
  556. margin-right: 20px;
  557. }
  558. .head-card-btn {
  559. margin-left: auto;
  560. }
  561. .pagination {
  562. display: flex;
  563. margin-top: 20px;
  564. }
  565. </style>