Compare commits

...

2 Commits

  1. 2
      src/components/workspace/CashManagement.vue
  2. 232
      src/views/consume/gold/addCoinConsume.vue

2
src/components/workspace/CashManagement.vue

@ -191,7 +191,7 @@ const getAdminData = async function () {
try { try {
loading.value = true; // loading.value = true; //
const result = await API({url: '/admin/userinfo', data: {}}); const result = await API({url: '/admin/userinfo', data: {}});
marksFlag.value = result.markets === '总部' || result.markets === '研发部';
marksFlag.value = result.markets === '总部' || result.markets === '研发部' || result.markets === 'Headquarters' || result.markets === 'R&D Department';
console.log("marksFlag", marksFlag.value); console.log("marksFlag", marksFlag.value);
// alert(marksFlag.value) // alert(marksFlag.value)
} catch (error) { } catch (error) {

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

@ -1,5 +1,5 @@
<script setup> <script setup>
import { onMounted, reactive, ref, watch } from "vue";
import { onMounted, reactive, ref, watch, computed } from "vue";
import { ElIcon, ElMessage } from "element-plus"; import { ElIcon, ElMessage } from "element-plus";
import moment from "moment"; import moment from "moment";
import request from "@/util/http.js" import request from "@/util/http.js"
@ -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);
@ -163,8 +177,15 @@ function validateInput() {
// //
const totalAvailableGold = (user.value.nowSumGold) const totalAvailableGold = (user.value.nowSumGold)
//
if (user.value.jwcode && sumGold > totalAvailableGold) { 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'));
}
// sumGoldnull // sumGoldnull
addConsume.value.sumGold = null; addConsume.value.sumGold = null;
return false; return false;
@ -177,15 +198,25 @@ function validateInput() {
function validateRedLimit() { function validateRedLimit() {
const sumGold = parseFloat(addConsume.value.sumGold); const sumGold = parseFloat(addConsume.value.sumGold);
const price = Number(addConsume.value.price || 0); const price = Number(addConsume.value.price || 0);
const redMax = Number(user.value.red || 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) { if (!isNaN(price) && price > 0) {
if (isNaN(sumGold) || sumGold <= 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 (sumGold + redMax < price) {
ElMessage.error(t('elmessage.limitRedAmount'));
return false;
// 使 +
if (addConsume.value.redMoney == 1) {
if (sumGold + redAmount < price) {
ElMessage.error(t('elmessage.limitRedAmount'));
return false;
}
} }
} }
return true; return true;
@ -267,7 +298,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
@ -319,7 +352,12 @@ function resetForm() {
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("重置表单")
@ -456,6 +494,11 @@ const getUser = async function (jwcode) {
console.log("请求成功", result); console.log("请求成功", result);
if (result.code === 200 && result.data) { if (result.code === 200 && result.data) {
//
const currentJwcode = addConsume.value.jwcode;
resetForm();
addConsume.value.jwcode = currentJwcode;
// //
user.value = { user.value = {
...result.data, ...result.data,
@ -473,20 +516,15 @@ const getUser = async function (jwcode) {
}; };
ElMessage.success(t('elmessage.searchSuccess')); ElMessage.success(t('elmessage.searchSuccess'));
// 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 (addConsume.value.redMoney === 1) {
getRedList()
} }
// //
validateInput() validateInput()
} else if (!result.data) { } else if (!result.data) {
ElMessage.warning(t('elmessage.noUser')); ElMessage.warning(t('elmessage.noUser'));
user.value.jwcode = null user.value.jwcode = null
@ -533,7 +571,7 @@ watch(
() => addConsume.value.sumGold, () => addConsume.value.sumGold,
(newValue) => { (newValue) => {
const parsedNewValue = parseFloat(newValue); const parsedNewValue = parseFloat(newValue);
if (!isNaN(parsedNewValue) && parsedNewValue > 0) {
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,6 +597,110 @@ 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) {
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
}
})
/*
====================挂载================================= ====================挂载=================================
*/ */
// //
@ -575,7 +717,7 @@ onMounted(async function () {
<el-form :model="addConsume" ref="Ref" :rules="rules" style="min-width: 600px;" class="add-form" <el-form :model="addConsume" ref="Ref" :rules="rules" style="min-width: 600px;" class="add-form"
label-width="auto" label-position="right"> label-width="auto" label-position="right">
<el-form-item prop="jwcode" :label="t('common_add.jwcode')" style="margin-top: 50px"> <el-form-item prop="jwcode" :label="t('common_add.jwcode')" style="margin-top: 50px">
<el-input v-model="addConsume.jwcode" style="width: 200px;" />
<el-input v-model="addConsume.jwcode" style="width: 200px;" @keyup.enter="getUser(addConsume.jwcode)" />
<el-button type="primary" @click="getUser(addConsume.jwcode)" style="margin-left: 20px"> <el-button type="primary" @click="getUser(addConsume.jwcode)" style="margin-left: 20px">
{{ t('common.search') }} {{ t('common.search') }}
</el-button> </el-button>
@ -592,9 +734,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-form-item prop="sumGold" :label="t('common_add.consumeTotalGold')">
<el-input v-model="addConsume.sumGold" style="width: 120px" <el-input v-model="addConsume.sumGold" style="width: 120px"
@blur="validateRedLimit()" /> @blur="validateRedLimit()" />
</el-form-item> -->
<el-form-item prop="sumGold" :label="t('common_add.consumeTotalGold')">
<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;">使用红包</el-radio>
<el-radio v-model="addConsume.redMoney" :label="0">不使用红包</el-radio>
</el-form-item>
<el-form-item v-if="addConsume.redMoney === 1" label="选择红包">
<el-select
v-model="selectedReds"
multiple
placeholder="请选择红包"
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;">
已抵扣: {{ totalRedAmount }}
</span>
</el-form-item> </el-form-item>
@ -623,10 +792,10 @@ onMounted(async function () {
</el-form-item> </el-form-item>
<el-button type="success" @click="resetForm()" style="margin-left: 200px;margin-top:10px">{{ t('common.reset') <el-button type="success" @click="resetForm()" style="margin-left: 200px;margin-top:10px">{{ t('common.reset')
}}</el-button>
}}</el-button>
<el-button type="primary" :disabled="addDisabled" @click="addBefore" style="margin-top:10px">{{ <el-button type="primary" :disabled="addDisabled" @click="addBefore" style="margin-top:10px">{{
t('common.submit') t('common.submit')
}}</el-button>
}}</el-button>
</el-form> </el-form>
</div> </div>
@ -674,7 +843,7 @@ onMounted(async function () {
</el-form-item> </el-form-item>
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 --> <el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<p style="font-size: small; color: #b1b1b1">({{ $t('common_add_user.onlyStatisticsDataAfter20250101') <p style="font-size: small; color: #b1b1b1">({{ $t('common_add_user.onlyStatisticsDataAfter20250101')
}})
}})
</p> </p>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -695,7 +864,7 @@ onMounted(async function () {
<!-- 第四行消费次数 + 所属门店 --> <!-- 第四行消费次数 + 所属门店 -->
<el-row> <el-row>
<el-col :span="9"> <el-col :span="9">
<el-form-item label-width="120px" :label="$t('common_add_user.store')">
<el-form-item :label="$t('common_add_user.store')">
<p>{{ user.market }}</p> <p>{{ user.market }}</p>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -767,8 +936,8 @@ onMounted(async function () {
</el-dialog> </el-dialog>
<el-dialog v-model="ConsumeDialogVisible" :title="$t('common_add.operationConfirm')" :before-close="ConsumeDialogVisiblehandleClose"
:close-on-click-modal="false" width="480px">
<el-dialog v-model="ConsumeDialogVisible" :title="$t('common_add.operationConfirm')"
:before-close="ConsumeDialogVisiblehandleClose" :close-on-click-modal="false" width="480px">
<!-- 内容整体居中且收窄 --> <!-- 内容整体居中且收窄 -->
<div class="confirm-body"> <div class="confirm-body">
<!-- 用户信息 --> <!-- 用户信息 -->
@ -819,7 +988,8 @@ onMounted(async function () {
<div> <div>
<el-divider border-style="dashed" /> <el-divider border-style="dashed" />
<p>{{ $t('common_add.similarRechargeRecords') }}</p> <p>{{ $t('common_add.similarRechargeRecords') }}</p>
· {{ ReadCookiesTime }} {{ $t('common_add.buy') }} {{ addConsume.goodsName.value }}({{ $t('common_add.operator') }}: {{ adminData.adminName }})
· {{ ReadCookiesTime }} {{ $t('common_add.buy') }} {{ addConsume.goodsName.value }}({{
$t('common_add.operator') }}: {{ adminData.adminName }})
</div> </div>
<div style="margin-top: 10px"> <div style="margin-top: 10px">
<p>{{ $t('common_add.continueOperation') }}</p> <p>{{ $t('common_add.continueOperation') }}</p>
@ -917,4 +1087,4 @@ p {
} }
} }
} }
</style>
</style>
Loading…
Cancel
Save