95 lines
4.4 KiB
TypeScript
95 lines
4.4 KiB
TypeScript
// rules.ts
|
|
import type { FormRules } from 'element-plus'
|
|
|
|
// 接收上级上限参数
|
|
export const rules = (parentLimit: any = { position: 0, commissionRatio: 0 }): FormRules => {
|
|
return {
|
|
//手机号
|
|
phone: [
|
|
{ required: true, message: '请输入手机号', trigger: ['blur'] },
|
|
{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: ['blur'] },
|
|
],
|
|
//邮箱
|
|
email: [
|
|
{ required: true, message: '请输入邮箱地址', trigger: ['blur'] },
|
|
{ type: 'email', message: '请输入正确的邮箱格式', trigger: ['blur'] }
|
|
],
|
|
accountName: [
|
|
{ required: true, message: '请输入账户名称', trigger: 'blur' },
|
|
{ min: 2, max: 50, message: '账户名称长度需在2-50个字符之间', trigger: 'blur' }
|
|
],
|
|
level: [
|
|
{ required: true, message: '请选择级别', trigger: 'change' }
|
|
],
|
|
parentAccountName: [
|
|
{ required: true, message: '请选择所属上级', trigger: 'change' }
|
|
],
|
|
// 头寸:新增「不超过上级」校验
|
|
position: [
|
|
{ required: true, message: '请输入头寸', trigger: 'blur' },
|
|
{ pattern: /^-?\d+(\.\d+)?$/, message: '头寸需为数字(支持整数/小数/负数)', trigger: 'blur' },
|
|
{
|
|
validator: (rule, value, callback) => {
|
|
if (!value) return callback()
|
|
const inputVal = Number(value)
|
|
const maxVal = parentLimit.position
|
|
if (inputVal > maxVal) {
|
|
callback(new Error(`头寸不能大于上级的 ${maxVal}`))
|
|
} else {
|
|
callback()
|
|
}
|
|
},
|
|
trigger: 'blur'
|
|
}
|
|
],
|
|
// 手续费:新增「不超过上级」校验
|
|
commissionRatio: [
|
|
{ required: true, message: '请输入手续费', trigger: 'blur' },
|
|
{ pattern: /^\d+(\.\d+)?$/, message: '手续费需为非负数字(支持整数/小数)', trigger: 'blur' },
|
|
{ min: 0, max: 100, message: '手续费范围需在0-100之间', trigger: 'blur' },
|
|
{
|
|
validator: (rule, value, callback) => {
|
|
if (!value) return callback()
|
|
const inputVal = Number(value)
|
|
const maxVal = parentLimit.commissionRatio
|
|
if (inputVal > maxVal) {
|
|
callback(new Error(`手续费不能大于上级的 ${maxVal}`))
|
|
} else {
|
|
callback()
|
|
}
|
|
},
|
|
trigger: 'blur'
|
|
}
|
|
],
|
|
// 新增:批量校验已分配点差
|
|
pointDiffList: [
|
|
{
|
|
validator: (rule, value, callback) => {
|
|
// value 是 marketPointTree 数组
|
|
if (!value || value.length === 0) {
|
|
return callback() // 没有点差数据时不校验
|
|
}
|
|
|
|
// 遍历所有点差行,校验必填和数值合法性
|
|
for (const row of value) {
|
|
// 校验必填
|
|
if (row.assignedPointDifference === '' || row.assignedPointDifference === undefined) {
|
|
return callback(new Error(`品种【${row.varietyName || row.name}】的已分配点差不能为空`))
|
|
}
|
|
// 校验数值格式(非负数字)
|
|
const numVal = Number(row.assignedPointDifference)
|
|
if (isNaN(numVal) || numVal < 0) {
|
|
return callback(new Error(`品种【${row.varietyName || row.name}】的已分配点差需为非负数字`))
|
|
}
|
|
// 可选:校验不超过上级点差
|
|
if (row.pointDifference && numVal > Number(row.pointDifference)) {
|
|
return callback(new Error(`品种【${row.varietyName || row.name}】的已分配点差不能超过可分配点差 ${row.pointDifference}`))
|
|
}
|
|
}
|
|
callback()
|
|
},
|
|
trigger: 'change' // 数据变化时触发
|
|
}
|
|
]
|
|
}
|
|
} |