📐 业务逻辑(严格对应表单字段)
📍 进入表单前的拦截(硬约束)
· 选门店时若
s.platforms.length === 0(未授权任何平台)→ Toast "该门店未授权任何平台,无法创建活动,请先完成平台授权" →
禁止进入创建活动表单。
① 基本信息
·
活动名称:必填,
maxlength="30",trim 后非空且 ≤ 30 字(超长 Toast "活动名称不能超过30个字")
·
店铺名称:从
shopList 下拉选,只列已有门店
·
试吃归类:5 选 1 下拉(不限 / 美食 / 饮品 / 甜点 / 正餐)
② 平台活动配置(3 张卡:meituan / eleme / jd)
·
是否开启活动:每张卡独立开关,至少开启 1 张卡
·
用户实付金额:元,
v.payAmount > 0 必填
·
返现金额:元,
v.cashback > 0 必填;< 5 元时该字段下方自动显示橙色警告"低于 5 元,无法同步霸王餐"
·
活动名额:个,
v.quota > 0 必填
·
每日限量:个/天,可空(
0 = 不限)
· 4 个数值字段都带"−/+"按钮,
> 0 时才能 −(防负数),可手动输入
· 平台卡头部可点击"展开 ⌄/收起 ⌃"切换显示
·
编辑已创建活动时,平台被锁定(
actLockedPlat 非空时只显示对应平台卡,其他 v-show 隐藏,且该卡右上角显示"本活动已锁定XX平台,不支持修改")
③ 时间配置
·
开始时间:
type="date",必填
·
结束时间:
type="date",必填
·
每日开始时间:
type="time",必填,默认 "08:00"
·
每日结束时间:
type="time",必填,默认 "20:00"
④ 评鉴方案(必填)
· 5 个等级(下拉单选):
① 无需评价 ② 用餐反馈(无需图文) ③ 用餐反馈(需含文) ④ 用餐反馈(需含图) ⑤ 用餐反馈(需含图含文)
⑤ 其他要求
· 12 选 1(下拉单选,可空):
需满实付 / 多图多字 / 仅限一瓶饮品 / 宝子们要3图15字哈 / 禁止预订单 / 宝子们要收藏店铺哈 / 宝子们要五公里内下单哦 / 文字反馈即可 / 餐品真实图片哦 / 反馈图片要该订单餐品哦 / 自定义
· 标签仅作提醒,不是强制要求
⑥ 服务协议(必勾选)
· 复选框
actAgree 必须为 true,否则 Toast "请先同意行用惠平台商家服务协议"
· UI 上"创建活动"按钮未做 disabled 联动,靠 saveAct 提示兜底
📋 saveAct() 校验顺序(任一失败 return)
a. 活动名称:trim 后非空、长度 ≤ 30 字
b. 开始时间 / 结束时间:不能为空
c. 评鉴方案:不能为空(未选)
d. 平台开关:至少开启 1 个平台(
Object.entries().filter(v => v.enabled))
e. 每个开启平台:实付金额 > 0、返现金额 > 0、活动名额 > 0;
返现金额 ≥ 实付金额 × 0.5(下限
Math.floor(payAmount*0.5*100)/100,2 位小数)
f. 协议同意:actAgree 必须为 true
💰 活动金(创建后扣款)
· 99 元起,先检查钱包余额
· 余额不足 → 弹充值弹窗(与 电子签约 / 制作合同 共用
#topupMask)
· 余额充足 → 扣款并创建 → 写
localStorage['yh_act_fee']
🗂 创建后的数据写入
·
activities 数组 unshift 新活动(
newId = Math.max(...ids) + 1)
· 初始字段:
status="待审核",
exposure=0, visits=0, grab=0, used=0, completeOrders=0, salesRate=0, actFee=false, feePaid=false, collected=0
·
target = quota × (payAmount - cashback)(目标完成金额)
· Toast "已创建",关闭弹窗,
closeSub() 返回上一页
🔄 活动状态机迁移(系统每分钟自动检查)
① 创建活动 →
未启动 + 待缴费
② 缴纳活动金 →
未启动 + 已缴费(状态不变,只改缴费标志)
③ 到
startTime + 已缴费 + 仍在
endTime 内 → 自动
进行中(用户可报名)
④ 到
endTime → 自动
已结束
⑤ 手动结束 →
已结束
⑥ 手动取消(未启动) →
已取消 + 已缴费用退回待缴费
·
已结束和
已取消仅可删除