Browse Source

Merge branch 'refs/heads/lihui/feature-20250623144029-金币前端lihui' into milestone-20250623-金币前端

lihui/feature-20250623144029-金币前端lihui
lihui 7 days ago
parent
commit
fa25cb17df
  1. 376
      src/views/consume/addCoinConsume.vue
  2. 3
      src/views/consume/coinConsumeDetail.vue

376
src/views/consume/addCoinConsume.vue

@ -1,10 +1,10 @@
<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 {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 axios from "axios";
import { ElMessageBox } from "element-plus";
import {ElMessageBox} from "element-plus";
import moment from "moment"; import moment from "moment";
import _ from "lodash"; import _ from "lodash";
@ -15,7 +15,8 @@ const trimJwCode = () => {
addConsume.value.jwcode = addConsume.value.jwcode.replace(/\s/g, ''); addConsume.value.jwcode = addConsume.value.jwcode.replace(/\s/g, '');
} }
} }
//
//
const adminData = ref({}); const adminData = ref({});
const getAdminData = async function () { const getAdminData = async function () {
try {//await try {//await
@ -33,51 +34,189 @@ const getAdminData = async function () {
} }
}; };
//
//
const user = ref({
name: "",
jwcode: 0,
market: "",
historySumGold: 0,
historyPermanentGold: 0,
historyFreeGold: 0,
historyTaskGold: 0,
rechargeNum: 0,
consumeNum: 0,
firstRecharge: "",
nowPermanentGold: 0,
nowFreeJune: null,
nowTaskGold: 0,
nowFreeDecember: null,
nowFreeGold: 0,
nowSumGold: 0
})
//
const addConsume = ref({ const addConsume = ref({
freeCoin: 0,
rechargeCoin: 0,
taskCoin: 0,
updateType: "1",
indexName:"", //
jwcode:0, //
goodsName: "",// // todo 3
sumGold: 0, //
freeGold: 0, //
permanentGold: 0, //
taskGold: 0, //
remark: "",//
adminId: 0,// id
// updateType: "1", ,
// indexName: "", //
}); });
//
// 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("");
//
// //
// }
// };
// //
const add = async function () { const add = async function () {
try { 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.productName = indexs.value.productName;
//
if (!validateInput()) {
return;
}
//
formatConsumeData();
// POST // POST
const result = await request({ const result = await request({
url: "/consume/add", url: "/consume/add",
data: addConsume.value, data: addConsume.value,
}); });
if (result.code === 0) {
ElMessage.error(result.msg);
return;
} else {
//
handleResponse(result);
//
resetForm();
} catch (error) {
console.error("请求失败", error);
ElMessage.error("添加失败,请检查网络连接或联系管理员");
}
};
//
function validateInput() {
const { sumGold, freeGold, permanentGold, taskGold } = addConsume.value;
//
if (sumGold <= 0) {
ElMessage.error("消费金币总数必须大于0");
return false;
}
//
const totalAvailableGold = freeGold + permanentGold + taskGold;
if (sumGold > totalAvailableGold) {
ElMessage.error("消费金币总数超过可用金币总和");
return false;
}
return true;
}
//
function formatConsumeData() {
//
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);
// 使
const { usedFreeGold, usedPermanentGold, usedTaskGold } =
calculateCoins(
addConsume.value.sumGold,
addConsume.value.freeGold,
addConsume.value.permanentGold,
addConsume.value.taskGold
);
// 使
addConsume.value.usedFreeGold = usedFreeGold;
addConsume.value.usedPermanentGold = usedPermanentGold;
addConsume.value.usedTaskGold = usedTaskGold;
}
//
function handleResponse(result) {
if (result.code !== 0) {
ElMessage.success("添加成功"); ElMessage.success("添加成功");
console.log("请求成功", result);
} else {
ElMessage.error(result.msg || "添加失败,未知错误");
} }
//
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;
}
//
function resetForm() {
addConsume.value = {
jwcode: 0,
goodsName: "",
sumGold: 0,
freeGold: 0,
permanentGold: 0,
taskGold: 0,
remark: "",
adminId: adminData.value.adminId,
adminName: adminData.value.adminName,
freeCoin: 0,
rechargeCoin: 0,
taskCoin: 0,
};
indexs.value = {}; indexs.value = {};
console.log("请求成功", result);
user.value = {}; user.value = {};
} catch (error) {
console.log("请求失败", error);
ElMessage.error("添加失败,请检查输入内容是否正确");
}
//
}
};
const addBefore = () => { const addBefore = () => {
Ref.value.validate(async (valid) => { Ref.value.validate(async (valid) => {
if (valid) { if (valid) {
@ -119,17 +258,18 @@ const checkFreeGoldRadio = function (rule, value, callback) {
callback(); callback();
} }
}; };
const rules = reactive({ const rules = reactive({
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" }],
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: [ rechargeCoin: [
{ required: true, message: "请输入免费金币", trigger: "blur" },
{required: true, message: "请输入免费金币", trigger: "blur"},
], ],
allGold: [ allGold: [
{ required: true, message: "消费金币总数不能为空", trigger: "blur" },
{ validator: checkFreeGoldRadio, trigger: "blur" },
{required: true, message: "消费金币总数不能为空", trigger: "blur"},
{validator: checkFreeGoldRadio, trigger: "blur"},
], ],
indexName: [ indexName: [
{ {
@ -158,18 +298,21 @@ const delteConsume = function () {
isHC.value = 0; isHC.value = 0;
}; };
// //
const user = ref({
firstRechargeTime: "",
});
// const user = ref({
// firstRechargeTime: "",
// });
//
const getUser = async function (jwcode) { const getUser = async function (jwcode) {
trimJwCode(); trimJwCode();
try { try {
// POST // POST
const result = await request({ const result = await request({
url: "/recharge/user",
url: "user/selectUser",
data: { data: {
//
jwcode: addConsume.value.jwcode, jwcode: addConsume.value.jwcode,
area: adminData.value.area,
// area: adminData.value.area,
}, },
}); });
console.log("请求成功", result); console.log("请求成功", result);
@ -177,10 +320,11 @@ const getUser = async function (jwcode) {
if (result.code === 0) { if (result.code === 0) {
ElMessage.error(result.msg); ElMessage.error(result.msg);
} else { } else {
user.value = result.data; user.value = result.data;
user.value.A =
/* user.value.A =
Number(user.value.pendingRechargeTimes) + Number(user.value.pendingRechargeTimes) +
Number(user.value.pendingSpendTimes);
Number(user.value.pendingSpendTimes);*/
console.log("用户信息", user.value); console.log("用户信息", user.value);
ElMessage.success(result.msg); ElMessage.success(result.msg);
} }
@ -192,7 +336,9 @@ const getUser = async function (jwcode) {
}; };
//
// ?
/*//下面这个也是校验精网号是否存在的方法通过脱离文本框实现但是上面方法绑定了信息面板在输入正确的精网号后能显示
// //
const userGold = ref({}); const userGold = ref({});
const getUserGold = async function (jwcode) { const getUserGold = async function (jwcode) {
@ -200,7 +346,7 @@ const getUserGold = async function (jwcode) {
try { try {
// POST // POST
const result = await request({ const result = await request({
url: "/recharge/user",
// url: "/recharge/user",
data: { data: {
jwcode: addConsume.value.jwcode, jwcode: addConsume.value.jwcode,
area: adminData.value.area, area: adminData.value.area,
@ -223,8 +369,50 @@ const getUserGold = async function (jwcode) {
addConsume.value.jwcode = ""; 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() { function calculateCoins() {
if ( if (
(userGold.value.coreJb + (userGold.value.coreJb +
@ -276,6 +464,7 @@ function calculateCoins() {
console.log("计算结果", addConsume.value); console.log("计算结果", addConsume.value);
} }
} }
*/
// //
const goods = ref([]); const goods = ref([]);
@ -283,7 +472,7 @@ const getGoods = async function () {
try { try {
// POST // POST
const result = await request({ const result = await request({
url: "/product",
// url: "/product", // todo 3
data: {}, data: {},
}); });
// //
@ -298,11 +487,12 @@ const getGoods = async function () {
}; };
// //
const index = ref([]); const index = ref([]);
const getIndexs = async function (type) {
// todo
/*const getIndexs = async function (type) {
try { try {
// POST // POST
const result = await request({ const result = await request({
url: "/product/index",
// url: "/product/index",
data: { data: {
type: type, type: type,
}, },
@ -315,10 +505,11 @@ const getIndexs = async function (type) {
console.log("请求失败", error); console.log("请求失败", error);
// //
} }
};
};*/
// //
const isHC = ref(0); const isHC = ref(0);
// const handleProductSelect = (productName) => { // const handleProductSelect = (productName) => {
// // // //
// // indexs.value.productName = productName; // // indexs.value.productName = productName;
@ -332,7 +523,9 @@ const isHC = ref(0);
// addConsume.value.indexName = ""; // addConsume.value.indexName = "";
// } // }
// }; // };
const indexs = ref([]); const indexs = ref([]);
// const handleIndexSelect = () => { // const handleIndexSelect = () => {
// if (isHC.value === 1 && addConsume.value.indexName) { // if (isHC.value === 1 && addConsume.value.indexName) {
// addConsume.value.productName = "homilychart" + addConsume.value.indexName; // addConsume.value.productName = "homilychart" + addConsume.value.indexName;
@ -359,6 +552,7 @@ const queryIndexSearch = (queryString, cb) => {
cb(results); cb(results);
}; };
// todo homilychart homilyChart
// //
const handleProductSelect = async (selectedItem) => { const handleProductSelect = async (selectedItem) => {
const productName = typeof selectedItem === 'string' const productName = typeof selectedItem === 'string'
@ -398,8 +592,6 @@ const handleIndexBlur = (e) => {
}; };
// //
onMounted(async function () { onMounted(async function () {
await getAdminData(); await getAdminData();
@ -425,7 +617,7 @@ const handleSelectBlur = (value) => {
<template> <template>
<div>
<div>
<!-- 根据activeTab切换显示内容 --> <!-- 根据activeTab切换显示内容 -->
@ -441,21 +633,30 @@ const handleSelectBlur = (value) => {
style="max-width: 750px;" style="max-width: 750px;"
class="form-style" class="form-style"
> >
<!-- todo 添加错误提示-->
<el-form-item prop="jwcode" label="精网号"> <el-form-item prop="jwcode" label="精网号">
<el-input
<!-- <el-input
v-model="addConsume.jwcode" v-model="addConsume.jwcode"
style="width: 220px" style="width: 220px"
@change="getUserGold(addConsume.jwcode)" @change="getUserGold(addConsume.jwcode)"
/>-->
<el-input
v-model="addConsume.jwcode"
style="width: 220px"
/> />
<el-button <el-button
type="primary" type="primary"
@click="getUser(addConsume.jwcode)" @click="getUser(addConsume.jwcode)"
style="margin-left: 20px" style="margin-left: 20px"
>查询</el-button
>查询
</el-button
> >
</el-form-item> </el-form-item>
<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 <el-autocomplete
v-model="addConsume.productName" v-model="addConsume.productName"
:fetch-suggestions="queryProductSearch" :fetch-suggestions="queryProductSearch"
@ -496,14 +697,17 @@ const handleSelectBlur = (value) => {
<el-form-item label="指标" v-else style="flex:1;margin-left: -5px;"> <el-form-item label="指标" v-else style="flex:1;margin-left: -5px;">
<el-input disabled placeholder="无" style="width: 100px" /> <el-input disabled placeholder="无" style="width: 100px" />
</el-form-item> --> </el-form-item> -->
</div>
<el-form-item prop="allGold" label="消费金币总数" >
</div>
<el-form-item prop="allGold" label="消费金币总数">
<el-input <el-input
v-model="addConsume.allGold" v-model="addConsume.allGold"
style="width: 100px" style="width: 100px"
@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="rechargeCoin" label="永久金币" style="float: left">
<el-input <el-input
@ -534,6 +738,7 @@ const handleSelectBlur = (value) => {
<p style="margin-right: 20px"></p> <p style="margin-right: 20px"></p>
</el-form-item> </el-form-item>
</div> </div>
<el-form-item prop="remark" label="备注"> <el-form-item prop="remark" label="备注">
<el-input <el-input
v-model="addConsume.remark" v-model="addConsume.remark"
@ -544,6 +749,7 @@ const handleSelectBlur = (value) => {
type="textarea" type="textarea"
/> />
</el-form-item> </el-form-item>
<el-form-item prop="commitName" label="提交人"> <el-form-item prop="commitName" label="提交人">
<el-input <el-input
style="width: 300px" style="width: 300px"
@ -552,10 +758,14 @@ const handleSelectBlur = (value) => {
placeholder="提交人姓名" placeholder="提交人姓名"
/> />
</el-form-item> </el-form-item>
<el-button type="success" @click="delteConsume" style="margin-left: 280px">重置</el-button> <el-button type="success" @click="delteConsume" 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>
<!-- todo 这里少客户信息栏的卸载 -->
<!-- 客户信息栏 --> <!-- 客户信息栏 -->
<el-card style="width: 850px; float: right" class="customer-info"> <el-card style="width: 850px; float: right" class="customer-info">
<el-form <el-form
@ -574,8 +784,9 @@ const handleSelectBlur = (value) => {
<el-col :span="14"> <el-col :span="14">
<el-form-item label="历史金币总数"> <el-form-item label="历史金币总数">
<!-- 检查 user.totalRechargeGold 是否为有效的数字 --> <!-- 检查 user.totalRechargeGold 是否为有效的数字 -->
<p v-if="!isNaN(Number(user.totalRechargeGold))">
{{ Number(user.totalRechargeGold / 100) }}
<p v-if="!isNaN(Number(user.historySumGold))">
<!-- {{ Number(user.historySumGold / 100) }}-->
{{ Number(user.historySumGold) }}
</p> </p>
<!-- 如果不是有效的数字显示默认值 --> <!-- 如果不是有效的数字显示默认值 -->
<p v-else></p> <p v-else></p>
@ -590,30 +801,29 @@ const handleSelectBlur = (value) => {
<el-form-item label="当前金币总数" style="width: 500px"> <el-form-item label="当前金币总数" style="width: 500px">
<span <span
style="color: #2fa1ff; margin-right: 5px" style="color: #2fa1ff; margin-right: 5px"
v-if="user.buyJb !== undefined"
>{{
(user.buyJb + user.free6 + user.free12 + user.coreJb) / 100
}}</span
v-if="user.nowSumGold !== undefined"
>
{{ user.nowSumGold }}</span
> >
<span <span
style="display: inline; white-space: nowrap; color: #b1b1b1" style="display: inline; white-space: nowrap; color: #b1b1b1"
v-if="user.buyJb !== undefined"
>(永久金币:{{ user.buyJb / 100 }};免费金币:{{
(user.free6 + user.free12) / 100
}};任务金币:{{ user.coreJb / 100 }})</span
>
v-if="user.nowSumGold !== undefined"
>(永久金币:{{ user.nowPermanentGold }};免费金币:{{
(user.nowFreeGold)
}};任务金币:{{ user.nowTaskGold }})</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="10">
<el-form-item label="首次充值日期"> <el-form-item label="首次充值日期">
<p v-if="user.firstRechargeDate">
{{ moment(user.firstRechargeDate).format("YYYY-MM-DD HH:mm:ss") }}
<p v-if="user.firstRecharge">
{{ moment(user.firstRecharge).format("YYYY-MM-DD HH:mm:ss") }}
</p> </p>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="14"> <el-col :span="14">
<el-form-item label="充值次数"> <el-form-item label="充值次数">
<p style="color: #2fa1ff">{{ user.rechargeTimes }}</p>
<p style="color: #2fa1ff">{{ user.rechargeNum }}</p>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="10"> <!-- <el-col :span="10">
@ -623,12 +833,12 @@ const handleSelectBlur = (value) => {
</el-col> --> </el-col> -->
<el-col :span="10"> <el-col :span="10">
<el-form-item label="消费次数"> <el-form-item label="消费次数">
<p style="color: #2fa1ff">{{ user.spendTimes }}</p>
<p style="color: #2fa1ff">{{ user.consumeNum }}</p>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="10">
<el-form-item label="所属门店"> <el-form-item label="所属门店">
<p>{{ adminData.area }}</p>
<p>{{ user.market }}</p>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="14"> <el-col :span="14">
@ -641,15 +851,19 @@ const handleSelectBlur = (value) => {
</el-row> </el-row>
</el-form> </el-form>
</el-card> </el-card>
</div> </div>
<!-- 金币消耗明细的布局------------------------------------------------------- --> <!-- 金币消耗明细的布局------------------------------------------------------- -->
<!-- <div v-else-if="activeTab === 'detail'"> --> <!-- <div v-else-if="activeTab === 'detail'"> -->
<!-- </div> <!-- </div>
</div> --> </div> -->
</template> </template>
<style scoped> <style scoped>
p { p {
margin: 0px; margin: 0px;

3
src/views/consume/coinConsumeDetail.vue

@ -46,6 +46,7 @@ const area = ref([])
const activeName = ref('all') const activeName = ref('all')
// //
// todo
const consumePlatform = [ const consumePlatform = [
{ {
value: '4', value: '4',
@ -104,6 +105,7 @@ const get = async function (val) {
console.log('搜索参数', getObj.value) console.log('搜索参数', getObj.value)
// POST // POST
const result = await request({ const result = await request({
// todo redis ?
url: '/consume/select', url: '/consume/select',
data: { data: {
...getObj.value, ...getObj.value,
@ -304,6 +306,7 @@ const getArea = async function () {
try { try {
// //
const result = await request({ const result = await request({
// todo
url: '/area/list', url: '/area/list',
data: {} data: {}
}) })

Loading…
Cancel
Save