Browse Source

feat: 新增消耗 消耗明细80% 汇率页面(缺接口)

lihui/feature-20250623144029-金币前端lihui
lihui 6 days ago
parent
commit
64ee464b6e
  1. 653
      src/views/consume/addCoinConsume.vue
  2. 234
      src/views/consume/coinConsumeDetail.vue
  3. 385
      src/views/managerecharge/rate.vue

653
src/views/consume/addCoinConsume.vue

@ -1,21 +1,26 @@
<script setup> <script setup>
import {reactive, onMounted} from "vue";
import {ref, computed, watch} from "vue";
import {ElMessage} from "element-plus";
import {Plus} from "@element-plus/icons-vue";
import axios from "axios";
import {ElMessageBox} from "element-plus";
import {onMounted, reactive, ref, watch} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import moment from "moment"; import moment from "moment";
import _ from "lodash";
import request from "@/util/http"; import request from "@/util/http";
// //
const trimJwCode = () => { const trimJwCode = () => {
if (addConsume.value.jwcode) { if (addConsume.value.jwcode) {
addConsume.value.jwcode = addConsume.value.jwcode.replace(/\s/g, '');
//
const trimmed = addConsume.value.jwcode.toString().replace(/\s/g, '');
const numeric = Number(trimmed);
//
if (!isNaN(numeric)) {
addConsume.value.jwcode = numeric;
} else {
ElMessage.error("精网号格式不正确,请输入数字");
}
} }
} }
// //
const adminData = ref({}); const adminData = ref({});
const getAdminData = async function () { const getAdminData = async function () {
@ -34,102 +39,105 @@ const getAdminData = async function () {
} }
}; };
//
//
const user = ref({ const user = ref({
jwcode: null,
name: "", name: "",
jwcode: 0,
market: "", market: "",
historySumGold: 0,
historyPermanentGold: 0,
historyFreeGold: 0,
historyTaskGold: 0,
rechargeNum: 0,
consumeNum: 0,
historySumGold: null,
historyPermanentGold: null,
historyFreeGold: null,
historyTaskGold: null,
rechargeNum: null,
consumeNum: null,
firstRecharge: "", firstRecharge: "",
nowPermanentGold: 0,
nowPermanentGold: null,
nowFreeJune: null, nowFreeJune: null,
nowTaskGold: 0,
nowTaskGold: null,
nowFreeDecember: null, nowFreeDecember: null,
nowFreeGold: 0,
nowSumGold: 0
nowFreeGold: null,
nowSumGold: null
}) })
// //
const addConsume = ref({ const addConsume = ref({
jwcode:0, //
goodsName: "",// // todo 3
sumGold: 0, //
freeGold: 0, //
permanentGold: 0, //
taskGold: 0, //
// jwcode
jwcode: null, //
goodsName: "",// // todo 3
sumGold: null, //
freeGold: null, //
permanentGold: null, //
taskGold: null, //
remark: "",// remark: "",//
adminId: 0,// id
adminId: null,// id
});
// updateType: "1", ,
//
function calculateCoins(sumGold) {
const {nowFreeGold, nowPermanentGold, nowTaskGold} = user.value;
if (user.value.jwcode) {
if (sumGold <= 0) return {free: 0, permanent: 0, task: 0};
// indexName: "", //
});
let remaining = sumGold;
let freeUsed = 0, permanentUsed = 0, taskUsed = 0;
//
// const add = async function () {
// try {
// // 使
//
// // addConsume.value.rechargeCoin = Number(addConsume.value.rechargeCoin * 100);
// // addConsume.value.freeCoin = Number(addConsume.value.freeCoin * 100);
// // addConsume.value.taskCoin = Number(addConsume.value.taskCoin * 100);
//
// addConsume.value.sumGold = Number(addConsume.value.sumGold);
// addConsume.value.freeGold = Number(addConsume.value.freeGold);
// addConsume.value.permanentGold = Number(addConsume.value.permanentGold);
// addConsume.value.taskGold = Number(addConsume.value.taskGold);
//
// // addConsume.value.productName = indexs.value.productName;
//
// // POST
// const result = await request({
// url: "/consume/add",
// data: addConsume.value,
// });
// if (result.code === 0) {
// ElMessage.error(result.msg);
// return;
// } else {
// ElMessage.success("");
// }
// //
// addConsume.value = {};
// addConsume.value.adminId = adminData.value.adminId;
// addConsume.value.adminName = adminData.value.adminName;
// // addConsume.value.updateType = "1";
// addConsume.value.freeCoin = 0;
// addConsume.value.rechargeCoin = 0;
// addConsume.value.taskCoin = 0;
// indexs.value = {};
// console.log("", result);
// user.value = {};
// } catch (error) {
// console.log("", error);
// ElMessage.error("");
//
// //
// }
// };
//
if (nowFreeGold > 0) {
freeUsed = Math.min(nowFreeGold, remaining);
remaining -= freeUsed;
}
//
if (remaining > 0 && nowPermanentGold > 0) {
permanentUsed = Math.min(nowPermanentGold, remaining);
remaining -= permanentUsed;
}
//
if (remaining > 0 && nowTaskGold > 0) {
taskUsed = remaining;
}
return {free: freeUsed, permanent: permanentUsed, task: taskUsed};
}
//
return {free: 0, permanent: 0, task: 0};
}
//
watch(
() => addConsume.value.sumGold,
(newValue) => {
if (newValue > 0) {
const {free, permanent, task} = calculateCoins(newValue);
addConsume.value.freeGold = free;
addConsume.value.permanentGold = permanent;
addConsume.value.taskGold = task;
} else {
addConsume.value.freeGold = null;
addConsume.value.permanentGold = null;
addConsume.value.taskGold = null;
}
}
);
// //
const add = async function () { const add = async function () {
try { try {
//
//
if (!validateInput()) { if (!validateInput()) {
return; return;
} }
// //
formatConsumeData(); formatConsumeData();
// POST // POST
const result = await request({ const result = await request({
url: "/consume/add",
// url: "/consume/add",
url: "http://192.168.8.247:8081/consume/add",
data: addConsume.value, data: addConsume.value,
}); });
// //
@ -145,18 +153,31 @@ const add = async function () {
// //
function validateInput() { function validateInput() {
const { sumGold, freeGold, permanentGold, taskGold } = addConsume.value;
const sumGold = addConsume.value.sumGold;
if (user.value.jwcode == null) {
ElMessage.error("请先查询用户信息");
addConsume.value.sumGold = null;
}
// //
if (sumGold <= 0) {
if (user.value.jwcode && sumGold <= 0) {
ElMessage.error("消费金币总数必须大于0"); ElMessage.error("消费金币总数必须大于0");
// sunGoldnull
addConsume.value.sumGold = null;
return false; return false;
} }
// //
const totalAvailableGold = freeGold + permanentGold + taskGold;
if (sumGold > totalAvailableGold) {
const totalAvailableGold = user.value.nowSumGold
console.log("可用金币总和", totalAvailableGold);
console.log("可用金币总和", sumGold);
if (user.value.jwcode && sumGold > totalAvailableGold) {
ElMessage.error("消费金币总数超过可用金币总和"); ElMessage.error("消费金币总数超过可用金币总和");
// sunGoldnull
addConsume.value.sumGold = null;
return false; return false;
} }
@ -196,25 +217,41 @@ function handleResponse(result) {
} }
} }
// //
function resetForm() { function resetForm() {
addConsume.value = { addConsume.value = {
jwcode: 0,
jwcode: null,
goodsName: "", goodsName: "",
sumGold: 0,
freeGold: 0,
permanentGold: 0,
taskGold: 0,
sumGold: null,
freeGold: null,
permanentGold: null,
taskGold: null,
remark: "", remark: "",
adminId: adminData.value.adminId, adminId: adminData.value.adminId,
adminName: adminData.value.adminName, adminName: adminData.value.adminName,
freeCoin: 0,
rechargeCoin: 0,
taskCoin: 0,
}; };
indexs.value = {};
user.value = {};
console.log("重置表单")
user.value = {
jwcode: null,
name: "",
market: "",
historySumGold: null,
historyPermanentGold: null,
historyFreeGold: null,
historyTaskGold: null,
rechargeNum: null,
consumeNum: null,
firstRecharge: "",
nowPermanentGold: null,
nowFreeJune: null,
nowTaskGold: null,
nowFreeDecember: null,
nowFreeGold: null,
nowSumGold: null
}
// user.value.jwcode = null;
// user.value = null;
} }
const addBefore = () => { const addBefore = () => {
@ -222,11 +259,11 @@ const addBefore = () => {
if (valid) { if (valid) {
ElMessageBox.confirm("确认添加?") ElMessageBox.confirm("确认添加?")
.then(() => { .then(() => {
addConsume.value.freeCoin = Number(-addConsume.value.freeCoin);
addConsume.value.rechargeCoin = Number(
-addConsume.value.rechargeCoin
);
addConsume.value.taskCoin = Number(-addConsume.value.taskCoin);
addConsume.value.freeGold = Number(addConsume.value.freeGold);
addConsume.value.permanentGold = Number(addConsume.value.permanentGold);
addConsume.value.taskGold = Number(-addConsume.value.taskGold);
// trimJwCode();
console.log("这里是jwcode", addConsume.value.jwcode)
add(); add();
console.log("添加成功"); console.log("添加成功");
imageUrl.value = ""; imageUrl.value = "";
@ -249,29 +286,20 @@ const addBefore = () => {
// //
const Ref = ref(null); const Ref = ref(null);
const checkFreeGoldRadio = function (rule, value, callback) {
if (value == "0" || value == null || value == "") {
callback(new Error("请输入消费金币总数"));
} else if (value < 0 || isNaN(value)) {
callback(new Error("请输入正确的格式"));
} else {
callback();
}
};
const rules = reactive({ const rules = reactive({
jwcode: [{required: true, message: "请输入精网号", trigger: "blur"}], jwcode: [{required: true, message: "请输入精网号", trigger: "blur"}],
productName: [{required: true, message: "请选择消费商品", trigger: "change"}], // change
taskCoin: [{required: true, message: "请输入任务金币", trigger: "blur"}],
freeCoin: [{required: true, message: "请输入免费金币", trigger: "blur"}],
rechargeCoin: [
{required: true, message: "请输入免费金币", trigger: "blur"},
],
allGold: [
goodsName: [{required: true, message: "请选择消费商品", trigger: "change"}], // change
// taskCoin: [{required: true, message: "", trigger: "blur"}],
// freeCoin: [{required: true, message: "", trigger: "blur"}],
// rechargeCoin: [
// {required: true, message: "", trigger: "blur"},
// ],
sumGold: [
{required: true, message: "消费金币总数不能为空", trigger: "blur"}, {required: true, message: "消费金币总数不能为空", trigger: "blur"},
{validator: checkFreeGoldRadio, trigger: "blur"},
], ],
indexName: [
/* indexName: [
{ {
required: true, required: true,
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
@ -283,24 +311,8 @@ const rules = reactive({
}, },
trigger: ["change", "blur"], trigger: ["change", "blur"],
}, },
]
]*/
}); });
//
const delteConsume = function () {
addConsume.value = {};
addConsume.value.adminId = adminData.value.adminId;
addConsume.value.adminName = adminData.value.adminName;
addConsume.value.updateType = "1";
addConsume.value.freeCoin = 0;
addConsume.value.rechargeCoin = 0;
addConsume.value.taskCoin = 0;
indexs.value = {};
isHC.value = 0;
};
//
// const user = ref({
// firstRechargeTime: "",
// });
// //
const getUser = async function (jwcode) { const getUser = async function (jwcode) {
@ -308,23 +320,21 @@ const getUser = async function (jwcode) {
try { try {
// POST // POST
const result = await request({ const result = await request({
url: "user/selectUser",
// url: "user/selectUser",
url: "http://192.168.8.247:8081/user/selectUser", // todo ip
data: { data: {
// //
jwcode: addConsume.value.jwcode, jwcode: addConsume.value.jwcode,
// area: adminData.value.area,
}, },
}); });
console.log("请求成功", result); console.log("请求成功", result);
if (result.code === 0) { if (result.code === 0) {
ElMessage.error(result.msg); ElMessage.error(result.msg);
} else if (result.data === null) {
ElMessage.error("用户不存在");
} else { } else {
user.value = result.data; user.value = result.data;
/* user.value.A =
Number(user.value.pendingRechargeTimes) +
Number(user.value.pendingSpendTimes);*/
console.log("用户信息", user.value); console.log("用户信息", user.value);
ElMessage.success(result.msg); ElMessage.success(result.msg);
} }
@ -335,284 +345,50 @@ const getUser = async function (jwcode) {
} }
}; };
// ?
/*//下面这个也是校验精网号是否存在的方法通过脱离文本框实现但是上面方法绑定了信息面板在输入正确的精网号后能显示
//
const userGold = ref({});
const getUserGold = async function (jwcode) {
trimJwCode();
try {
// POST
const result = await request({
// url: "/recharge/user",
data: {
jwcode: addConsume.value.jwcode,
area: adminData.value.area,
},
});
//
console.log("请求成功", result);
if (result.code === 0) {
//ElMessage.error(result.msg);
} else {
//
userGold.value = result.data;
addConsume.value.username = result.data.name;
addConsume.value.area = result.data.area;
// ElMessage.success(result.msg);
}
} catch (error) {
console.log("请求失败", error);
//ElMessage.error("");
addConsume.value.jwcode = "";
//
}
};*/
function calculateCoins(sumGold, nowFreeGold, nowPermanentGold, nowTaskGold) {
let remaining = sumGold;
let usedFreeGold = 0;
let usedPermanentGold = 0;
let usedTaskGold = 0;
//
if (remaining > 0) {
usedFreeGold = Math.min(remaining, nowFreeGold);
remaining -= usedFreeGold;
}
//
if (remaining > 0) {
usedPermanentGold = Math.min(remaining, nowPermanentGold);
remaining -= usedPermanentGold;
}
//
if (remaining > 0) {
usedTaskGold = Math.min(remaining, nowTaskGold);
remaining -= usedTaskGold;
}
// 使
return {
usedFreeGold,
usedPermanentGold,
usedTaskGold,
remaining,
finalFreeGold: nowFreeGold - usedFreeGold,
finalPermanentGold: nowPermanentGold - usedPermanentGold,
finalTaskGold: nowTaskGold - usedTaskGold
};
}
//
/*
function calculateCoins() {
if (
(userGold.value.coreJb +
userGold.value.free6 +
userGold.value.free12 +
userGold.value.buyJb) /
100 <
addConsume.value.allGold
) {
addConsume.value.allGold = 0;
addConsume.value.taskCoin = 0;
addConsume.value.freeCoin = 0;
addConsume.value.rechargeCoin = 0;
ElMessage.error("金币不足,请充值");
return;
}
//
else {
// allGold
const originalAllGold = addConsume.value.allGold;
// todayTasktodayFree
const todayTask =
typeof userGold.value.coreJb === "number"
? userGold.value.coreJb / 100
: 0;
const todayFree =
typeof (userGold.value.free6 + userGold.value.free12) === "number"
? (userGold.value.free6 + userGold.value.free12) / 100
: 0;
//
addConsume.value.taskCoin = Math.min(originalAllGold, todayTask);
let remainingGold = originalAllGold - addConsume.value.taskCoin;
addConsume.value.freeCoin = Math.min(remainingGold, todayFree);
remainingGold -= addConsume.value.freeCoin;
addConsume.value.rechargeCoin = remainingGold; //
// allGold
addConsume.value.allGold = originalAllGold;
// taskCoin, freeCoin, rechargeCoinNaN0
if (isNaN(addConsume.value.taskCoin)) addConsume.value.taskCoin = 0;
if (isNaN(addConsume.value.freeCoin)) addConsume.value.freeCoin = 0;
if (isNaN(addConsume.value.rechargeCoin)) addConsume.value.rechargeCoin = 0;
console.log("计算结果", addConsume.value);
}
}
*/
// //
const goods = ref([]); const goods = ref([]);
const getGoods = async function () { const getGoods = async function () {
try { try {
// POST // POST
const result = await request({ const result = await request({
// url: "/product", // todo 3
data: {},
// url: "/product", // todo 3 202562710:38:26
url: "http://39.101.133.168:8828/live_mall/api/product/all",
}); });
// //
console.log("请求成功", result); console.log("请求成功", result);
//
goods.value = result.data;
goods.value = result.data.map(item => ({
id: item.id,
label: item.name,
value: item.name
}));
// //
// goods.value = result.data;
} catch (error) { } catch (error) {
console.log("请求失败", error); console.log("请求失败", error);
// //
} }
}; };
//
const index = ref([]);
// todo
/*const getIndexs = async function (type) {
try {
// POST
const result = await request({
// url: "/product/index",
data: {
type: type,
},
});
//
console.log("请求成功", result);
//
index.value = result.data;
} catch (error) {
console.log("请求失败", error);
//
}
};*/
//
const isHC = ref(0);
// const handleProductSelect = (productName) => {
// //
// // indexs.value.productName = productName;
// if (productName === "homilychart") {
// isHC.value = 1;
// addConsume.value.productName = "homilychart"; //
// addConsume.value.indexName = ""; //
// } else {
// isHC.value = 0;
// addConsume.value.productName = productName;
// addConsume.value.indexName = "";
// }
// };
const indexs = ref([]);
// const handleIndexSelect = () => {
// if (isHC.value === 1 && addConsume.value.indexName) {
// addConsume.value.productName = "homilychart" + addConsume.value.indexName;
// }
// const getGoodsList = async () => {
// const result = await request({ url: '/goods/list' });
// goodsList.value = result.map(item => ({
// label: item.name,
// value: item.name
// }));
// }; // };
//
const queryProductSearch = (queryString, cb) => {
const results = queryString
? goods.value.filter(item =>
item.name.toLowerCase().includes(queryString.toLowerCase())
)
: goods.value;
cb(results);
};
//
const queryIndexSearch = (queryString, cb) => {
const results = queryString
? index.value.filter(item => // indexData index
item.name.toLowerCase().includes(queryString.toLowerCase())
)
: index.value;
cb(results);
};
// todo homilychart homilyChart
//
const handleProductSelect = async (selectedItem) => {
const productName = typeof selectedItem === 'string'
? selectedItem
: selectedItem?.name || '';
if (productName === "homilychart") {
isHC.value = 1;
addConsume.value.productName = "homilychart";
addConsume.value.indexName = "";
//
await getIndexs("homilychart");
} else {
isHC.value = 0;
addConsume.value.productName = productName;
addConsume.value.indexName = "";
}
};
//
const handleIndexSelect = (selectedItem) => {
if (isHC.value === 1) {
const indexName = typeof selectedItem === 'string'
? selectedItem
: selectedItem?.name || '';
//
addConsume.value.indexName = indexName;
}
};
//
const handleIndexBlur = (e) => {
if (isHC.value === 1 && e.target.value) {
//
addConsume.value.indexName = e.target.value;
}
};
// //
onMounted(async function () { onMounted(async function () {
await getAdminData(); await getAdminData();
await getGoods(); await getGoods();
await getIndexs(1);
}); });
const handleSelectBlur = (value) => {
//
// v-model
if (value) {
//
if (addConsume.value.productName === value) {
addConsume.value.productName = value;
}
//
else if (indexs.value.name === value) {
indexs.value.name = value;
}
}
};
</script> </script>
<template> <template>
@ -636,11 +412,7 @@ const handleSelectBlur = (value) => {
<!-- todo 添加错误提示--> <!-- todo 添加错误提示-->
<el-form-item prop="jwcode" label="精网号"> <el-form-item prop="jwcode" label="精网号">
<!-- <el-input
v-model="addConsume.jwcode"
style="width: 220px"
@change="getUserGold(addConsume.jwcode)"
/>-->
<el-input <el-input
v-model="addConsume.jwcode" v-model="addConsume.jwcode"
style="width: 220px" style="width: 220px"
@ -657,62 +429,56 @@ const handleSelectBlur = (value) => {
<div style="display: flex; align-items: center; gap: 20px;"> <div style="display: flex; align-items: center; gap: 20px;">
<el-form-item prop="productName" label="商品名称" style="flex: 1; margin-right: 0px"> <el-form-item prop="productName" label="商品名称" style="flex: 1; margin-right: 0px">
<el-autocomplete
v-model="addConsume.productName"
<!-- <el-autocomplete
v-model="addConsume.goodsName"
:fetch-suggestions="queryProductSearch" :fetch-suggestions="queryProductSearch"
placeholder="请输入或选择商品"
placeholder="请选择商品"
style="width: 300px" style="width: 300px"
@select="handleProductSelect" @select="handleProductSelect"
value-key="name" value-key="name"
clearable clearable
:trigger-on-focus="true" :trigger-on-focus="true"
> >
<template #default="{ item }"> <template #default="{ item }">
<div>{{ item.name }}</div> <div>{{ item.name }}</div>
</template> </template>
</el-autocomplete>
</el-form-item>
</el-autocomplete>-->
<!-- 指标选择 -->
<!-- 使用flex布局会使页面更灵活好用修改之前选中商品名称后才会正常布局的bug -->
<!-- <el-form-item prop="indexName" label="指标" v-if="isHC == 1" style="flex: 1;margin-left: -20px">
<el-autocomplete
v-model="addConsume.indexName"
:fetch-suggestions="queryIndexSearch"
placeholder="请输入或选择指标"
style="width: 140px"
@select="handleIndexSelect"
@blur="handleIndexBlur"
value-key="name"
:disabled="isHC !== 1"
clearable
free-solo
allow-create
<el-select
v-model="addConsume.goodsName"
placeholder="请选择商品"
style="width: 450px"
> >
<template #default="{ item }">
<div>{{ item.name }}</div>
</template>
</el-autocomplete>
<el-option
v-for="item in goods"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="指标" v-else style="flex:1;margin-left: -5px;">
<el-input disabled placeholder="无" style="width: 100px" />
</el-form-item> -->
</div> </div>
<el-form-item prop="allGold" label="消费金币总数"> <el-form-item prop="allGold" label="消费金币总数">
<el-input <el-input
v-model="addConsume.allGold"
v-model="addConsume.sumGold"
style="width: 100px" style="width: 100px"
@input="validateInput()"
@change="calculateCoins()" @change="calculateCoins()"
/> />
</el-form-item> </el-form-item>
<!-- 三类金币自动计算禁用状态不可编辑 -->
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<el-form-item prop="rechargeCoin" label="永久金币" style="float: left">
<el-form-item prop="permanentGold" label="永久金币" style="float: left">
<el-input <el-input
disabled disabled
v-model="addConsume.rechargeCoin"
v-model="addConsume.permanentGold"
style="width: 100px; margin-left: -5px" style="width: 100px; margin-left: -5px"
/> />
<p style="margin-right: 0px"></p> <p style="margin-right: 0px"></p>
@ -724,15 +490,15 @@ const handleSelectBlur = (value) => {
> >
<el-input <el-input
disabled disabled
v-model="addConsume.freeCoin"
v-model="addConsume.freeGold"
style="width: 100px; margin-left: -5px" style="width: 100px; margin-left: -5px"
/> />
<p style="margin-right: 0px"></p> <p style="margin-right: 0px"></p>
</el-form-item> </el-form-item>
<el-form-item prop="taskCoin" label="任务金币" style="margin-left: -20px">
<el-form-item prop="taskGold" label="任务金币" style="margin-left: -20px">
<el-input <el-input
disabled disabled
v-model="addConsume.taskCoin"
v-model="addConsume.taskGold"
style="width: 100px; margin-left: -5px" style="width: 100px; margin-left: -5px"
/> />
<p style="margin-right: 20px"></p> <p style="margin-right: 20px"></p>
@ -759,7 +525,7 @@ const handleSelectBlur = (value) => {
/> />
</el-form-item> </el-form-item>
<el-button type="success" @click="delteConsume" style="margin-left: 280px">重置</el-button>
<el-button type="success" @click="resetForm()" style="margin-left: 280px">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交</el-button> <el-button type="primary" @click="addBefore"> 提交</el-button>
</el-form> </el-form>
@ -783,13 +549,8 @@ const handleSelectBlur = (value) => {
</el-col> </el-col>
<el-col :span="14"> <el-col :span="14">
<el-form-item label="历史金币总数"> <el-form-item label="历史金币总数">
<!-- 检查 user.totalRechargeGold 是否为有效的数字 -->
<p v-if="!isNaN(Number(user.historySumGold))">
<!-- {{ Number(user.historySumGold / 100) }}-->
{{ Number(user.historySumGold) }}
</p>
<!-- 如果不是有效的数字显示默认值 -->
<p v-else></p>
<p>{{ user.historySumGold }}</p>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="10">
@ -807,7 +568,7 @@ const handleSelectBlur = (value) => {
> >
<span <span
style="display: inline; white-space: nowrap; color: #b1b1b1" style="display: inline; white-space: nowrap; color: #b1b1b1"
v-if="user.nowSumGold !== undefined"
v-if="user.nowSumGold !== null "
>(永久金币:{{ user.nowPermanentGold }};免费金币:{{ >(永久金币:{{ user.nowPermanentGold }};免费金币:{{
(user.nowFreeGold) (user.nowFreeGold)
}};任务金币:{{ user.nowTaskGold }})</span> }};任务金币:{{ user.nowTaskGold }})</span>
@ -826,11 +587,6 @@ const handleSelectBlur = (value) => {
<p style="color: #2fa1ff">{{ user.rechargeNum }}</p> <p style="color: #2fa1ff">{{ user.rechargeNum }}</p>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="10">
<el-form-item label="负责客服">
<p>{{ adminData.name }}</p>
</el-form-item>
</el-col> -->
<el-col :span="10"> <el-col :span="10">
<el-form-item label="消费次数"> <el-form-item label="消费次数">
<p style="color: #2fa1ff">{{ user.consumeNum }}</p> <p style="color: #2fa1ff">{{ user.consumeNum }}</p>
@ -842,11 +598,6 @@ const handleSelectBlur = (value) => {
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="14"> <el-col :span="14">
<!-- <el-form-item label="待审核">
<p style="color: #2fa1ff">
{{ user.A }}
</p>
</el-form-item> -->
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>

234
src/views/consume/coinConsumeDetail.vue

@ -1,10 +1,11 @@
<script setup> <script setup>
import { ref, onMounted, reactive, computed } from 'vue'
import ElementPlus from 'element-plus'
import { AiFillRead } from 'vue-icons-plus/ai'
import { ElMessage, ElMessageBox } from 'element-plus'
import axios from 'axios'
import {onMounted, ref, watch} from 'vue'
import {dayjs, ElMessage} from 'element-plus'
import request from '@/util/http' import request from '@/util/http'
const formatTime = (val) => val ? dayjs(val).format('YYYY-MM-DD HH:mm:ss') : ''
// //
// //
const adminData = ref({}) const adminData = ref({})
@ -24,8 +25,17 @@ const getAdminData = async function () {
// //
const tableData = ref([]) const tableData = ref([])
// ====================================== // ======================================
// detailVo
const detailVo = ref({})
// detailVo
const consumeUser = ref({
jwcode: null,
payPlatform: "",
market: "",
startTime: '',
endTime: '',
goodsName: ""
})
// //
const getObj = ref({ const getObj = ref({
pageNum: 1, pageNum: 1,
@ -34,7 +44,10 @@ const getObj = ref({
// //
const total = ref(100) const total = ref(100)
// //
const getTime = ref([])
const getTime = ref({
startTime: '',
endTime: ''
})
// //
const activity = ref([]) const activity = ref([])
// //
@ -42,6 +55,7 @@ const allData = ref([])
// //
const area = ref([]) const area = ref([])
// //
const activeName = ref('all') const activeName = ref('all')
@ -49,20 +63,20 @@ const activeName = ref('all')
// todo // todo
const consumePlatform = [ const consumePlatform = [
{ {
value: '4',
value: '金币系统',
label: '金币系统' label: '金币系统'
}, },
{ {
value: '1',
value: 'Homily Chart',
label: 'Homily Chart' label: 'Homily Chart'
}, },
{ {
value: '2',
value: 'Homily Link',
label: 'Homily Link' label: 'Homily Link'
}, },
{ {
value: '3',
value: 'ERP系统',
label: 'ERP系统' label: 'ERP系统'
} }
] ]
@ -74,51 +88,66 @@ const consumePlatform = [
// //
// //
const tableDataTotal = ref({}) const tableDataTotal = ref({})
const rechargeCoin = ref(0)
const freeCoin = ref(0)
const taskCoin = ref(0)
const totalCoin = ref(0)
const permanentGold = ref(0)
const freeGold = ref(0)
const taskGold = ref(0)
const totalGold = ref(0)
// ========================================================================================================================================================= // =========================================================================================================================================================
// //
const get = async function (val) {
const ConsumeSelectBy = async function (val) {
try { try {
//
/* // 地区赋
if (adminData.value.area != '总部') { if (adminData.value.area != '总部') {
detailVo.value.area = adminData.value.area
}
consumeUser.value.area = adminData.value.area
}*/
// //
if (typeof val === 'number') { if (typeof val === 'number') {
getObj.value.pageNum = val getObj.value.pageNum = val
} }
// //
console.log('时间时间111', getTime.value[0])
console.log('时间时间22', formatTime(getTime.value[0]))
if (getTime.value != null) { if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
detailVo.value.startDate = getTime.value[0]
detailVo.value.endDate = getTime.value[1]
if (getTime.value.startTime != '' && getTime.value.endTime != '') {
consumeUser.value.startTime = formatTime(getTime.value[0])
consumeUser.value.endTime = formatTime(getTime.value[1])
} }
} else { } else {
detailVo.value.startDate = ''
detailVo.value.endDate = ''
consumeUser.value.startTime = ''
consumeUser.value.endTime = ''
} }
detailVo.value.sortField = sortField.value
detailVo.value.sortOrder = sortOrder.value
console.log('搜索参数', getObj.value)
consumeUser.value.sortField = sortField.value
consumeUser.value.sortOrder = sortOrder.value
console.log('搜索参数_时间', consumeUser.value.startTime)
console.log('搜索参数1', getObj.value)
console.log('搜索参数2', consumeUser.value)
// POST // POST
const result = await request({ const result = await request({
// todo redis ?
url: '/consume/select',
// url: 'consumeUser/selectBy',
url: 'http://192.168.8.247:8081/consume/selectBy',
data: { data: {
...getObj.value,
consumeDetail: { ...detailVo.value }
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize,
consumeUser: consumeUser.value
} }
}) })
// //
// detail.value // detail.value
const detailWithoutSort = { ...detailVo.value }
const detailWithoutSort = {...consumeUser.value}
delete detailWithoutSort.sortField delete detailWithoutSort.sortField
delete detailWithoutSort.sortOrder delete detailWithoutSort.sortOrder
const result2 = await request({ const result2 = await request({
url: '/consume/SumConsume',
// url: 'http://192.168.8.247:8081/consume/statsGold',
url: 'http://192.168.8.247:8081/consume/statsGold',
data: { data: {
...detailWithoutSort ...detailWithoutSort
} }
@ -132,6 +161,7 @@ const get = async function (val) {
tableDataTotal.value = result2.data tableDataTotal.value = result2.data
if (result2.data == null) { if (result2.data == null) {
console.log('请求成功2', result2) console.log('请求成功2', result2)
// 西
tableDataTotal.value = { tableDataTotal.value = {
sumRcion: 0, sumRcion: 0,
sumFcion: 0, sumFcion: 0,
@ -143,16 +173,16 @@ const get = async function (val) {
console.log('tableDataT', tableDataTotal) console.log('tableDataT', tableDataTotal)
// //
rechargeCoin.value = parseFloat(
permanentGold.value = parseFloat(
(tableDataTotal.value.sumRcion / 100).toFixed(2) (tableDataTotal.value.sumRcion / 100).toFixed(2)
) )
freeCoin.value = parseFloat(
freeGold.value = parseFloat(
(tableDataTotal.value.sumFcion / 100).toFixed(2) (tableDataTotal.value.sumFcion / 100).toFixed(2)
) )
taskCoin.value = parseFloat(
taskGold.value = parseFloat(
(tableDataTotal.value.sumTcion / 100).toFixed(2) (tableDataTotal.value.sumTcion / 100).toFixed(2)
) )
totalCoin.value = parseFloat(
totalGold.value = parseFloat(
(tableDataTotal.value.sumcion / 100).toFixed(2) (tableDataTotal.value.sumcion / 100).toFixed(2)
) )
console.log('tableData', tableData.value) console.log('tableData', tableData.value)
@ -167,71 +197,82 @@ const get = async function (val) {
// //
const search = function () { const search = function () {
getObj.value.pageNum = 1 getObj.value.pageNum = 1
get()
ConsumeSelectBy()
} }
// //
const reset = function () { const reset = function () {
detailVo.value.productName = ''
detailVo.value.area = ''
detailVo.value.consumePlatform = ''
detailVo.value.consumeType = ''
detailVo.value.startDate = ''
detailVo.value.endDate = ''
console.log('兄弟,你点了重置')
consumeUser.value.goodsName = ''
consumeUser.value.market = ''
consumeUser.value.payPlatform = ''
consumeUser.value.startTime = ''
consumeUser.value.endTime = ''
sortField.value = '' sortField.value = ''
sortOrder.value = '' sortOrder.value = ''
getTime.value = {} getTime.value = {}
//
ConsumeSelectBy()
console.log('consumeUser', consumeUser.value)
} }
// //
const getToday = function () { const getToday = function () {
const today = new Date() const today = new Date()
const startDate = new Date(
const startTime = new Date(
today.getFullYear(), today.getFullYear(),
today.getMonth(), today.getMonth(),
today.getDate() today.getDate()
) )
const endDate = new Date(
const endTime = new Date(
today.getFullYear(), today.getFullYear(),
today.getMonth(), today.getMonth(),
today.getDate() + 1 today.getDate() + 1
) )
getTime.value = [startDate, endDate]
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
get()
ConsumeSelectBy()
} }
// //
const getYesterday = function () { const getYesterday = function () {
const yesterday = new Date() const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1) yesterday.setDate(yesterday.getDate() - 1)
const startDate = new Date(
const startTime = new Date(
yesterday.getFullYear(), yesterday.getFullYear(),
yesterday.getMonth(), yesterday.getMonth(),
yesterday.getDate() yesterday.getDate()
) )
const endDate = new Date(
const endTime = new Date(
yesterday.getFullYear(), yesterday.getFullYear(),
yesterday.getMonth(), yesterday.getMonth(),
yesterday.getDate() + 1 yesterday.getDate() + 1
) )
getTime.value = [startDate, endDate]
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
get()
ConsumeSelectBy()
} }
// 7 // 7
const get7Days = function () { const get7Days = function () {
const today = new Date() const today = new Date()
const startDate = new Date(
const startTime = new Date(
today.getFullYear(), today.getFullYear(),
today.getMonth(), today.getMonth(),
today.getDate() - 6 today.getDate() - 6
) )
const endDate = new Date(
const endTime = new Date(
today.getFullYear(), today.getFullYear(),
today.getMonth(), today.getMonth(),
today.getDate() + 1 today.getDate() + 1
) )
getTime.value = [startDate, endDate]
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
get()
ConsumeSelectBy()
} }
// //
const handleClick = function (tab, event) { const handleClick = function (tab, event) {
@ -249,7 +290,7 @@ const handleClick = function (tab, event) {
// //
onMounted(async function () { onMounted(async function () {
await getAdminData() await getAdminData()
await get()
await ConsumeSelectBy()
// getActivity(); // getActivity();
await getArea(); await getArea();
}) })
@ -264,7 +305,7 @@ const checkNumber = function () {
) { ) {
getObj.value.pageNum = parseInt(getObj.value.pageNum) getObj.value.pageNum = parseInt(getObj.value.pageNum)
console.log('输入的数字合法') console.log('输入的数字合法')
get()
ConsumeSelectBy()
} else { } else {
// //
ElMessage({ ElMessage({
@ -286,7 +327,7 @@ const getGoods = async function () {
try { try {
// POST // POST
const result = await request({ const result = await request({
url: '/product/findProductName',
url: 'http://192.168.8.247:8081/general/goods',
data: {} data: {}
}) })
// //
@ -307,7 +348,8 @@ const getArea = async function () {
// //
const result = await request({ const result = await request({
// todo // todo
url: '/area/list',
// url: '/general/market',
url: 'http://192.168.8.247:8081/general/market', // todo
data: {} data: {}
}) })
console.log('请求地区列表成功', result) console.log('请求地区列表成功', result)
@ -331,25 +373,25 @@ const sortOrder = ref('')
const handleSortChange = (column) => { const handleSortChange = (column) => {
console.log('排序字段:', column.prop) console.log('排序字段:', column.prop)
console.log('排序方式:', column.order) console.log('排序方式:', column.order)
if (column.prop === 'rechargeCoin') {
if (column.prop === 'permanentGold') {
sortField.value = 'recharge_coin' sortField.value = 'recharge_coin'
} else if (column.prop === 'taskCoin') {
} else if (column.prop === 'taskGold') {
sortField.value = 'task_coin' sortField.value = 'task_coin'
} else if (column.prop === 'freeCoin') {
} else if (column.prop === 'freeGold') {
sortField.value = 'free_coin' sortField.value = 'free_coin'
} else if (column.prop === 'createTime') { } else if (column.prop === 'createTime') {
sortField.value = 'create_time' sortField.value = 'create_time'
} }
sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC' sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC'
get()
ConsumeSelectBy()
} }
const handlePageSizeChange = function (val) { const handlePageSizeChange = function (val) {
getObj.value.pageSize = val getObj.value.pageSize = val
get()
ConsumeSelectBy()
} }
const handleCurrentChange = function (val) { const handleCurrentChange = function (val) {
getObj.value.pageNum = val getObj.value.pageNum = val
get()
ConsumeSelectBy()
} }
</script> </script>
@ -362,7 +404,7 @@ const handleCurrentChange = function (val) {
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">商品名称</el-text> <el-text class="mx-1" size="large">商品名称</el-text>
<el-select <el-select
v-model="detailVo.productName"
v-model="consumeUser.goodsName"
placeholder="请选择商品名称" placeholder="请选择商品名称"
size="large" size="large"
style="width: 180px" style="width: 180px"
@ -382,7 +424,7 @@ const handleCurrentChange = function (val) {
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text> <el-text class="mx-1" size="large">所属地区</el-text>
<el-select <el-select
v-model="detailVo.area"
v-model="consumeUser.market"
placeholder="请选择所属地区" placeholder="请选择所属地区"
size="large" size="large"
style="width: 180px" style="width: 180px"
@ -401,7 +443,7 @@ const handleCurrentChange = function (val) {
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">消耗平台</el-text> <el-text class="mx-1" size="large">消耗平台</el-text>
<el-select <el-select
v-model="detailVo.consumePlatform"
v-model="consumeUser.payPlatform"
placeholder="请选择消耗平台" placeholder="请选择消耗平台"
size="large" size="large"
style="width: 180px" style="width: 180px"
@ -420,7 +462,7 @@ const handleCurrentChange = function (val) {
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">消费类型</el-text> <el-text class="mx-1" size="large">消费类型</el-text>
<el-select <el-select
v-model="detailVo.consumeType"
v-model="consumeUser.consumeType"
placeholder="请选择消费类型" placeholder="请选择消费类型"
size="large" size="large"
style="width: 240px" style="width: 240px"
@ -448,7 +490,8 @@ const handleCurrentChange = function (val) {
end-placeholder="结束时间" end-placeholder="结束时间"
/> />
<el-button style="margin-left: 10px" @click="getToday()" <el-button style="margin-left: 10px" @click="getToday()"
></el-button
>
</el-button
> >
<el-button @click="getYesterday()"></el-button> <el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button> <el-button @click="get7Days()">近7天</el-button>
@ -458,6 +501,7 @@ const handleCurrentChange = function (val) {
<div class="head-card-btn"> --> <div class="head-card-btn"> -->
<el-button type="success" @click="reset()">重置</el-button> <el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button> <el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" @click="exportExcel()">导出excel</el-button> <el-button type="primary" @click="exportExcel()">导出excel</el-button>
</div> </div>
</el-col> </el-col>
@ -469,11 +513,9 @@ const handleCurrentChange = function (val) {
<el-col> <el-col>
<el-card> <el-card>
<div> <div>
消费金币总数{{ Math.abs(totalCoin) }}永久金币{{
Math.abs(rechargeCoin)
}}免费金币{{ Math.abs(freeCoin) }}任务金币{{
Math.abs(taskCoin)
}}
消耗金额{{ Math.abs(totalGold) }}新币永久金币{{ Math.abs(permanentGold) }}免费金币{{
Math.abs(freeGold)
}}任务金币{{ Math.abs(taskGold) }}
</div> </div>
<!-- 设置表格容器的高度和滚动样式 --> <!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 576px; overflow-y: auto"> <div style="height: 576px; overflow-y: auto">
@ -497,7 +539,7 @@ const handleCurrentChange = function (val) {
</el-table-column> </el-table-column>
<!-- 固定姓名列 --> <!-- 固定姓名列 -->
<el-table-column <el-table-column
prop="username"
prop="name"
label="姓名" label="姓名"
width="150px" width="150px"
fixed="left" fixed="left"
@ -509,19 +551,18 @@ const handleCurrentChange = function (val) {
width="110px" width="110px"
fixed="left" fixed="left"
/> />
<el-table-column prop="area" label="所属地区" width="110px" />
<el-table-column prop="productName" label="商品" width="160px" />
<el-table-column prop="market" label="所属地区" width="110px"/>
<el-table-column prop="goodsName" label="商品" width="160px"/>
<el-table-column <el-table-column
prop="consumePlatform"
prop="payPlatform"
label="消费平台" label="消费平台"
width="120px" width="120px"
> >
<template #default="scope"> <template #default="scope">
<!-- 使用非严格相等比较 --> <!-- 使用非严格相等比较 -->
<span v-if="scope.row.consumePlatform == 1">Homily Chart</span>
<span v-if="scope.row.consumePlatform == 2">Homily Link</span>
<span v-if="scope.row.consumePlatform == 3">ERP系统</span>
<span v-if="scope.row.consumePlatform == 4">金币系统</span>
{{ scope.row.payPlatform }}
<!-- <span scope.row.consumePlatform == 1">Homily Chart</span>-->
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column <!-- <el-table-column
@ -530,48 +571,47 @@ const handleCurrentChange = function (val) {
width="120px" width="120px"
/> --> /> -->
<el-table-column <el-table-column
prop="rechargeTotal"
prop="sumGold"
label="消费金币总数" label="消费金币总数"
width="120px" width="120px"
> >
<template #default="scope"> <template #default="scope">
{{ {{
(scope.row.taskCoin * -1 +
scope.row.freeCoin * -1 +
scope.row.rechargeCoin * -1) /
100
(scope.row.taskGold +
scope.row.freeGold +
scope.row.permanentGold)
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="rechargeCoin"
prop="permanentGold"
label="永久金币" label="永久金币"
sortable="“custom”" sortable="“custom”"
width="110px" width="110px"
> >
<template #default="scope"> <template #default="scope">
{{ (scope.row.rechargeCoin * -1) / 100 }}
{{ scope.row.permanentGold }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="freeCoin"
prop="freeGold"
label="免费金币" label="免费金币"
sortable="“custom”" sortable="“custom”"
width="110px" width="110px"
> >
<template #default="scope"> <template #default="scope">
{{ (scope.row.freeCoin * -1) / 100 }}
{{ scope.row.freeGold }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="taskCoin"
prop="taskCold"
label="任务金币" label="任务金币"
sortable="“custom”" sortable="“custom”"
width="110px" width="110px"
> >
<template #default="scope"> <template #default="scope">
{{ (scope.row.taskCoin * -1) / 100 }}
{{ scope.row.taskGold }}
</template> </template>
</el-table-column> </el-table-column>
@ -581,7 +621,7 @@ const handleCurrentChange = function (val) {
width="200px" width="200px"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column prop="name" label="提交人" width="110px" />
<el-table-column prop="adminName" label="提交人" width="110px"/>
<el-table-column <el-table-column
prop="createTime" prop="createTime"
label="消费时间" label="消费时间"

385
src/views/managerecharge/rate.vue

@ -1,8 +1,6 @@
<script setup> <script setup>
import { ref, onMounted, computed, reactive } from 'vue'
import {onMounted, reactive, ref} from 'vue'
import {ElMessage, ElMessageBox} from 'element-plus' import {ElMessage, ElMessageBox} from 'element-plus'
import axios from 'axios'
import { createApp } from 'vue'
import moment from 'moment' import moment from 'moment'
import _ from 'lodash' import _ from 'lodash'
@ -22,7 +20,6 @@ const getAdminData = async function () {
rateAdd.value.adminId = adminData.value.adminId rateAdd.value.adminId = adminData.value.adminId
rateEdit.value.adminId = adminData.value.adminId rateEdit.value.adminId = adminData.value.adminId
console.log('请求成功', result) console.log('请求成功', result)
// console.log('', user.value)
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
} }
@ -31,6 +28,8 @@ getAdminData()
const regeAdd = ref(false) const regeAdd = ref(false)
const regeEdit = ref(false) const regeEdit = ref(false)
//
const editFormRef = ref(null)
// //
const tableData = ref([]) const tableData = ref([])
// //
@ -51,33 +50,8 @@ const formatDateTime = (date) => {
return moment(date).format('YYYY-MM-DD HH:mm:ss') return moment(date).format('YYYY-MM-DD HH:mm:ss')
} }
//
const getToday = () => {
const today = new Date()
const start = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0)
const end = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1, 0, 0, 0)
timeRange.value = [formatDateTime(start), formatDateTime(end)]
search()
}
//
const getYesterday = () => {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const start = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate(), 0, 0, 0)
const end = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate() + 1, 0, 0, 0)
timeRange.value = [formatDateTime(start), formatDateTime(end)]
search()
}
// 7
const get7Days = () => {
const today = new Date()
const start = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 6, 0, 0, 0)
const end = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1, 0, 0, 0)
timeRange.value = [formatDateTime(start), formatDateTime(end)]
search()
}
// const startTime = ref('2023-01-01 00:00:00')
// const endTime = ref('2025-12-31 23:59:59')
const get = async function (val) { const get = async function (val) {
try { try {
@ -91,9 +65,9 @@ const get = async function (val) {
if (timeRange.value.length === 2) { if (timeRange.value.length === 2) {
time.startTime = moment(timeRange.value[0]).format('YYYY-MM-DD HH:mm:ss') time.startTime = moment(timeRange.value[0]).format('YYYY-MM-DD HH:mm:ss')
time.endTime = moment(timeRange.value[1]).format('YYYY-MM-DD HH:mm:ss') time.endTime = moment(timeRange.value[1]).format('YYYY-MM-DD HH:mm:ss')
} else {
time.startTime = ''
time.endTime = ''
} else { //
time.startTime = '2023-01-01 00:00:00'
time.endTime = '2025-12-31 23:59:59'
} }
console.log('搜索参数', { console.log('搜索参数', {
@ -114,10 +88,8 @@ const get = async function (val) {
console.log('请求成功', result); console.log('请求成功', result);
// //
tableData.value = result.data.list; tableData.value = result.data.list;
console.log('tableData', tableData.value);
// //
total.value = result.data.total; total.value = result.data.total;
console.log('total', total.value);
} catch (error) { } catch (error) {
console.log('请求失败', error); console.log('请求失败', error);
ElMessage.error('请求失败'); ElMessage.error('请求失败');
@ -167,7 +139,6 @@ const addRate = async function () {
get() get()
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
//
} }
} }
@ -210,6 +181,11 @@ const throttledAdd = _.throttle(add, 5000, { trailing: false })
const rateEdit = ref({}) const rateEdit = ref({})
// //
const getEditData = async function (row) { const getEditData = async function (row) {
//
if (editFormRef.value) {
editFormRef.value.resetFields()
}
try { try {
console.log('搜索参数', getObj.value) console.log('搜索参数', getObj.value)
// POST // POST
@ -224,10 +200,8 @@ const getEditData = async function (row) {
rateEdit.value = result.data rateEdit.value = result.data
rateEdit.value.adminId = adminData.value.adminId rateEdit.value.adminId = adminData.value.adminId
console.log('这是编辑的数值', rateEdit.value)
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
//
} }
} }
const editRate = async function () { const editRate = async function () {
@ -257,7 +231,6 @@ const editRate = async function () {
get() get()
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
//
} }
} }
const edit = () => { const edit = () => {
@ -271,20 +244,17 @@ const edit = () => {
}) })
} }
//
const deleteRate = async function (row) {
try {
// POST
const result = await request({
url: '/rates/delete/ ' + row.rateId,
data: {}
})
//
console.log('请求成功', result)
get()
} catch (error) {
console.log('请求失败', error)
//
//
const cancelEdit = () => {
regeEdit.value = false
if (editFormRef.value) {
editFormRef.value.resetFields()
}
}
const handleEditDialogClose = () => {
if (editFormRef.value) {
editFormRef.value.resetFields()
} }
} }
@ -292,10 +262,12 @@ const deleteRate = async function (row) {
onMounted(async function () { onMounted(async function () {
get() get()
}) })
// //
function handlePageChange(currentPage, pageSize) { function handlePageChange(currentPage, pageSize) {
get() get()
} }
// //
const options = [ const options = [
{ {
@ -347,6 +319,7 @@ function formatDate(value) {
const seconds = date.getSeconds().toString().padStart(2, '0') const seconds = date.getSeconds().toString().padStart(2, '0')
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}` return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
} }
function formatDateTwe(value) { function formatDateTwe(value) {
if (!value) return '' if (!value) return ''
const date = new Date(value) const date = new Date(value)
@ -356,11 +329,6 @@ function formatDateTwe(value) {
return `${year}-${month}-${day}` return `${year}-${month}-${day}`
} }
// //
// const tableHeight = computed(function () {
// return (getObj.value.pageSize + 1) * 50 + "px";
// });
// //
// ref // ref
const Ref = ref(null) const Ref = ref(null)
@ -395,128 +363,81 @@ const checkFreeGoldRadio = function (rule, value, callback) {
const rules = reactive({ const rules = reactive({
currency: [{required: true, message: '请选择货币名称', trigger: 'blur'}], currency: [{required: true, message: '请选择货币名称', trigger: 'blur'}],
exchangeRate: [{validator: checkFreeGoldRadio, trigger: 'blur'}], exchangeRate: [{validator: checkFreeGoldRadio, trigger: 'blur'}],
startTime: [
{ required: true, message: '请选择开始时间', trigger: 'blur' },
{ validator: checkStartTime, trigger: 'blur' }
],
endTime: [
{ required: true, message: '请选择结束时间', trigger: 'blur' },
{ validator: checkEndTime, trigger: 'blur' }
]
// startTime: [
// {required: true, message: '', trigger: 'blur'},
// {validator: checkStartTime, trigger: 'blur'}
// ],
// endTime: [
// {required: true, message: '', trigger: 'blur'},
// {validator: checkEndTime, trigger: 'blur'}
// ]
}) })
//
const handledelete = function () {
timeRange.value = {}
getObj.value.pageNum = 1
}
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === 'number') {
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize))
if (
getObj.value.pageNum > 0 &&
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
) {
getObj.value.pageNum = parseInt(getObj.value.pageNum)
console.log('输入的数字合法')
get()
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
//
function handleInput(value) {
//
const invalidChars = /[^0-9.]/.test(value);
if (invalidChars) {
ElMessage.warning('只能输入数字和小数点');
} }
//
let validValue = value.replace(/[^\d.]/g, '');
//
validValue = validValue.replace(/\.{2,}/g, '.');
//
if (validValue.split('.').length > 2) {
validValue = validValue.replace(/\.$/, '');
ElMessage.warning('注意!只能使用一个小数点');
} }
// =========================================================
//
// 7
const originalDecimalPart = validValue.split('.')[1] || '';
validValue = validValue.replace(/(\.\d{7})\d+/, '$1');
//
const delConfirm = async function (row) {
try {
// POST
const result = await request({
url: '/rates/delete/ ' + row.rateId,
data: {}
})
if (result.code == 200) {
ElMessage({
type: 'success',
message: '删除成功'
})
//
console.log('请求成功', result)
//
get()
} else {
ElMessage({
type: 'error',
message: '删除失败'
})
//
const newDecimalPart = validValue.split('.')[1] || '';
if (originalDecimalPart.length > 7 && originalDecimalPart !== newDecimalPart) {
ElMessage.warning('最多只能输入7位小数');
} }
} catch (error) {
console.log('请求失败', error)
//
//
//
// rateAdd.value.exchangeRate = validValue;
// rateEdit.value.exchangeRate = validValue;
//
if (validValue && !/^\d+(\.\d{0,7})?$/.test(validValue)) {
ElMessage.warning('请输入正确的数字格式');
} }
} }
//
function handleInput(value) {
// 7使
rateAdd.value.exchangeRate = value
.replace(/(\.\d{7})\d+/, '$1')
.replace(/^(\d+)(\.\d{0,7})?$/, '$1$2')
}
//
const formSize = ref('default')
</script> </script>
<template>
<el-row>
<el-col>
<el-card>
<div class="demo-range">
<el-row>
<el-col :span="9">
<el-form-item>
<el-text class="mx-1" size="large">时间范围</el-text>
<el-date-picker v-model="timeRange" type="datetimerange" range-separator="" start-placeholder="开始日期"
end-placeholder="结束日期" style="width: 300px" format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-button @click="getToday"></el-button>
<el-button @click="getYesterday"></el-button>
<el-button @click="get7Days">近7天</el-button>
</el-col>
<el-col :span="4">
<el-button class="button-item" type="success" @click="handledelete()">重置</el-button>
<el-button type="primary" @click="search">查询</el-button>
</el-col>
</el-row>
</div>
</el-card>
</el-col>
</el-row>
<template>
<!-- 这是主页面 -->
<el-row> <el-row>
<el-col> <el-col>
<el-card class="box-card" style="max-width: 100%"> <el-card class="box-card" style="max-width: 100%">
<div class="add-item">
<el-button style="color: #048efb; border: 1px solid #048efb" @click="regeAdd = true">新增汇率</el-button>
</div>
<!-- 添加 -->
<!-- 表格 --> <!-- 表格 -->
<div> <div>
<el-table :data="tableData" v-if="(tableData.flag = 1)" :height="tableHeight" style="width: 100%">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<!-- 这里有个小bug应该是>0-->
<el-table
:data="tableData"
v-if="(tableData.flag = 1)"
>
<el-table-column
type="index"
label="序号"
width="100px"
fixed="left"
>
<template #default="scope"> <template #default="scope">
<span>{{ <span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
@ -527,7 +448,7 @@ function handleInput(value) {
<el-table-column prop="exchangeRate" label="汇率" :span="2"> <el-table-column prop="exchangeRate" label="汇率" :span="2">
<template #default="scope"> <template #default="scope">
<p> <p>
{{ scope.row.exchangeRate }}{{ scope.row.currency }} 1新币
{{ scope.row.exchangeRate }} 1
</p> </p>
</template> </template>
</el-table-column> </el-table-column>
@ -537,112 +458,93 @@ function handleInput(value) {
<span>{{ formatDate(scope.row.createTime) }}</span> <span>{{ formatDate(scope.row.createTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" :span="3"> <el-table-column label="操作" :span="3">
<template #default="scope"> <template #default="scope">
<el-button type="text" @click="
<el-button
type="text"
@click="
() => { () => {
regeEdit = true regeEdit = true
getEditData(scope.row) getEditData(scope.row)
} }
">编辑</el-button>
<el-popconfirm title="确定将此条活动删除吗?" @confirm="delConfirm">
<template #reference>
<el-button type="primary" text> 删除 </el-button>
</template>
<template #actions="{ confirm, cancel }">
<el-button size="small" @click="cancel">取消</el-button>
<el-button type="primary" size="small" @click="confirm(scope.row)">
确定
</el-button>
</template>
</el-popconfirm>
"
>编辑
</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
<!-- 分页 --> <!-- 分页 -->
<div class="pagination"> <div class="pagination">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
<el-pagination
background
:page-size="getObj.pageSize"
:page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"
></el-pagination>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>
<!-- 这是添加弹窗 -->
<el-dialog v-model="regeAdd" title="新增汇率" width="500" :close-on-click-modal="false">
<!-- 这是编辑弹窗 -->
<el-dialog
v-model="regeEdit"
title="修改汇率"
width="500"
:close-on-click-modal="false"
@close="handleEditDialogClose"
>
<template #footer> <template #footer>
<el-form ref="Ref" style="max-width: 600px" :model="rateAdd" :rules="rules" label-width="auto"
class="demo-ruleForm" :size="formSize" status-icon>
<el-form
ref="editFormRef"
style="max-width: 600px"
:model="rateEdit"
:rules="rules"
label-width="auto"
class="demo-ruleForm"
:size="formSize"
status-icon
>
<el-form-item prop="currency" label="货币名称:"> <el-form-item prop="currency" label="货币名称:">
<el-select v-model.number="rateAdd.currency" placeholder="请选择" style="width: 240px">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
<el-select
v-model="rateEdit.currency"
placeholder="请选择"
style="width: 240px"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="exchangeRate" label="汇率:"> <el-form-item prop="exchangeRate" label="汇率:">
<el-input v-model="rateAdd.exchangeRate" @update:modelValue="handleInput" style="width: 120px" />
<p class="unit">:1</p>
<p>
(提示当前规则每 {{ rateAdd.exchangeRate }}
{{ rateAdd.currency }}可兑换 1 新币)
</p>
</el-form-item>
<el-form-item prop="adminId" label="提交人:">
<el-input :value="adminData.name" disabled style="width: 240px" />
</el-form-item>
<el-form-item prop="startTime" label="开始时间:">
<el-date-picker v-model="rateAdd.startTime" type="date" placeholder="请选择时间" :default-value="new Date()"
@change="handleStartTimeChange" value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item prop="endTime" label="结束时间:">
<el-date-picker v-model="rateAdd.endTime" type="date" placeholder="请选择时间" :default-value="new Date()"
value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item>
<div class="dialog-footer">
<el-button type="primary" @click="throttledAdd">添加</el-button>
<el-button @click="regeAdd = false">取消</el-button>
</div>
</el-form-item>
</el-form>
</template>
</el-dialog>
<!-- 这是编辑弹窗 -->
<el-dialog v-model="regeEdit" title="修改汇率" width="500" :close-on-click-modal="false">
<template #footer>
<el-form ref="ruleFormRef" style="max-width: 600px" :model="rateEdit" :rules="rules" label-width="auto"
class="demo-ruleForm" :size="formSize" status-icon>
<el-form-item label="货币名称:">
<el-select v-model="rateEdit.currency" placeholder="请选择" style="width: 240px">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="汇率:">
<el-input v-model="rateEdit.exchangeRate" style="width: 120px" />
<el-input
v-model="rateEdit.exchangeRate"
@update:modelValue="handleInput"
style="width: 120px"
/>
<p class="unit">:1</p> <p class="unit">:1</p>
<p>
(提示当前规则每 {{ rateEdit.exchangeRate }}
{{ rateEdit.currency }}可兑换 1 新币)
<p class="rate-tip">
(提示当前规则每
<span>{{ rateEdit.exchangeRate }}</span>
<span>{{ rateEdit.currency }}</span>
可兑换 1 新币)
</p> </p>
</el-form-item> </el-form-item>
<el-form-item label="提交人:"> <el-form-item label="提交人:">
<el-input disabled :value="adminData.name" style="width: 240px"/> <el-input disabled :value="adminData.name" style="width: 240px"/>
</el-form-item> </el-form-item>
<el-form-item label="开始时间:">
<el-date-picker v-model="rateEdit.startTime" type="date" placeholder="请选择时间" :default-value="new Date()"
value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item label="结束时间:">
<el-date-picker v-model="rateEdit.endTime" type="date" placeholder="请选择时间" :default-value="new Date()"
value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item> <el-form-item>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button type="primary" @click="edit">修改</el-button> <el-button type="primary" @click="edit">修改</el-button>
<el-button @click="regeEdit = false">取消</el-button>
<el-button @click="cancelEdit">取消</el-button>
</div> </div>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -650,6 +552,7 @@ function handleInput(value) {
</el-dialog> </el-dialog>
</template> </template>
<style scoped> <style scoped>
p { p {
margin: 0px; margin: 0px;
@ -702,4 +605,8 @@ p {
.status { .status {
display: flex; display: flex;
} }
.rate-tip {
hyphens: auto;
}
</style> </style>
Loading…
Cancel
Save