@@ -225,7 +242,8 @@ const approveDialogVisible = ref(false)
const STATUS = {
PENDING: 0, // 待审核
APPROVED: 1, // 通过
- REJECTED: 2 // 驳回
+ REJECTED: 2, // 驳回
+ WAIT_HANDLE: 4 // 待处理(红包)
}
//无法选择的时间
const disabledDate = (time) => {
@@ -302,6 +320,8 @@ const handleSortChange = (column) => {
sortField.value = 'freeGold'
} else if (column.prop === 'taskGold') {
sortField.value = 'task_gold'
+ } else if (column.prop === 'redDiff') {
+ sortField.value = 'red_diff'
} else if (column.prop === 'createTime') {
sortField.value = 'create_time'
} else if (column.prop === 'auditTime') {
@@ -342,6 +362,16 @@ const get = async function (val) {
searchForm.value.startTime = ''
searchForm.value.endTime = ''
}
+
+ const auditStatusNum = Number(searchForm.value.auditStatus)
+ if (
+ !sortField.value &&
+ !sortOrder.value &&
+ (auditStatusNum === STATUS.PENDING || auditStatusNum === STATUS.WAIT_HANDLE)
+ ) {
+ sortField.value = 'create_time'
+ sortOrder.value = 'desc'
+ }
// if (searchForm.value.market === '总部' || searchForm.value.market === '研发部') {
// searchForm.value.market = '';
// }
@@ -393,18 +423,27 @@ const handleApproveConfirm = async () => {
const params = {
orderCode: currentRecord.value.orderCode,
auditId: adminData.value.id,
- action: 1,// action的1是通过,2是驳回
- rejectReason: ''
+ action: 1, // action的1是通过,2是驳回
+ rejectReason: '',
+ price: currentRecord.value.price,
+ linkId: currentRecord.value.linkId
+ }
+ const res = await API({ url: '/audit/audit', data: params })
+ if (res && res.success === false) {
+ ElMessage.error(res.message || '红包退票失败')
+ } else if (res && res.success === true) {
+ ElMessage.success(t('elmessage.approveSuccess'))
+ } else {
+ ElMessage.error(res.msg || t('elmessage.operationFailed'))
}
- await API({ url: '/audit/audit', data: params })
- ElMessage.success(t('elmessage.approveSuccess'))
approveDialogVisible.value = false
await get()
- clicked.value = false
await getStats()
} catch (error) {
console.error(t('elmessage.approveFailed'), error)
ElMessage.error(t('elmessage.operationFailed'))
+ } finally {
+ clicked.value = false
}
}
import _ from 'lodash';
@@ -608,6 +647,14 @@ const handleButtonClick = function (name) {
return
}
adminReject()
+ } else if (name === 'change') {
+ if (!hasrefundWait) {
+ ElMessage.error(t('elmessage.noPermission'))
+ return
+ }
+ if (hasrefundWaitShow) {
+ adminChange()
+ }
}
}
// const handleClick = function (tab, event) {
@@ -641,10 +688,19 @@ const adminWait = async function () {
await get()
await getStats()
}
+// 待处理(红包)
+const adminChange = async function () {
+ checkTab.value = 'change'
+ searchForm.value.auditStatus = STATUS.WAIT_HANDLE
+ await get()
+ await getStats()
+}
// 已通过
const adminPass = async function () {
checkTab.value = 'pass'
searchForm.value.auditStatus = STATUS.APPROVED
+ sortField.value = ''
+ sortOrder.value = ''
await get()
await getStats()
}
@@ -652,6 +708,8 @@ const adminPass = async function () {
const adminReject = async function () {
checkTab.value = 'reject'
searchForm.value.auditStatus = STATUS.REJECTED
+ sortField.value = ''
+ sortOrder.value = ''
await get()
await getStats()
}
@@ -828,4 +886,4 @@ onMounted(async () => {
}
}
}
-
\ No newline at end of file
+
diff --git a/src/views/consume/gold/addCoinConsume.vue b/src/views/consume/gold/addCoinConsume.vue
index b82da36..9de4d8f 100644
--- a/src/views/consume/gold/addCoinConsume.vue
+++ b/src/views/consume/gold/addCoinConsume.vue
@@ -76,6 +76,19 @@ const rules = reactive({
{ required: true, message: t('elmessage.noEmptySumGold'), trigger: "blur" },
{
validator: (rule, value, callback) => {
+ // 如果使用了红包,且红包总额抵扣完了原价,允许为0
+ if (addConsume.value.redMoney === 1) {
+ const price = Number(addConsume.value.price || 0)
+ const redAmount = totalRedAmount.value
+ if (redAmount >= price) {
+ // 如果红包抵扣完了,允许0
+ if (parseFloat(value) === 0 || value === 0) {
+ callback();
+ return;
+ }
+ }
+ }
+
// 允许0开头的小数(如0.1)但不允许单独的0
const isValid = /^(0\.\d{1,2})|([1-9]\d*(\.\d{1,2})?)$/.test(value);
@@ -161,10 +174,18 @@ function validateInput() {
}
- // 验证金币总和(不考虑红包)
- const totalAvailableGold = user.value.nowSumGold;
+ // 验证金币总和
+ const totalAvailableGold = (user.value.nowSumGold)
+ // 校验消耗金币数是否超过可用金币数
if (user.value.jwcode && sumGold > totalAvailableGold) {
- ElMessage.error(t('elmessage.limitExceeded'));
+ if (addConsume.value.redMoney === 1) {
+ ElMessage.error('红包抵扣额不足');
+ // 如果红包额不足,清空已选红包
+ selectedReds.value = []
+ } else {
+ ElMessage.error(t('elmessage.limitExceeded'));
+ }
+ // 将sumGold设置为null
addConsume.value.sumGold = null;
return false;
}
@@ -175,9 +196,27 @@ function validateInput() {
// 仅在鼠标离开(blur)时校验:sumGold 是否为有效值(无红包逻辑)
function validateRedLimit() {
const sumGold = parseFloat(addConsume.value.sumGold);
- if (isNaN(sumGold) || sumGold <= 0) {
- ElMessage.error(t('elmessage.noEmptySumGold'));
- return false;
+ const price = Number(addConsume.value.price || 0);
+ // 优先使用选中的红包总额,如果没有选中(可能是旧逻辑),则使用user.red
+ const redAmount = (addConsume.value.redMoney == 1 && selectedReds.value.length > 0)
+ ? totalRedAmount.value
+ : (addConsume.value.redMoney == 1 ? Number(user.value.red || 0) : 0);
+
+ if (!isNaN(price) && price > 0) {
+ // 如果红包足额,允许sumGold为0
+ const isCovered = redAmount >= price;
+
+ if (isNaN(sumGold) || (sumGold <= 0 && !isCovered)) {
+ ElMessage.error(t('elmessage.noEmptySumGold'));
+ return false;
+ }
+ // 如果勾选使用红包,才需要校验消耗金币数 + 红包抵扣金额 ≥ 原价
+ if (addConsume.value.redMoney == 1) {
+ if (sumGold + redAmount < price) {
+ ElMessage.error(t('elmessage.limitRedAmount'));
+ return false;
+ }
+ }
}
return true;
}
@@ -194,13 +233,13 @@ function calculateCoins(sumGold) {
let remaining = parsedSumGold;
let freeUsed = 0, permanentUsed = 0, taskUsed = 0;
- // 1. 优先消耗免费金币
+ // 先消耗免费金币
if (remaining > 0 && nowFreeGold > 0) {
freeUsed = Math.min(parseFloat(nowFreeGold.toFixed(4)), remaining);
remaining = parseFloat((remaining - freeUsed).toFixed(4));
}
- // 2. 其次消耗永久金币
+ // 再消耗永久金币
if (remaining > 0 && nowPermanentGold > 0) {
permanentUsed = Math.min(parseFloat(nowPermanentGold.toFixed(4)), remaining);
remaining = parseFloat((remaining - permanentUsed).toFixed(4));
@@ -208,7 +247,8 @@ function calculateCoins(sumGold) {
// 3. 最后消耗任务金币
if (remaining > 0 && nowTaskGold > 0) {
- taskUsed = Math.min(parseFloat(nowTaskGold.toFixed(4)), remaining);
+ const availableTaskGold = parseFloat(nowTaskGold.toFixed(4));
+ taskUsed = Math.min(availableTaskGold, remaining);
remaining = parseFloat((remaining - taskUsed).toFixed(4));
}
@@ -259,7 +299,9 @@ const add = async function () {
permanentGold: addConsume.value.permanentGold * 100,
goodsName: addConsume.value.goodsName.value,
remark: addConsume.value.remark,
- adminName: adminData.value.adminName
+ adminName: adminData.value.adminName,
+ redMoney: Number(addConsume.value.redMoney), // 1-使用红包,0-不使用红包
+ redIds: addConsume.value.redMoney === 1 ? selectedReds.value.map(item => item.id) : [] // 选中的红包ID数组
}
})
addDisabled.value = false
@@ -312,6 +354,10 @@ function resetForm() {
adminId: adminData.value.id,
adminName: adminData.value.adminName
}
+
+ // 清空红包相关数据
+ selectedReds.value = []
+ redList.value = []
console.log("重置表单")
@@ -334,8 +380,9 @@ function resetForm() {
nowSumGold: null
}
- // 重置后不再触发校验提示
- Ref.value.clearValidate()
+ if (Ref.value) {
+ Ref.value.clearValidate()
+ }
}
// 充值对话框显示状态
@@ -449,53 +496,47 @@ const getUser = async function (jwcode) {
});
console.log("请求成功", result);
- const { code, data } = result
- const region = data && data.market
-
- if (!data || Object.keys(data).length === 0) {
- user.value = {}
- // addConsume.value.jwcode = null // Optional: clear input or keep it for correction
- ElMessage.error(t('elmessage.jwcodeError'))
- return
- }
- // 处理用户数据
- user.value = {
- ...data,
- // 统一处理所有黄金数值,除以100
- nowPermanentGold: data.nowPermanentGold,
- nowFreeGold: data.nowFreeGold,
- nowSumGold: data.nowSumGold,
- nowTaskGold: data.nowTaskGold,
- nowFreeJune: data.nowFreeJune,
- nowFreeDecember: data.nowFreeDecember,
- historySumGold: data.historySumGold,
- historyPermanentGold: data.historyPermanentGold,
- historyFreeGold: data.historyFreeGold,
- historyTaskGold: data.historyTaskGold
- };
-
- // 检查sumGold是否有值,如果有则重新计算金币分配
- if (addConsume.value.sumGold) {
- const parsedSumGold = parseFloat(addConsume.value.sumGold);
- if (!isNaN(parsedSumGold) && parsedSumGold > 0) {
- const { free, permanent, task } = calculateCoins(parsedSumGold);
- addConsume.value.freeGold = free;
- addConsume.value.permanentGold = permanent;
- addConsume.value.taskGold = task;
+ if (result.code === 200 && result.data) {
+ // 查询成功后,重置表单(保留精网号),防止上一个用户的数据干扰
+ const currentJwcode = addConsume.value.jwcode;
+ resetForm();
+ addConsume.value.jwcode = currentJwcode;
+
+ // 处理用户数据
+ user.value = {
+ ...result.data,
+ // 统一处理所有黄金数值,除以100
+ nowPermanentGold: result.data.nowPermanentGold,
+ nowFreeGold: result.data.nowFreeGold,
+ nowSumGold: result.data.nowSumGold,
+ nowTaskGold: result.data.nowTaskGold,
+ nowFreeJune: result.data.nowFreeJune,
+ nowFreeDecember: result.data.nowFreeDecember,
+ historySumGold: result.data.historySumGold,
+ historyPermanentGold: result.data.historyPermanentGold,
+ historyFreeGold: result.data.historyFreeGold,
+ historyTaskGold: result.data.historyTaskGold
+ };
+
+ ElMessage.success(t('elmessage.searchSuccess'));
+
+ // 如果当前开启了红包模式,获取红包列表
+ if (addConsume.value.redMoney === 1) {
+ getRedList()
}
- }
- if (code === 0 && region) {
- ElMessage.info({
- message: t('elmessage.userRegionHint', { region }),
- customClass: 'custom-blue-message'
- })
- return
+ // 验证输入
+ validateInput()
+
+ } else if (!result.data) {
+ ElMessage.warning(t('elmessage.noUser'));
+ user.value.jwcode = null
+ addConsume.value.jwcode = null
+ // resetForm(); // 重置表单
+ } else {
+ ElMessage.warning(result.msg || t('elmessage.checkQueryParams'));
}
-
- ElMessage.success(t('elmessage.searchSuccess'));
-
} catch (error) {
console.error("请求失败", error);
ElMessage.error(t('elmessage.jwcodeError'));
@@ -534,7 +575,7 @@ watch(
() => addConsume.value.sumGold,
(newValue) => {
const parsedNewValue = parseFloat(newValue);
- if (!isNaN(parsedNewValue) && parsedNewValue > 0 && user.value.jwcode) {
+ if (!isNaN(parsedNewValue) && parsedNewValue >= 0) {
const { free, permanent, task } = calculateCoins(parsedNewValue);
addConsume.value.freeGold = free;
addConsume.value.permanentGold = permanent;
@@ -562,6 +603,108 @@ watch(
/* 红包逻辑已在当前分支移除 */
/*
+====================红包逻辑=================================
+*/
+// 红包列表
+const redList = ref([])
+// 选中的红包
+const selectedReds = ref([])
+
+// 获取红包列表
+const getRedList = async () => {
+ // 必须先有查询到的用户信息
+ if (!user.value.jwcode) return
+ try {
+ const result = await request({
+ url: "/Temporary/RedList",
+ data: { jwcode: user.value.jwcode }
+ })
+ console.log("红包列表", result)
+ if (result.code === 200) {
+ redList.value = result.data || []
+ }
+ } catch (error) {
+ console.error("获取红包列表失败", error)
+ }
+}
+
+// 监听是否使用红包
+watch(() => addConsume.value.redMoney, (val) => {
+ // 切换模式时,清除sumGold的验证状态,防止之前的错误提示残留
+ if (Ref.value) {
+ Ref.value.clearValidate('sumGold')
+ }
+
+ if (val === 1) {
+ if (!user.value.jwcode) {
+ if (addConsume.value.jwcode) {
+ ElMessage.warning(t('elmessage.checkUserInfo'))
+ }
+ redList.value = []
+ selectedReds.value = []
+ addConsume.value.sumGold = null
+ return
+ }
+
+ selectedReds.value = []
+ getRedList()
+ // 初始消耗金币等于原价(未选红包时)
+ if (addConsume.value.price) {
+ addConsume.value.sumGold = addConsume.value.price
+ } else {
+ addConsume.value.sumGold = null
+ }
+ } else {
+ selectedReds.value = []
+ addConsume.value.sumGold = null
+ }
+})
+
+// 计算已选红包总额
+const totalRedAmount = computed(() => {
+ return selectedReds.value.reduce((sum, item) => {
+ // 根据实际接口返回,使用 discount 字段
+ const amount = Number(item.discount || 0)
+ return sum + amount
+ }, 0)
+})
+
+// 监听选中红包变化,计算剩余金币
+watch(selectedReds, () => {
+ if (addConsume.value.redMoney === 1) {
+ const price = Number(addConsume.value.price || 0)
+ const redTotal = totalRedAmount.value
+ // 剩余需要消耗的金币
+ let remaining = price - redTotal
+ if (remaining < 0) remaining = 0
+
+ addConsume.value.sumGold = remaining
+ }
+}, { deep: true })
+
+// 判断红包选项是否禁用
+const isRedOptionDisabled = (item) => {
+ // 如果已经选中,不禁用(允许取消)
+ if (selectedReds.value.some(r => r.id === item.id)) return false
+
+ const price = Number(addConsume.value.price || 0)
+ // 如果当前总额已经大于等于原价,则不能再选新的
+ if (totalRedAmount.value >= price) return true
+
+ return false
+}
+
+// 监听原价变化(比如换了商品),如果在红包模式下,需要重新计算
+watch(() => addConsume.value.price, (newPrice) => {
+ if (addConsume.value.redMoney === 1) {
+ const redTotal = totalRedAmount.value
+ let remaining = (newPrice || 0) - redTotal
+ if (remaining < 0) remaining = 0
+ addConsume.value.sumGold = remaining
+ }
+})
+
+/*
====================挂载=================================
*/
// 挂载
@@ -596,7 +739,31 @@ onMounted(async function () {
-
+
+ 使用红包
+ 不使用红包
+
+
+
+
+
+
+
+ 已抵扣: {{ totalRedAmount }}
+
diff --git a/src/views/refund/gold/addCoinRefund.vue b/src/views/refund/gold/addCoinRefund.vue
index cde8e78..37bf1ca 100644
--- a/src/views/refund/gold/addCoinRefund.vue
+++ b/src/views/refund/gold/addCoinRefund.vue
@@ -39,6 +39,8 @@ const addRefund = ref({
taskGold: '',
sumGold: 0,
remark: '',
+ price: '',
+ linkId: '',
adminId: adminData.value.id,
adminName: adminData.value.name,
orderCode: '',
@@ -57,6 +59,8 @@ const cancel = function () {
taskGold: '',
sumGold: 0,
remark: '',
+ price: '',
+ linkId: '',
adminId: adminData.value.id,
orderCode: '',
}
@@ -72,6 +76,8 @@ const getRefund = async function () {
addRefund.value.permanentGold = ''
addRefund.value.freeGold = ''
addRefund.value.taskGold = ''
+ addRefund.value.price = ''
+ addRefund.value.linkId = ''
let type = null
if (addRefund.value.refundType === '商品退款') {
type = 1
@@ -132,7 +138,9 @@ const add = async function () {
permanentGold: addRefund.value.permanentGold * 100,
freeGold: addRefund.value.freeGold * 100,
taskGold: addRefund.value.taskGold * 100,
- sumGold: addRefund.value.sumGold * 100
+ sumGold: addRefund.value.sumGold * 100,
+ price: addRefund.value.price * 100,
+ linkId: addRefund.value.linkId
}
console.log('提交的退款信息', processedRefund)
addDisabled.value = true
@@ -210,7 +218,7 @@ const rules = reactive({
{ required: true, message: t('elmessage.checkPayModel'), trigger: 'blur' },
{
validator: (rule, value) => {
- if (value === 0) {
+ if (addRefund.value.refundModel === 1 && value === 0) {
return Promise.reject(new Error(t('elmessage.noTotalGoldZero')))
}
return Promise.resolve()
@@ -309,6 +317,8 @@ const handleOrderChange = (orderCode) => {
const order = tableData.value.find(item => item.orderCode === orderCode)
if (order) {
addRefund.value.goodsName = order.goodsName
+ addRefund.value.price = Number(order.price || 0) / 100
+ addRefund.value.linkId = order.linkId || ''
if (addRefund.value.refundType === '金币退款') {
selectedGoodsGold.value = {
permanentGold: Number(order.permanentGold) || 0,
@@ -333,6 +343,8 @@ const handleOrderChange = (orderCode) => {
}
} else {
addRefund.value.goodsName = ''
+ addRefund.value.price = ''
+ addRefund.value.linkId = ''
selectedGoodsGold.value = {
permanentGold: 0,
freeGold: 0,
@@ -355,6 +367,8 @@ const restGoods = () => {
addRefund.value.permanentGold = ''
addRefund.value.freeGold = ''
addRefund.value.taskGold = ''
+ addRefund.value.price = ''
+ addRefund.value.linkId = ''
}
// 处理退款方式切换
@@ -365,6 +379,9 @@ const handleRefundModelChange = () => {
addRefund.value.freeGold = selectedGoodsGold.value.freeGold.toString();
addRefund.value.taskGold = selectedGoodsGold.value.taskGold.toString();
}
+ if (Ref.value) {
+ Ref.value.clearValidate('sumGold')
+ }
}
// 统一的输入处理函数