// 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' // 数据变化时触发 } ] } }