feat(recharge): 充值不允许输入负数

This commit is contained in:
woody 2025-06-16 14:17:05 +08:00
parent 33a6b279d5
commit 2bb5af8311
3 changed files with 768 additions and 625 deletions

View File

@ -6,11 +6,9 @@
<template> <template>
<div class="mainbtn"> <div class="mainbtn">
<el-button size="small" class="thebtn1" @click="handleImport"> <el-button size="small" class="thebtn1" @click="handleImport">
{{ '导入' }}</el-button {{ '导入' }}</el-button>
>
<el-button size="small" class="thebtn2" @click="importTemplate"> <el-button size="small" class="thebtn2" @click="importTemplate">
{{ '下载模板' }}</el-button {{ '下载模板' }}</el-button>
>
</div> </div>
</template> </template>
@ -19,21 +17,21 @@
<el-col :span="5"> <el-col :span="5">
<el-form-item :label="'会员编号'"> <el-form-item :label="'会员编号'">
<el-input <el-input
v-model="form.memberCode"
clearable clearable
style="width: 200px" style="width: 200px"
v-model="form.memberCode"
@blur="checkName" @blur="checkName"
></el-input> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item :label="'会员姓名'"> <el-form-item :label="'会员姓名'">
<el-input <el-input
v-model="form.memberName"
clearable clearable
style="width: 200px" style="width: 200px"
v-model="form.memberName"
disabled disabled
></el-input> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@ -42,21 +40,18 @@
style="margin-left: 30px" style="margin-left: 30px"
@click="getList" @click="getList"
> >
{{ '搜索' }}</el-button {{ '搜索' }}</el-button>
>
<el-button class="my_reset" @click="reset"> <el-button class="my_reset" @click="reset">
{{ '重置' }}</el-button {{ '重置' }}</el-button>
>
</el-col> </el-col>
</el-row> </el-row>
<el-form-item :label="'充值方式'"> <el-form-item :label="'充值方式'">
<el-radio-group v-model="rechargeMethod"> <el-radio-group v-model="rechargeMethod">
<el-radio <el-radio
:label="item.value"
v-for="(item, index) in czWayList" v-for="(item, index) in czWayList"
:key="index" :key="index"
>{{ item.label }}</el-radio :label="item.value"
> >{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-table <el-table
@ -71,15 +66,13 @@
prop="memberCode" prop="memberCode"
:label="'会员编号'" :label="'会员编号'"
min-width="120px" min-width="120px"
> />
</el-table-column>
<el-table-column <el-table-column
align="center" align="center"
prop="memberName" prop="memberName"
:label="'会员姓名'" :label="'会员姓名'"
min-width="120px" min-width="120px"
> />
</el-table-column>
<el-table-column <el-table-column
align="center" align="center"
prop="paymentMethod" prop="paymentMethod"
@ -88,36 +81,37 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-select <el-select
v-model="scope.row.paymentMethod"
clearable clearable
:placeholder="'请选择'" :placeholder="'请选择'"
v-model="scope.row.paymentMethod"
> >
<el-option <el-option
v-for="item in paymentTypeList" v-for="item in paymentTypeList"
:key="item.value" :key="item.value"
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
></el-option> />
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
min-width="150px"
v-for="(item, index) in enumsAccountList" v-for="(item, index) in enumsAccountList"
:key="index" :key="index"
min-width="200px"
align="center" align="center"
:prop="`${item.pkId}`" :prop="`${item.pkId}`"
:label=" :label="
item.pkTransactionKeyVal + item.pkTransactionKeyVal +
`${'变更'}(${getUser.currency.symbol})` `${'变更'}(${getUser.currency.symbol})`
" "
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-input <el-input-number
clearable
v-model="scope.row.rechargeDetailMap[`${item.pkId}`]" v-model="scope.row.rechargeDetailMap[`${item.pkId}`]"
> clearable
</el-input> :min="0"
:controls="false"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@ -127,7 +121,7 @@
min-width="120px" min-width="120px"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-input v-model="scope.row.memberRemarks"></el-input> <el-input v-model="scope.row.memberRemarks" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@ -137,7 +131,7 @@
:label="'备注(后台)'" :label="'备注(后台)'"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-input v-model="scope.row.remarks"></el-input> <el-input v-model="scope.row.remarks" />
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -147,13 +141,12 @@
<div class="footer"> <div class="footer">
<div style="margin: 0 auto"> <div style="margin: 0 auto">
<el-button <el-button
v-has-buttons="['ChongzhiConfirm']"
type="primary" type="primary"
class="thebtn" class="thebtn"
@click="saveDate('form')" @click="saveDate('form')"
v-has-buttons="['ChongzhiConfirm']"
>
{{ '确认' }}</el-button
> >
{{ '确认' }}</el-button>
</div> </div>
</div> </div>
</div> </div>
@ -177,17 +170,16 @@
:auto-upload="false" :auto-upload="false"
drag drag
> >
<i class="el-icon-upload"></i> <i class="el-icon-upload" />
<div class="el-upload__text"> <div class="el-upload__text">
{{ '将文件拖到此处,或' }} {{ '将文件拖到此处,或' }}
<em>{{ '点击上传' }}</em> <em>{{ '点击上传' }}</em>
</div> </div>
<div class="el-upload__tip" slot="tip"> <div slot="tip" class="el-upload__tip">
<el-link type="info" style="font-size: 12px" @click="importTemplate"> <el-link type="info" style="font-size: 12px" @click="importTemplate">
{{ '下载模板' }}</el-link {{ '下载模板' }}</el-link>
>
</div> </div>
<div class="el-upload__tip" style="color: red" slot="tip"> <div slot="tip" class="el-upload__tip" style="color: red">
{{ '提示仅允许导入“xls”或“xlsx”格式文件' }} {{ '提示仅允许导入“xls”或“xlsx”格式文件' }}
</div> </div>
</el-upload> </el-upload>
@ -204,216 +196,216 @@
</template> </template>
<script> <script>
import FileUpload from "@/components/FileUpload"; import FileUpload from '@/components/FileUpload'
import { getToken } from "@/utils/auth"; import { getToken } from '@/utils/auth'
import { mapGetters } from "vuex"; import { mapGetters } from 'vuex'
import { import {
getenumsCzAccount, getenumsCzAccount,
getpaymentType, getpaymentType,
getrechargeMethod, getrechargeMethod,
changeAccountType, changeAccountType,
getMemberName, getMemberName
} from "@/api/financial"; } from '@/api/financial'
import { stateFormat } from "@/utils/numberToCurrency"; import { stateFormat } from '@/utils/numberToCurrency'
export default { export default {
name: "Chongzhi", name: 'Chongzhi',
components: { components: {
FileUpload, FileUpload
}, },
computed: { computed: {
...mapGetters(["getUser"]), ...mapGetters(['getUser'])
}, },
data() { data() {
return { return {
tableData: [], tableData: [],
form: { form: {
memberCode: "", // memberCode: '', //
memberName: null, // memberName: null, //
rechargeDetailMap: {}, rechargeDetailMap: {},
paymentMethod: [], // paymentMethod: [] //
}, },
rechargeMethod: 1, // rechargeMethod: 1, //
enumsAccountList: [], // enumsAccountList: [], //
paymentTypeList: [], // paymentTypeList: [], //
czWayList: [], // czWayList: [], //
upload: { upload: {
// //
open: false, open: false,
// //
title: "", title: '',
// //
isUploading: false, isUploading: false,
// //
updateSupport: 0, updateSupport: 0,
// //
headers: { Authorization: "Bearer " + getToken() }, headers: { Authorization: 'Bearer ' + getToken() },
// //
url: url:
process.env.VUE_APP_BASE_API + process.env.VUE_APP_BASE_API +
"/member/manager/recharge/import-member-code", '/member/manager/recharge/import-member-code'
}, }
}; }
}, },
created() { created() {
// //
this.getenumsCzAccount(); this.getenumsCzAccount()
// //
this.getpaymentType(); this.getpaymentType()
// //
this.getrechargeMethod(); this.getrechargeMethod()
}, },
methods: { methods: {
stateFormat, stateFormat,
// //
importTemplate() { importTemplate() {
this.download( this.download(
"/member/manager/recharge/download-template", '/member/manager/recharge/download-template',
{}, {},
`${'模板'}${new Date().getTime()}.xlsx` `${'模板'}${new Date().getTime()}.xlsx`
); )
}, },
/** 导入按钮操作 */ /** 导入按钮操作 */
handleImport() { handleImport() {
this.upload.title = '导入'; this.upload.title = '导入'
this.upload.open = true; this.upload.open = true
}, },
// //
handleFileUploadProgress(event, file, fileList) { handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true; this.upload.isUploading = true
}, },
// //
handleFileSuccess(response, file, fileList) { handleFileSuccess(response, file, fileList) {
this.tableData = []; this.tableData = []
if (response.code === 200 && response.data) { if (response.code === 200 && response.data) {
const rechargeDetailMap = {}; const rechargeDetailMap = {}
this.enumsAccountList.forEach((item) => { this.enumsAccountList.forEach((item) => {
rechargeDetailMap[item.pkId] = ""; rechargeDetailMap[item.pkId] = ''
}); })
response.data.forEach((item) => { response.data.forEach((item) => {
if (item.rechargeDetail) { if (item.rechargeDetail) {
item.rechargeDetailMap = { ...JSON.parse(item.rechargeDetail) }; item.rechargeDetailMap = { ...JSON.parse(item.rechargeDetail) }
this.tableData.push(item); this.tableData.push(item)
} else { } else {
item.rechargeDetailMap = { ...rechargeDetailMap }; item.rechargeDetailMap = { ...rechargeDetailMap }
this.tableData.push(item); this.tableData.push(item)
} }
}); })
this.$message({ this.$message({
message: response.msg, message: response.msg,
type: "success", type: 'success'
}); })
} else { } else {
const dataList = response.data.split(","); // const dataList = response.data.split(',') //
const formattedData = dataList const formattedData = dataList
.reduce((acc, item, index) => { .reduce((acc, item, index) => {
const lineIndex = Math.floor(index / 3); // const lineIndex = Math.floor(index / 3) //
acc[lineIndex] = acc[lineIndex] || []; // acc[lineIndex] = acc[lineIndex] || [] //
acc[lineIndex].push(item); // acc[lineIndex].push(item) //
return acc; return acc
}, []) }, [])
.map((line) => line.join(",")) .map((line) => line.join(','))
.join("<br>"); // <br> .join('<br>') // <br>
const msgList = response.msg + "<br>" + formattedData; const msgList = response.msg + '<br>' + formattedData
this.$alert(msgList, this.$t("提示"), { this.$alert(msgList, this.$t('提示'), {
dangerouslyUseHTMLString: true, dangerouslyUseHTMLString: true
}); })
} }
this.upload.open = false; this.upload.open = false
this.upload.isUploading = false; this.upload.isUploading = false
this.$refs.upload.clearFiles(); this.$refs.upload.clearFiles()
}, },
getList() { getList() {
changeAccountType({ changeAccountType({
memberCode: this.form.memberCode, memberCode: this.form.memberCode,
memberName: this.form.memberName, memberName: this.form.memberName
}).then((res) => { }).then((res) => {
res.data.forEach((ele) => { res.data.forEach((ele) => {
ele.rechargeDetailMap = {}; ele.rechargeDetailMap = {}
}); })
this.tableData = res.data; this.tableData = res.data
}); })
}, },
// //
handleExceed() { handleExceed() {
this.upload.isUploading = false; this.upload.isUploading = false
this.msgInfo('仅可上传一个文件哦'); this.msgInfo('仅可上传一个文件哦')
}, },
// //
submitFileForm() { submitFileForm() {
this.$refs.upload.submit(); this.$refs.upload.submit()
}, },
// //
checkName() { checkName() {
getMemberName({ memberCode: this.form.memberCode }).then((res) => { getMemberName({ memberCode: this.form.memberCode }).then((res) => {
this.form.memberName = res.memberName; this.form.memberName = res.memberName
}); })
}, },
reset() { reset() {
this.form.memberCode = ""; this.form.memberCode = ''
this.form.memberName = ""; this.form.memberName = ''
this.getList(); this.getList()
}, },
// //
saveDate(formName) { saveDate(formName) {
if (!this.rechargeMethod) { if (!this.rechargeMethod) {
this.$message({ this.$message({
message: '请先选择充值方式', message: '请先选择充值方式',
type: "warning", type: 'warning'
}); })
return; return
} else { } else {
this.$refs[formName].validate((valid) => { this.$refs[formName].validate((valid) => {
if (valid) { if (valid) {
let shouldTerminate = false; let shouldTerminate = false
this.tableData.forEach((ele) => { this.tableData.forEach((ele) => {
if (!ele.paymentMethod) { if (!ele.paymentMethod) {
shouldTerminate = true; shouldTerminate = true
this.$message({ this.$message({
message: '交款方式不能为空', message: '交款方式不能为空',
type: "warning", type: 'warning'
}); })
return; return
} }
}); })
if (!shouldTerminate) { if (!shouldTerminate) {
this.$router.push({ this.$router.push({
path: "/information/business/czzxqc", path: '/information/business/czzxqc',
query: { query: {
data: "", data: '',
czlx: 2, czlx: 2,
detailParams: JSON.stringify(this.tableData), detailParams: JSON.stringify(this.tableData),
rechargeMethod: this.rechargeMethod, rechargeMethod: this.rechargeMethod
}, }
}); })
} }
} }
}); })
} }
}, },
getrechargeMethod() { getrechargeMethod() {
getrechargeMethod().then((res) => { getrechargeMethod().then((res) => {
this.czWayList = res.data; this.czWayList = res.data
}); })
}, },
getpaymentType() { getpaymentType() {
getpaymentType().then((res) => { getpaymentType().then((res) => {
this.paymentTypeList = res.data; this.paymentTypeList = res.data
}); })
}, },
getenumsCzAccount() { getenumsCzAccount() {
getenumsCzAccount({ accountProperty: 1 }).then((res) => { getenumsCzAccount({ accountProperty: 1 }).then((res) => {
this.enumsAccountList = res.rows; this.enumsAccountList = res.rows
}); })
}, }
}, }
}; }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -6,21 +6,21 @@
<el-col :span="6"> <el-col :span="6">
<el-form-item :label="'会员编号'"> <el-form-item :label="'会员编号'">
<el-input <el-input
v-model="form.memberCode"
clearable clearable
style="width: 200px" style="width: 200px"
v-model="form.memberCode"
@blur="checkName" @blur="checkName"
></el-input> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item :label="'会员姓名'"> <el-form-item :label="'会员姓名'">
<el-input <el-input
v-model="form.memberName"
clearable clearable
style="width: 200px" style="width: 200px"
v-model="form.memberName"
disabled disabled
></el-input> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@ -29,11 +29,9 @@
style="margin-left: 30px" style="margin-left: 30px"
@click="getList" @click="getList"
> >
{{ '搜索' }}</el-button {{ '搜索' }}</el-button>
>
<el-button class="my_reset" @click="reset"> <el-button class="my_reset" @click="reset">
{{ '重置' }}</el-button {{ '重置' }}</el-button>
>
</el-col> </el-col>
</el-row> </el-row>
<!-- <el-form-item :label="'钱包类型'"> <!-- <el-form-item :label="'钱包类型'">
@ -62,11 +60,10 @@
<el-radio-group v-model="rechargeMethod"> <el-radio-group v-model="rechargeMethod">
1 1
<el-radio <el-radio
:label="item.value"
v-for="(item, index) in czWayList" v-for="(item, index) in czWayList"
:key="index" :key="index"
>{{ item.label }}</el-radio :label="item.value"
> >{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-table <el-table
@ -81,15 +78,13 @@
prop="memberCode" prop="memberCode"
:label="'会员编号'" :label="'会员编号'"
min-width="120px" min-width="120px"
> />
</el-table-column>
<el-table-column <el-table-column
align="center" align="center"
prop="memberName" prop="memberName"
:label="'会员姓名'" :label="'会员姓名'"
min-width="120px" min-width="120px"
> />
</el-table-column>
<el-table-column <el-table-column
align="center" align="center"
prop="paymentMethod" prop="paymentMethod"
@ -98,37 +93,38 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-select <el-select
v-model="scope.row.paymentMethod"
clearable clearable
:placeholder="'请选择'" :placeholder="'请选择'"
v-model="scope.row.paymentMethod"
> >
<el-option <el-option
v-for="item in paymentTypeList" v-for="item in paymentTypeList"
:key="item.value" :key="item.value"
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
></el-option> />
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
min-width="150px"
v-for="(item, index) in enumsAccountList" v-for="(item, index) in enumsAccountList"
:key="index" :key="index"
min-width="200px"
align="center" align="center"
:prop="`${item.pkId}`" :prop="`${item.pkId}`"
:label=" :label="
item.pkTransactionKeyVal + item.pkTransactionKeyVal +
`${'变更'}(${getUser.currency.symbol})` `${'变更'}(${getUser.currency.symbol})`
" "
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-input <el-input-number
clearable
v-model="scope.row.rechargeDetailMap[`${item.pkId}`]" v-model="scope.row.rechargeDetailMap[`${item.pkId}`]"
> :min="0"
</el-input> :controls="false"
clearable
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@ -138,7 +134,7 @@
min-width="120px" min-width="120px"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-input v-model="scope.row.memberRemarks"></el-input> <el-input v-model="scope.row.memberRemarks" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@ -148,7 +144,7 @@
:label="'备注(后台)'" :label="'备注(后台)'"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-input v-model="scope.row.remarks"></el-input> <el-input v-model="scope.row.remarks" />
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -158,138 +154,137 @@
<div class="footer"> <div class="footer">
<div style="margin: 0 auto"> <div style="margin: 0 auto">
<el-button <el-button
v-has-buttons="['ChongzhiConfirm']"
type="primary" type="primary"
class="thebtn" class="thebtn"
@click="saveDate('form')" @click="saveDate('form')"
v-has-buttons="['ChongzhiConfirm']"
>
{{ '确认' }}</el-button
> >
{{ '确认' }}</el-button>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { mapGetters } from "vuex"; import { mapGetters } from 'vuex'
import { import {
getenumsCzAccount, getenumsCzAccount,
getpaymentType, getpaymentType,
getrechargeMethod, getrechargeMethod,
changeAccountType, changeAccountType,
getMemberName, getMemberName
} from "@/api/financial"; } from '@/api/financial'
import { stateFormat } from "@/utils/numberToCurrency"; import { stateFormat } from '@/utils/numberToCurrency'
export default { export default {
name: "Chongzhi", name: 'Chongzhi',
computed: { computed: {
...mapGetters(["getUser"]), ...mapGetters(['getUser'])
}, },
data() { data() {
return { return {
tableData: [], tableData: [],
form: { form: {
memberCode: "", // memberCode: '', //
memberName: null, // memberName: null, //
rechargeDetailMap: {}, rechargeDetailMap: {},
paymentMethod: [], // paymentMethod: [] //
}, },
rechargeMethod: 1, // rechargeMethod: 1, //
enumsAccountList: [], // enumsAccountList: [], //
paymentTypeList: [], // paymentTypeList: [], //
czWayList: [], // czWayList: [] //
}; }
}, },
created() { created() {
// //
this.getenumsCzAccount(); this.getenumsCzAccount()
// //
this.getpaymentType(); this.getpaymentType()
// //
this.getrechargeMethod(); this.getrechargeMethod()
}, },
methods: { methods: {
stateFormat, stateFormat,
// //
checkName() { checkName() {
getMemberName({ memberCode: this.form.memberCode }).then((res) => { getMemberName({ memberCode: this.form.memberCode }).then((res) => {
this.form.memberName = res.memberName; this.form.memberName = res.memberName
}); })
}, },
getList() { getList() {
changeAccountType({ changeAccountType({
memberCode: this.form.memberCode, memberCode: this.form.memberCode,
memberName: this.form.memberName, memberName: this.form.memberName
}).then((res) => { }).then((res) => {
res.data.forEach((ele) => { res.data.forEach((ele) => {
ele.rechargeDetailMap = {}; ele.rechargeDetailMap = {}
}); })
this.tableData = res.data; this.tableData = res.data
}); })
}, },
reset() { reset() {
this.form.memberCode = ""; this.form.memberCode = ''
this.form.memberName = ""; this.form.memberName = ''
this.getList(); this.getList()
}, },
// //
saveDate(formName) { saveDate(formName) {
if (!this.rechargeMethod) { if (!this.rechargeMethod) {
this.$message({ this.$message({
message: '请先选择充值方式', message: '请先选择充值方式',
type: "warning", type: 'warning'
}); })
return; return
} else { } else {
this.$refs[formName].validate((valid) => { this.$refs[formName].validate((valid) => {
if (valid) { if (valid) {
let shouldTerminate = false; let shouldTerminate = false
this.tableData.forEach((ele) => { this.tableData.forEach((ele) => {
if (!ele.paymentMethod) { if (!ele.paymentMethod) {
shouldTerminate = true; shouldTerminate = true
this.$message({ this.$message({
message: '交款方式不能为空', message: '交款方式不能为空',
type: "warning", type: 'warning'
}); })
return; return
} }
}); })
if (!shouldTerminate) { if (!shouldTerminate) {
this.$router.push({ this.$router.push({
path: "/information/business/czzxqc", path: '/information/business/czzxqc',
query: { query: {
data: "", data: '',
czlx: 1, czlx: 1,
detailParams: JSON.stringify(this.tableData), detailParams: JSON.stringify(this.tableData),
rechargeMethod: this.rechargeMethod, rechargeMethod: this.rechargeMethod
}, }
}); })
} }
} }
}); })
} }
}, },
getrechargeMethod() { getrechargeMethod() {
getrechargeMethod().then((res) => { getrechargeMethod().then((res) => {
this.czWayList = res.data; this.czWayList = res.data
}); })
}, },
getpaymentType() { getpaymentType() {
getpaymentType().then((res) => { getpaymentType().then((res) => {
this.paymentTypeList = res.data; this.paymentTypeList = res.data
}); })
}, },
getenumsCzAccount() { getenumsCzAccount() {
getenumsCzAccount({ accountProperty: 1 }).then((res) => { getenumsCzAccount({ accountProperty: 1 }).then((res) => {
this.enumsAccountList = res.rows; this.enumsAccountList = res.rows
}); })
}, }
}, }
}; }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

File diff suppressed because it is too large Load Diff