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

610 lines
17 KiB

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