Browse Source

Merge branch 'milestone-20251215-多语言二期2' of http://39.101.133.168:8807/huangqizhen/gold-vue into zhangyong/feature-20260113094820-现金重构

zhangyong/feature-20260113094820-现金重构
ZhangYong 1 month ago
parent
commit
5defb66e35
  1. 1
      .gitignore
  2. 11
      src/components/locales/lang/en.js
  3. 11
      src/components/locales/lang/zh-CN.js
  4. 84
      src/views/audit/gold/refundAudit.vue
  5. 279
      src/views/consume/gold/addCoinConsume.vue
  6. 77
      src/views/moneyManage/financialAccount/cashFlow.vue
  7. 21
      src/views/refund/gold/addCoinRefund.vue
  8. 1
      vite.config.ts

1
.gitignore

@ -26,3 +26,4 @@ dist-ssr
# 忽略 # 忽略
stats.html stats.html
.env.development .env.development

11
src/components/locales/lang/en.js

@ -462,7 +462,7 @@ export default {
permanentGold: "Perm Coins", permanentGold: "Perm Coins",
freeGold: "Free Coins", freeGold: "Free Coins",
taskGold: "Task Coins", taskGold: "Task Coins",
rechargePlatform: "Recharge Plat",
rechargePlatform: "Recharge Platform",
consumePlatform: "Consume Plat", consumePlatform: "Consume Plat",
consumeTotalGold: "Total Consumed", consumeTotalGold: "Total Consumed",
payModel: "Payment", payModel: "Payment",
@ -530,6 +530,10 @@ export default {
disable: "Disable", disable: "Disable",
received: "Received", received: "Received",
rejected: "Rejected", rejected: "Rejected",
refunded: "Refunded",
refundDetail: "Refund Detail",
refundAmount: "Refund Amt",
refundCurrency: "Refund Curr",
}, },
// Common Export Fields // Common Export Fields
common_export: { common_export: {
@ -616,6 +620,11 @@ export default {
receiveAreaPlaceholder: "Select region", receiveAreaPlaceholder: "Select region",
price: "Price", price: "Price",
goodsNamePlaceholder: "Select product", goodsNamePlaceholder: "Select product",
使用红包: "Use Red Envelope",
不使用红包: "Do Not Use Red Envelope",
选择红包: "Select Red Envelope",
请选择红包: "Please Select Red Envelope",
已抵扣: "Already Deducted",
payModel: "Collection", payModel: "Collection",
refundType: "Refund Type", refundType: "Refund Type",
refundTypePlaceholder: "Select type", refundTypePlaceholder: "Select type",

11
src/components/locales/lang/zh-CN.js

@ -530,6 +530,10 @@ export default {
disable: "禁用", disable: "禁用",
received: "已到账", received: "已到账",
rejected: "已驳回", rejected: "已驳回",
refunded: "已退款",
refundDetail: "退款明细",
refundAmount: "退款金额",
refundCurrency: "退款币种",
}, },
// 通用导出字段组 // 通用导出字段组
common_export: { common_export: {
@ -616,6 +620,11 @@ export default {
receiveAreaPlaceholder: "请选择到账地区", receiveAreaPlaceholder: "请选择到账地区",
price: "原价", price: "原价",
goodsNamePlaceholder: "请选择商品", goodsNamePlaceholder: "请选择商品",
使用红包: "使用红包",
不使用红包: "不使用红包",
选择红包: "选择红包",
请选择红包: "请选择红包",
已抵扣: "已抵扣",
payModel: "收款方式", payModel: "收款方式",
refundType: "退款类型", refundType: "退款类型",
refundTypePlaceholder: "请选择退款类型", refundTypePlaceholder: "请选择退款类型",
@ -686,7 +695,7 @@ export default {
consumptionTimes: "消费次数", consumptionTimes: "消费次数",
onlyStatisticsDataAfter20250101: "仅统计2025-01-01后的数据", onlyStatisticsDataAfter20250101: "仅统计2025-01-01后的数据",
store: "所属门店", store: "所属门店",
// maxReductionAmount: "红包最大抵扣金额",
maxReductionAmount: "红包最大抵扣金额",
//金豆 //金豆
currentPayableBean: "当前付费金豆", currentPayableBean: "当前付费金豆",
currentFreeBean: "当前免费金豆", currentFreeBean: "当前免费金豆",

84
src/views/audit/gold/refundAudit.vue

@ -33,7 +33,7 @@
<div class="select"> <div class="select">
<div class="selectRow" style="width: 36vw;"> <div class="selectRow" style="width: 36vw;">
<el-text class="text" size="large"> <el-text class="text" size="large">
{{ activeName === 'wait' ? $t('common.submitTime') : $t('common.auditTime') }}
{{ (activeName === 'wait' || activeName === 'change') ? $t('common.submitTime') : $t('common.auditTime') }}
</el-text> </el-text>
<el-date-picker class="selectContent" v-model="dateRange" type="datetimerange" <el-date-picker class="selectContent" v-model="dateRange" type="datetimerange"
:range-separator="$t('common.to')" :start-placeholder="$t('common.startTime')" :range-separator="$t('common.to')" :start-placeholder="$t('common.startTime')"
@ -67,6 +67,10 @@
@click="handleButtonClick('reject')" class="custom-tab-button"> @click="handleButtonClick('reject')" class="custom-tab-button">
{{ $t('audit.rejected') }} {{ $t('audit.rejected') }}
</el-button> </el-button>
<el-button v-if="hasrefundWait && hasrefundWaitShow" :type="activeName === 'change' ? 'primary' : 'default'"
@click="handleButtonClick('change')" class="custom-tab-button">
待处理
</el-button>
</div> </div>
<div class="goldStatistics"> <div class="goldStatistics">
@ -115,28 +119,41 @@
{{ row.taskGold / 100 }} {{ row.taskGold / 100 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column
v-if="activeName === 'change'"
prop="redDiff"
label="金币补差额"
width="130"
sortable="custom"
>
<template #default="{ row }">
{{ row.redDiff != null ? (row.redDiff / 100) : 0 }}
</template>
</el-table-column>
<el-table-column prop="remark" :label="$t('audit.note')" width="150" show-overflow-tooltip /> <el-table-column prop="remark" :label="$t('audit.note')" width="150" show-overflow-tooltip />
<el-table-column prop="adminName" :label="$t('audit.submitter')" width="120" /> <el-table-column prop="adminName" :label="$t('audit.submitter')" width="120" />
<el-table-column v-if="checkTab === 'reject'" prop="rejectReason" :label="$t('audit.rejectReason')" width="150" <el-table-column v-if="checkTab === 'reject'" prop="rejectReason" :label="$t('audit.rejectReason')" width="150"
show-overflow-tooltip /> show-overflow-tooltip />
<el-table-column v-if="checkTab !== 'pending'" prop="auditName" :label="$t('audit.auditor')" width="120" />
<el-table-column v-if="checkTab === 'pass' || checkTab === 'reject'" prop="auditName" :label="$t('audit.auditor')" width="120" />
<el-table-column prop="createTime" :label="$t('audit.submitTime')" width="180" sortable="custom"> <el-table-column prop="createTime" :label="$t('audit.submitTime')" width="180" sortable="custom">
<template #default="{ row }"> <template #default="{ row }">
{{ {{
checkTab === 'pending'
? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss')
: moment(row.createTime).format('YYYY-MM-DD HH:mm:ss')
moment(row.createTime).format('YYYY-MM-DD HH:mm:ss')
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="checkTab !== 'pending'" prop="auditTime" :label="$t('audit.auditTime')" width="180">
<el-table-column
v-if="checkTab !== 'pending' && checkTab !== 'change'"
prop="auditTime"
:label="$t('audit.auditTime')"
width="180"
>
<template #default="{ row }"> <template #default="{ row }">
{{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }} {{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
v-if="checkTab === 'pending' && (hasrefundWaitThough || hasrefundWaitReject) && hasrefundWaitShow" fixed="right"
v-if="(checkTab === 'pending' || checkTab === 'change') && (hasrefundWaitThough || hasrefundWaitReject) && hasrefundWaitShow" fixed="right"
prop="operation" :label="$t('audit.operation')" width="150px"> prop="operation" :label="$t('audit.operation')" width="150px">
<template #default="scope"> <template #default="scope">
<div class="operation"> <div class="operation">
@ -225,7 +242,8 @@ const approveDialogVisible = ref(false)
const STATUS = { const STATUS = {
PENDING: 0, // PENDING: 0, //
APPROVED: 1, // APPROVED: 1, //
REJECTED: 2 //
REJECTED: 2, //
WAIT_HANDLE: 4 //
} }
// //
const disabledDate = (time) => { const disabledDate = (time) => {
@ -302,6 +320,8 @@ const handleSortChange = (column) => {
sortField.value = 'freeGold' sortField.value = 'freeGold'
} else if (column.prop === 'taskGold') { } else if (column.prop === 'taskGold') {
sortField.value = 'task_gold' sortField.value = 'task_gold'
} else if (column.prop === 'redDiff') {
sortField.value = 'red_diff'
} else if (column.prop === 'createTime') { } else if (column.prop === 'createTime') {
sortField.value = 'create_time' sortField.value = 'create_time'
} else if (column.prop === 'auditTime') { } else if (column.prop === 'auditTime') {
@ -342,6 +362,16 @@ const get = async function (val) {
searchForm.value.startTime = '' searchForm.value.startTime = ''
searchForm.value.endTime = '' 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 === '') { // if (searchForm.value.market === '' || searchForm.value.market === '') {
// searchForm.value.market = ''; // searchForm.value.market = '';
// } // }
@ -394,17 +424,26 @@ const handleApproveConfirm = async () => {
orderCode: currentRecord.value.orderCode, orderCode: currentRecord.value.orderCode,
auditId: adminData.value.id, auditId: adminData.value.id,
action: 1, // action1,2 action: 1, // action1,2
rejectReason: ''
}
await API({ url: '/audit/audit', data: params })
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')) ElMessage.success(t('elmessage.approveSuccess'))
} else {
ElMessage.error(res.msg || t('elmessage.operationFailed'))
}
approveDialogVisible.value = false approveDialogVisible.value = false
await get() await get()
clicked.value = false
await getStats() await getStats()
} catch (error) { } catch (error) {
console.error(t('elmessage.approveFailed'), error) console.error(t('elmessage.approveFailed'), error)
ElMessage.error(t('elmessage.operationFailed')) ElMessage.error(t('elmessage.operationFailed'))
} finally {
clicked.value = false
} }
} }
import _ from 'lodash'; import _ from 'lodash';
@ -608,6 +647,14 @@ const handleButtonClick = function (name) {
return return
} }
adminReject() adminReject()
} else if (name === 'change') {
if (!hasrefundWait) {
ElMessage.error(t('elmessage.noPermission'))
return
}
if (hasrefundWaitShow) {
adminChange()
}
} }
} }
// const handleClick = function (tab, event) { // const handleClick = function (tab, event) {
@ -641,10 +688,19 @@ const adminWait = async function () {
await get() await get()
await getStats() await getStats()
} }
//
const adminChange = async function () {
checkTab.value = 'change'
searchForm.value.auditStatus = STATUS.WAIT_HANDLE
await get()
await getStats()
}
// //
const adminPass = async function () { const adminPass = async function () {
checkTab.value = 'pass' checkTab.value = 'pass'
searchForm.value.auditStatus = STATUS.APPROVED searchForm.value.auditStatus = STATUS.APPROVED
sortField.value = ''
sortOrder.value = ''
await get() await get()
await getStats() await getStats()
} }
@ -652,6 +708,8 @@ const adminPass = async function () {
const adminReject = async function () { const adminReject = async function () {
checkTab.value = 'reject' checkTab.value = 'reject'
searchForm.value.auditStatus = STATUS.REJECTED searchForm.value.auditStatus = STATUS.REJECTED
sortField.value = ''
sortOrder.value = ''
await get() await get()
await getStats() await getStats()
} }

279
src/views/consume/gold/addCoinConsume.vue

@ -64,7 +64,8 @@ const addConsume = ref({
taskGold: null, // taskGold: null, //
remark: "",// remark: "",//
adminId: null,// id adminId: null,// id
adminName: adminData.value.adminName
adminName: adminData.value.adminName,
redMoney: 1 // 使1-使0-使
}) })
const Ref = ref(null) const Ref = ref(null)
const rules = reactive({ const rules = reactive({
@ -76,6 +77,19 @@ const rules = reactive({
{ required: true, message: t('elmessage.noEmptySumGold'), trigger: "blur" }, { required: true, message: t('elmessage.noEmptySumGold'), trigger: "blur" },
{ {
validator: (rule, value, callback) => { 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;
}
}
}
// 00.10 // 00.10
const isValid = /^(0\.\d{1,2})|([1-9]\d*(\.\d{1,2})?)$/.test(value); const isValid = /^(0\.\d{1,2})|([1-9]\d*(\.\d{1,2})?)$/.test(value);
@ -161,10 +175,18 @@ function validateInput() {
} }
//
const totalAvailableGold = user.value.nowSumGold;
//
const totalAvailableGold = (user.value.nowSumGold)
//
if (user.value.jwcode && sumGold > totalAvailableGold) { if (user.value.jwcode && sumGold > totalAvailableGold) {
if (addConsume.value.redMoney === 1) {
ElMessage.error(t('elmessage.limitRedAmount'));
//
selectedReds.value = []
} else {
ElMessage.error(t('elmessage.limitExceeded')); ElMessage.error(t('elmessage.limitExceeded'));
}
// sumGoldnull
addConsume.value.sumGold = null; addConsume.value.sumGold = null;
return false; return false;
} }
@ -172,13 +194,31 @@ function validateInput() {
return true; return true;
} }
// blursumGold
// blur +
function validateRedLimit() { function validateRedLimit() {
const sumGold = parseFloat(addConsume.value.sumGold); const sumGold = parseFloat(addConsume.value.sumGold);
if (isNaN(sumGold) || sumGold <= 0) {
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) {
// sumGold0
const isCovered = redAmount >= price;
if (isNaN(sumGold) || (sumGold <= 0 && !isCovered)) {
ElMessage.error(t('elmessage.noEmptySumGold')); ElMessage.error(t('elmessage.noEmptySumGold'));
return false; return false;
} }
// 使 +
if (addConsume.value.redMoney == 1) {
if (sumGold + redAmount < price) {
ElMessage.error(t('elmessage.limitRedAmount'));
return false;
}
}
}
return true; return true;
} }
@ -194,21 +234,22 @@ function calculateCoins(sumGold) {
let remaining = parsedSumGold; let remaining = parsedSumGold;
let freeUsed = 0, permanentUsed = 0, taskUsed = 0; let freeUsed = 0, permanentUsed = 0, taskUsed = 0;
// 1.
//
if (remaining > 0 && nowFreeGold > 0) { if (remaining > 0 && nowFreeGold > 0) {
freeUsed = Math.min(parseFloat(nowFreeGold.toFixed(4)), remaining); freeUsed = Math.min(parseFloat(nowFreeGold.toFixed(4)), remaining);
remaining = parseFloat((remaining - freeUsed).toFixed(4)); remaining = parseFloat((remaining - freeUsed).toFixed(4));
} }
// 2.
//
if (remaining > 0 && nowPermanentGold > 0) { if (remaining > 0 && nowPermanentGold > 0) {
permanentUsed = Math.min(parseFloat(nowPermanentGold.toFixed(4)), remaining); permanentUsed = Math.min(parseFloat(nowPermanentGold.toFixed(4)), remaining);
remaining = parseFloat((remaining - permanentUsed).toFixed(4)); remaining = parseFloat((remaining - permanentUsed).toFixed(4));
} }
// 3.
//
if (remaining > 0 && nowTaskGold > 0) { 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)); remaining = parseFloat((remaining - taskUsed).toFixed(4));
} }
@ -259,7 +300,9 @@ const add = async function () {
permanentGold: addConsume.value.permanentGold * 100, permanentGold: addConsume.value.permanentGold * 100,
goodsName: addConsume.value.goodsName.value, goodsName: addConsume.value.goodsName.value,
remark: addConsume.value.remark, 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 addDisabled.value = false
@ -310,9 +353,14 @@ function resetForm() {
taskGold: null, taskGold: null,
remark: "", remark: "",
adminId: adminData.value.id, adminId: adminData.value.id,
adminName: adminData.value.adminName
adminName: adminData.value.adminName,
redMoney: 1 // 使
} }
//
selectedReds.value = []
redList.value = []
console.log("重置表单") console.log("重置表单")
user.value = { user.value = {
@ -334,9 +382,10 @@ function resetForm() {
nowSumGold: null nowSumGold: null
} }
//
if (Ref.value) {
Ref.value.clearValidate() Ref.value.clearValidate()
} }
}
// //
const ConsumeDialogVisible = ref(false); const ConsumeDialogVisible = ref(false);
@ -408,7 +457,7 @@ const addBefore = () => {
}); });
return; return;
} }
if (!validateInput()) {
if (!validateInput() || !validateRedLimit()) {
return; return;
} }
ReadCookies.value = `coinConsume:${addConsume.value.jwcode}:${addConsume.value.goodsName.value}` ReadCookies.value = `coinConsume:${addConsume.value.jwcode}:${addConsume.value.goodsName.value}`
@ -449,53 +498,47 @@ const getUser = async function (jwcode) {
}); });
console.log("请求成功", result); 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
}
if (result.code === 200 && result.data) {
//
const currentJwcode = addConsume.value.jwcode;
resetForm();
addConsume.value.jwcode = currentJwcode;
// //
user.value = { user.value = {
...data,
...result.data,
// 100 // 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
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
}; };
// 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;
}
}
ElMessage.success(t('elmessage.searchSuccess'));
if (code === 0 && region) {
ElMessage.info({
message: t('elmessage.userRegionHint', { region }),
customClass: 'custom-blue-message'
})
return
//
if (addConsume.value.redMoney === 1) {
getRedList()
} }
ElMessage.success(t('elmessage.searchSuccess'));
//
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'));
}
} catch (error) { } catch (error) {
console.error("请求失败", error); console.error("请求失败", error);
ElMessage.error(t('elmessage.jwcodeError')); ElMessage.error(t('elmessage.jwcodeError'));
@ -534,7 +577,7 @@ watch(
() => addConsume.value.sumGold, () => addConsume.value.sumGold,
(newValue) => { (newValue) => {
const parsedNewValue = parseFloat(newValue); const parsedNewValue = parseFloat(newValue);
if (!isNaN(parsedNewValue) && parsedNewValue > 0 && user.value.jwcode) {
if (!isNaN(parsedNewValue) && parsedNewValue >= 0) {
const { free, permanent, task } = calculateCoins(parsedNewValue); const { free, permanent, task } = calculateCoins(parsedNewValue);
addConsume.value.freeGold = free; addConsume.value.freeGold = free;
addConsume.value.permanentGold = permanent; addConsume.value.permanentGold = permanent;
@ -559,7 +602,107 @@ 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
}
})
/* /*
====================挂载================================= ====================挂载=================================
@ -595,8 +738,36 @@ onMounted(async function () {
<el-input v-model="addConsume.price" style="width: 120px" disabled /> <el-input v-model="addConsume.price" style="width: 120px" disabled />
</el-form-item> </el-form-item>
<!-- <el-form-item prop="sumGold" :label="t('common_add.consumeTotalGold')">
<el-input v-model="addConsume.sumGold" style="width: 120px"
@blur="validateRedLimit()" />
</el-form-item> -->
<el-form-item prop="sumGold" :label="t('common_add.consumeTotalGold')"> <el-form-item prop="sumGold" :label="t('common_add.consumeTotalGold')">
<el-input v-model="addConsume.sumGold" style="width: 120px" @blur="validateRedLimit()" />
<el-input v-model="addConsume.sumGold" style="width: 120px" @blur="validateRedLimit()" :disabled="addConsume.redMoney === 1" />
<el-radio v-model="addConsume.redMoney" :label="1" style="margin-left: 10px;">{{ t('common_add.使用红包') }}</el-radio>
<el-radio v-model="addConsume.redMoney" :label="0">{{ t('common_add.不使用红包') }}</el-radio>
</el-form-item>
<el-form-item v-if="addConsume.redMoney === 1" :label="t('common_add.选择红包')">
<el-select
v-model="selectedReds"
multiple
:placeholder="t('common_add.请选择红包')"
style="width: 200px"
value-key="id"
collapse-tags
>
<el-option
v-for="item in redList"
:key="item.id"
:label="`${item.title} (${item.discount})`"
:value="item"
:disabled="isRedOptionDisabled(item)"
/>
</el-select>
<span style="margin-left: 10px; color: #666;">
{{ t('common_add.已抵扣') }}: {{ totalRedAmount }}
</span>
</el-form-item> </el-form-item>
@ -701,11 +872,11 @@ onMounted(async function () {
<p>{{ user.market }}</p> <p>{{ user.market }}</p>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="14">
<el-col :span="14">
<el-form-item :label="$t('common_add_user.maxReductionAmount')"> <el-form-item :label="$t('common_add_user.maxReductionAmount')">
<p style="color: #2fa1ff">{{ user.red }} </p> <p style="color: #2fa1ff">{{ user.red }} </p>
</el-form-item> </el-form-item>
</el-col> -->
</el-col>
</el-row> </el-row>
</el-form> </el-form>
</el-card> </el-card>

77
src/views/moneyManage/financialAccount/cashFlow.vue

@ -34,7 +34,7 @@ const payPlatformOptions = ref([...paytypeList])
const statusOptions = [ const statusOptions = [
{ label: t('common_list.received'), value: 4 }, { label: t('common_list.received'), value: 4 },
{ label: t('common_list.rejected'), value: 6 }
{ label: t('common_list.refunded'), value: 6 }
] ]
// //
@ -448,11 +448,40 @@ onMounted(async () => {
<el-table-column prop="payType" :label="t('common_list.payModel')" width="120" align="center" /> <el-table-column prop="payType" :label="t('common_list.payModel')" width="120" align="center" />
<el-table-column prop="payTime" :label="t('common_list.payTime2')" width="180" align="center" /> <el-table-column prop="payTime" :label="t('common_list.payTime2')" width="180" align="center" />
<el-table-column prop="status" :label="t('common_list.status')" width="100" align="center" fixed="right">
<el-table-column prop="status" :label="t('common_list.status')" width="120" align="center" fixed="right">
<template #default="{ row }"> <template #default="{ row }">
<div style="display: flex; align-items: center;">
<el-tag :type="row.status === 4 ? 'success' : 'warning'" effect="plain"> <el-tag :type="row.status === 4 ? 'success' : 'warning'" effect="plain">
{{ row.status === 4 ? t('common_list.received') : t('common_list.rejected') }}
{{ row.status === 4 ? t('common_list.received') : t('common_list.refunded') }}
</el-tag> </el-tag>
<el-popover
v-model:visible="row.popoverVisible"
trigger="hover"
placement="top"
popper-class="refund-popover"
width="auto"
v-if="row.status === 6"
>
<div class="popover-content">
<div class="popover-title">{{ t('common_list.refundDetail') }}</div>
<div class="popover-item">
<span class="label">{{ t('common_list.refundAmount') }}</span>
<span class="value">{{ row.refundAmount || '-' }}</span>
</div>
<div class="popover-item">
<span class="label">{{ t('common_list.refundCurrency') }}</span>
<span class="value">{{ row.refundCurrency || '-' }}</span>
</div>
</div>
<template #reference>
<img
@click.stop
src="@/assets/SvgIcons/consume.svg"
style="width: 15px; height: 15px; margin-left: 5px; cursor: pointer; display: inline-block;"
>
</template>
</el-popover>
</div>
</template> </template>
</el-table-column> </el-table-column>
@ -630,7 +659,49 @@ onMounted(async () => {
</div> </div>
</template> </template>
<style lang="scss">
.refund-popover {
background-color: #EEF5FE !important;
border: none !important;
padding: 12px !important;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
width: 100px;
min-width: none;
.el-popper__arrow::before {
background-color: #EEF5FE !important;
border-color: #EEF5FE !important;
}
}
</style>
<style scoped lang="scss"> <style scoped lang="scss">
.popover-content {
.popover-title {
color: #409EFF;
font-weight: bold;
font-size: 14px;
margin-bottom: 8px;
}
.popover-item {
display: flex;
font-size: 13px;
color: #606266;
margin-bottom: 4px;
&:last-child {
margin-bottom: 0;
}
.label {
color: #606266;
}
.value {
color: #606266;
margin-left: 4px;
}
}
}
.cash-flow-container { .cash-flow-container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;

21
src/views/refund/gold/addCoinRefund.vue

@ -39,6 +39,8 @@ const addRefund = ref({
taskGold: '', taskGold: '',
sumGold: 0, sumGold: 0,
remark: '', remark: '',
price: '',
linkId: '',
adminId: adminData.value.id, adminId: adminData.value.id,
adminName: adminData.value.name, adminName: adminData.value.name,
orderCode: '', orderCode: '',
@ -57,6 +59,8 @@ const cancel = function () {
taskGold: '', taskGold: '',
sumGold: 0, sumGold: 0,
remark: '', remark: '',
price: '',
linkId: '',
adminId: adminData.value.id, adminId: adminData.value.id,
orderCode: '', orderCode: '',
} }
@ -72,6 +76,8 @@ const getRefund = async function () {
addRefund.value.permanentGold = '' addRefund.value.permanentGold = ''
addRefund.value.freeGold = '' addRefund.value.freeGold = ''
addRefund.value.taskGold = '' addRefund.value.taskGold = ''
addRefund.value.price = ''
addRefund.value.linkId = ''
let type = null let type = null
if (addRefund.value.refundType === '商品退款') { if (addRefund.value.refundType === '商品退款') {
type = 1 type = 1
@ -132,7 +138,9 @@ const add = async function () {
permanentGold: addRefund.value.permanentGold * 100, permanentGold: addRefund.value.permanentGold * 100,
freeGold: addRefund.value.freeGold * 100, freeGold: addRefund.value.freeGold * 100,
taskGold: addRefund.value.taskGold * 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) console.log('提交的退款信息', processedRefund)
addDisabled.value = true addDisabled.value = true
@ -210,7 +218,7 @@ const rules = reactive({
{ required: true, message: t('elmessage.checkPayModel'), trigger: 'blur' }, { required: true, message: t('elmessage.checkPayModel'), trigger: 'blur' },
{ {
validator: (rule, value) => { validator: (rule, value) => {
if (value === 0) {
if (addRefund.value.refundModel === 1 && value === 0) {
return Promise.reject(new Error(t('elmessage.noTotalGoldZero'))) return Promise.reject(new Error(t('elmessage.noTotalGoldZero')))
} }
return Promise.resolve() return Promise.resolve()
@ -309,6 +317,8 @@ const handleOrderChange = (orderCode) => {
const order = tableData.value.find(item => item.orderCode === orderCode) const order = tableData.value.find(item => item.orderCode === orderCode)
if (order) { if (order) {
addRefund.value.goodsName = order.goodsName addRefund.value.goodsName = order.goodsName
addRefund.value.price = Number(order.price || 0) / 100
addRefund.value.linkId = order.linkId || ''
if (addRefund.value.refundType === '金币退款') { if (addRefund.value.refundType === '金币退款') {
selectedGoodsGold.value = { selectedGoodsGold.value = {
permanentGold: Number(order.permanentGold) || 0, permanentGold: Number(order.permanentGold) || 0,
@ -333,6 +343,8 @@ const handleOrderChange = (orderCode) => {
} }
} else { } else {
addRefund.value.goodsName = '' addRefund.value.goodsName = ''
addRefund.value.price = ''
addRefund.value.linkId = ''
selectedGoodsGold.value = { selectedGoodsGold.value = {
permanentGold: 0, permanentGold: 0,
freeGold: 0, freeGold: 0,
@ -355,6 +367,8 @@ const restGoods = () => {
addRefund.value.permanentGold = '' addRefund.value.permanentGold = ''
addRefund.value.freeGold = '' addRefund.value.freeGold = ''
addRefund.value.taskGold = '' addRefund.value.taskGold = ''
addRefund.value.price = ''
addRefund.value.linkId = ''
} }
// 退 // 退
@ -365,6 +379,9 @@ const handleRefundModelChange = () => {
addRefund.value.freeGold = selectedGoodsGold.value.freeGold.toString(); addRefund.value.freeGold = selectedGoodsGold.value.freeGold.toString();
addRefund.value.taskGold = selectedGoodsGold.value.taskGold.toString(); addRefund.value.taskGold = selectedGoodsGold.value.taskGold.toString();
} }
if (Ref.value) {
Ref.value.clearValidate('sumGold')
}
} }
// //

1
vite.config.ts

@ -50,6 +50,7 @@ export default defineConfig(({mode}) => {
}, },
base: process.env.NODE_ENV === 'production' ? './' : '/', base: process.env.NODE_ENV === 'production' ? './' : '/',
build: { build: {
outDir: `dist_${mode}`,
sourcemap: false, // 关闭 sourcemap sourcemap: false, // 关闭 sourcemap
minify: 'terser', minify: 'terser',
terserOptions: { terserOptions: {

Loading…
Cancel
Save