金币系统前端
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.

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