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

741 lines
20 KiB

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