fix: 修改订单计算逻辑

This commit is contained in:
2025-09-19 18:32:25 +08:00
parent 37f1079b1f
commit f76dff67d4
20 changed files with 1800 additions and 701 deletions

View File

@@ -10,7 +10,7 @@
</div>
</div>
<div>
<el-switch v-model="isOpen" v-if="props.showSwitch" />
<el-switch v-model="isOpen" active-value="1" inactive-value="0" v-if="props.showSwitch" />
</div>
</div>
</template>

View File

@@ -8,7 +8,7 @@
<el-form-item label="周期价格" required>
<el-input v-model="form.price" placeholder="周期价格" type="number" />
</el-form-item>
<el-form-item label="赠送成长值" required>
<el-form-item label="赠送成长值">
<el-input v-model="form.reward" placeholder="开通后立刻获得经验" type="number" />
</el-form-item>
<el-form-item label="赠送优惠券">
@@ -117,6 +117,9 @@ function submit() {
ElMessage.error("请选择会员周期");
return;
}
if (!form.value.circleUnit) {
ElMessage.error("请选择会员周期单位");
}
const ispass = form.value.couponList.every((item) => item.num && item.coupon.id);
if (!ispass) {
ElMessage.error("请选择优惠券并输入数量");

View File

@@ -5,7 +5,7 @@
intro="用户会员管理设置"
icon="super_vip"
showSwitch
v-model:isOpen="isOpenSuperVip"
v-model:isOpen="basicForm.isOpen"
></HeaderCard>
<el-tabs class="mt-4" v-model="activeTab" type="border-card">
<el-tab-pane :label="item.label" v-for="item in configs" :key="item.name" :name="item.name">
@@ -68,6 +68,10 @@
style="margin-left: 20px"
v-if="item.label != '绑定手机号' && item.checked"
v-model="item.value"
:step="item.step"
:precision="item.precision || 0"
:step-strictly="item.stepStrictly || false"
:min="item.min || 0"
/>
</div>
</div>
@@ -96,8 +100,8 @@
</el-form-item>
<el-form-item label="享受会员价">
<el-radio-group v-model="basicForm.isMemberPrice">
<el-radio :value="1">所有支付方式</el-radio>
<el-radio :value="0">仅余额支付</el-radio>
<el-radio :value="1"></el-radio>
<el-radio :value="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="规则说明">
@@ -113,23 +117,31 @@
<h3>升级规则</h3>
<el-form-item label="获取成长值升级">
<div class="color-666">
<div class="m-b-4">
<span>每消费1元获得</span>
<el-input-number
class="m-x-2"
v-model="basicForm.costReward"
placeholder="请输入内容"
/>
<span>成长值</span>
</div>
<div>
<span>每充值1元获得</span>
<el-input-number
class="m-x-2"
v-model="basicForm.rechargeReward"
placeholder="请输入内容"
/>
<span>成长值</span>
<div class="flex">
<div>
<div class="m-b-4">
<span>每消费1元获得</span>
<el-input-number
class="m-x-2"
v-model="basicForm.costReward"
placeholder="请输入内容"
/>
<span>成长值</span>
</div>
<div>
<span>每充值1元获得</span>
<el-input-number
class="m-x-2"
v-model="basicForm.rechargeReward"
placeholder="请输入内容"
/>
<span>成长值</span>
</div>
</div>
<span class="ml-4" style="color: red; font-size: 12px">
*两个条件必选有一条是大于0的数值
</span>
</div>
</div>
</el-form-item>
@@ -152,6 +164,7 @@
style="margin-top: 20px"
@tab-remove="removeLevel"
@tab-add="addLevel"
@tab-change="levelTabChange"
editable
>
<el-tab-pane
@@ -162,7 +175,7 @@
>
<!-- 编辑会员等级参数 -->
<el-form :model="level" label-width="150px">
<el-form-item label="会员标题">
<el-form-item label="会员标题" required>
<el-input
v-model="level.name"
:style="inputStyle"
@@ -170,18 +183,24 @@
placeholder="请输入会员标题"
/>
</el-form-item>
<el-form-item label="所需成长值">
<el-input
<el-form-item label="所需成长值" required>
<el-input-number
:disabled="index == 0"
v-model="level.experienceValue"
type="number"
placeholder="请输入所需成长值"
:style="inputStyle"
:min="levelExperienceValueMin(index, level)"
/>
</el-form-item>
<el-form-item label="会员折扣">
<el-input
<el-form-item label="会员折扣" required>
<el-input-number
v-model="level.discount"
:style="inputStyle"
:step="1"
step-strictly
:min="1"
:max="100"
type="number"
placeholder="请输入会员折扣"
/>
@@ -210,8 +229,11 @@
style="margin-top: 10px"
class="color-666 flex"
>
<span class="no-wrap">每消</span>
<el-input
<span class="no-wrap">每消</span>
<el-input-number
:min="0.01"
:precision="2"
:controls="false"
class="m-x-2"
v-model="level.costRewardPoints"
type="number"
@@ -221,16 +243,17 @@
</div>
</div>
</el-form-item>
<el-form-item label="等级说明">
<el-form-item label="等级说明" required>
<el-input
v-model="level.remark"
style="width: 400px"
:maxlength="250"
:autosize="{ minRows: 4, maxRows: 5 }"
type="textarea"
placeholder="请输入等级说明,最多 250 字"
/>
</el-form-item>
<el-form-item label="周期时间">
<!-- <el-form-item label="周期时间">
<div class="flex w-full gap-2">
<el-input
style="width: 140px"
@@ -244,7 +267,7 @@
<el-option label="年" value="年" />
</el-select>
</div>
</el-form-item>
</el-form-item> -->
<el-form-item label="自动发放">
<div>
<el-switch
@@ -257,7 +280,7 @@
<el-radio :value="false">已禁用</el-radio>
</el-radio-group> -->
<div v-if="level.isCycleReward" style="margin-top: 10px">
<!-- <div class="flex">
<div class="flex">
<span class="color-666 no-wrap mr-4">周期时间</span>
<el-input
v-model="level.cycleTime"
@@ -269,10 +292,13 @@
<el-option label="月" value="月" />
<el-option label="年" value="年" />
</el-select>
</div> -->
</div>
<div class="flex mt-4">
<span class="color-666 no-wrap mr-4">赠送积分</span>
<el-input
<el-input-number
:step="1"
step-strictly
:min="1"
v-model="level.cycleRewardPoints"
type="number"
placeholder="赠送积分"
@@ -332,9 +358,6 @@ const inputStyle = {
const router = useRouter();
//是否开启超级会员
const isOpenSuperVip = ref(false);
const refDialogPlans = ref();
const configs = [
{ name: "basic", label: "会员基础设置" },
@@ -344,9 +367,31 @@ const configs = [
const activeTab = ref("basic");
const conditionLists = ref([
{ label: "绑定手机号", checked: false, code: "BIND_PHONE" },
{ label: "订单达成指定次数", checked: false, value: "", code: "ORDER" },
{ label: "消费达到指定金额", checked: false, value: "", code: "COST_AMOUNT" },
{ label: "充值达到指定金额", checked: false, value: "", code: "RECHARGE_AMOUNT" },
{
label: "订单达成指定次数",
checked: false,
value: "",
code: "ORDER",
step: 1,
stepStrictly: true,
min: 1,
},
{
label: "消费达到指定金额",
checked: false,
value: "",
code: "COST_AMOUNT",
precision: 2,
min: 0.01,
},
{
label: "充值达到指定金额",
checked: false,
value: "",
code: "RECHARGE_AMOUNT",
precision: 2,
min: 0.01,
},
]);
const basicForm = reactive({
isSubmitInfo: 1,
@@ -358,6 +403,7 @@ const basicForm = reactive({
rechargeReward: 0,
memberPriceShopIdList: [],
isMemberPrice: 1,
isOpen: 0,
});
function deletePlan(row) {
const index = basicForm.configList.indexOf(row);
@@ -384,6 +430,27 @@ function basicSubmit() {
// if (data.openType == "CONDITION") {
// data.configList = null;
// }
console.log(data);
if (basicForm.openType == "PAY" && (!basicForm.configList || basicForm.configList.length <= 0)) {
return ElMessage.error("请添加会员方案");
}
data.conditionList = conditionLists.value
.filter((v) => v.checked)
.map((v) => {
return {
code: v.code,
value: v.value,
};
});
if (
basicForm.openType == "CONDITION" &&
(!data.conditionList || data.conditionList.length <= 0)
) {
return ElMessage.error("请选择成为会员条件");
}
if (basicForm.costReward <= 0 && basicForm.rechargeReward <= 0) {
return ElMessage.error("获取成长值升级规则两个条件必选有一条是大于0的数值");
}
data.conditionList = conditionLists.value
.filter((v) => v.checked)
.map((v) => {
@@ -404,11 +471,6 @@ const levels = ref([]);
// 当前选中的会员等级
const selectedLevel = ref(null);
// 优惠券列表
const couponList = ref([
{ id: 1, name: "满100减10" },
{ id: 2, name: "满200减30" },
]);
let activeLevelId = ref(null);
// 添加会员等级
function addLevel() {
@@ -425,15 +487,16 @@ function addLevel() {
const newLevel = {
name,
experienceValue: 0,
discount: 1,
discount: 100,
logo: "",
costRewardPoints: 1,
isCostRewardPoints: 1,
isCostRewardPoints: 0,
isCycleReward: 0,
cycleTime: 1,
cycleUnit: "月",
cycleRewardPoints: 1,
cycleRewardCouponList: [],
remark: "",
};
console.log(newLevel);
levels.value.push(newLevel);
@@ -476,10 +539,36 @@ async function removeLevel(index) {
}
// 保存会员等级
async function saveLevel(level) {
const isPass = level.cycleRewardCouponList.every((item) => item.num && item.coupon.id);
if (!isPass) {
ElMessage.error("请选择优惠券并输入数量");
return;
if (level.isCycleReward) {
if (level.cycleRewardCouponList && level.cycleRewardCouponList.length) {
const isPass = (level.cycleRewardCouponList || []).every(
(item) => item.num && item.coupon.id
);
if (!isPass) {
ElMessage.error("请选择优惠券并输入数量");
return;
}
}
if (
(!level.cycleRewardCouponList || level.cycleRewardCouponList.length <= 0) &&
level.cycleRewardPoints <= 0
) {
ElMessage.error("赠送积分和送优惠券必须填充一项");
return;
}
}
if (level.name.trim() === "") {
return ElMessage.error("请输入会员标题");
}
if (level.experienceValue === "") {
return ElMessage.error("请输入所需成长值");
}
if (level.discount === "") {
return ElMessage.error("请输入会员折扣");
}
if (level.remark.trim() === "") {
return ElMessage.error("请输入等级说明");
}
const res = level.id ? await memberApi.levelEdit(level) : await memberApi.levelAdd(level);
if (res) {
@@ -509,6 +598,8 @@ async function init() {
});
memberApi.getConfig().then((res) => {
Object.assign(basicForm, res);
res.conditionList = res.conditionList || [];
res.configList = res.configList || [];
conditionLists.value = conditionLists.value.map((v) => {
const findItem = res.conditionList.find((cond) => cond.code == v.code);
if (findItem) {
@@ -538,10 +629,19 @@ function totalCount(arr) {
return total + item.num * 1;
}, 0);
}
//
function levelExperienceValueMin(index, level) {
if (index == 0) {
return 0;
}
return levels.value[index - 1].experienceValue + 1;
}
//返回
function close() {
router.back();
}
//
function levelTabChange(index) {}
</script>
<style lang="scss" scoped>