360 lines
12 KiB
TypeScript
360 lines
12 KiB
TypeScript
import { DispatchCountEnum, DispatchEnum, UseConditionEnum, UseGoodsEnum } from '@/enums/modeEnum'
|
||
import type { UploadFile } from 'element-plus'
|
||
|
||
/*
|
||
* @Author: micky 1254597151@qq.com
|
||
* @Date: 2023-08-14 15:56:31
|
||
* @LastEditors: micky 1254597151@qq.com
|
||
* @LastEditTime: 2024-01-09 16:32:58
|
||
* @FilePath: \housekeeping-admin\src\utils\validate.ts
|
||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||
*/
|
||
const mobileReg = /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/
|
||
|
||
const integerReg = /^\+?[1-9]\d*$/
|
||
const positiveNumberReg = /^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$/
|
||
|
||
const positiveNumberAndZeroReg = /^(0|[1-9]\d*)(\.\d{1,2})?$/
|
||
const idCardReg = /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/
|
||
const ageReg = /^(?:1[0-5][0-9]|[1-9][0-9]|[1-9])$/
|
||
|
||
/**
|
||
* @param {string} path
|
||
* @returns {Boolean}
|
||
*/
|
||
export function isExternal(path: string) {
|
||
return /^(https?:|mailto:|tel:)/.test(path)
|
||
}
|
||
|
||
/**手机号码 */
|
||
export function validateContact(rule: any, value: any, callback: any) {
|
||
if (value) {
|
||
if (!mobileReg.test(value)) {
|
||
callback(new Error('请输入正确的手机号'))
|
||
} else {
|
||
callback()
|
||
}
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**分销抽佣比 */
|
||
export function validateCommissionRate(args, payload: string) {
|
||
const [, value, callback] = args
|
||
if (value && positiveNumberAndZeroReg.test(value)) {
|
||
if (parseFloat(value) <= 20) {
|
||
callback()
|
||
} else {
|
||
callback(new Error(`${payload}抽佣比范围在0-20%`))
|
||
}
|
||
} else {
|
||
callback(new Error(`${payload}抽佣比请输入正数,且最多保留两位小数`))
|
||
}
|
||
}
|
||
|
||
/**分销码有效期 */
|
||
export function validateEffectTime(args, payload: any) {
|
||
const [, value, callback] = args
|
||
if (!payload.validEndTime) {
|
||
callback('请选择日期')
|
||
} else if (payload.validEndTime < payload.validStartTime) {
|
||
callback('结束日期不能小于开始日期')
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**分销抽佣比、师傅服务金额 */
|
||
export function validateServiceCommissionRate(args, payload: string, max: number) {
|
||
const [, value, callback] = args
|
||
if (positiveNumberAndZeroReg.test(value)) {
|
||
if (parseFloat(value) <= max) {
|
||
callback()
|
||
} else {
|
||
callback(new Error(`${payload}抽佣比范围在0-${max}%`))
|
||
}
|
||
} else {
|
||
callback(new Error(`${payload}抽佣比请输入正数,且最多保留两位小数`))
|
||
}
|
||
}
|
||
|
||
// 全数字
|
||
export function isNumber(path: string) {
|
||
return /^\d+$/.test(path)
|
||
}
|
||
// 带小数点的数字
|
||
export function isNumberWithDot(path: string) {
|
||
return /^(?!0\.00$)(?:0|[1-9]\d*)(?:\.\d{1,2})?$/.test(path)
|
||
}
|
||
|
||
/**优惠券的校验规则 */
|
||
/**优惠券面值 */
|
||
export function validateMoney(args: any, payload: any[]) {
|
||
const [, value, callback] = args
|
||
const [conditionType, conditionMoney] = payload
|
||
if (value && positiveNumberReg.test(value)) {
|
||
if (conditionType === UseConditionEnum.CONDITION) {
|
||
if (parseFloat(value) > parseFloat(conditionMoney)) {
|
||
callback(new Error('优惠值面额必须小于最低消费金额'))
|
||
} else {
|
||
callback()
|
||
}
|
||
} else {
|
||
callback()
|
||
}
|
||
} else {
|
||
callback(new Error('优惠面值请输入正数,但不包含0且最多保留两位小数'))
|
||
}
|
||
}
|
||
/**发放方式渠道派发 */
|
||
export function validateUserList(args: any, payload: number, channel: number) {
|
||
const [, value, callback] = args
|
||
if (payload === DispatchEnum.CHANNEL_DISPATCH) {
|
||
const val = value[channel]
|
||
if (!Array.isArray(val) || !val.length) {
|
||
callback(new Error('请选择赠送对象'))
|
||
} else {
|
||
callback()
|
||
}
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**品类券 */
|
||
export function validateServiceCategory(args: any, payload: number) {
|
||
const [, value, callback] = args
|
||
if (payload === UseGoodsEnum.CATEGORY) {
|
||
if (!value.length) {
|
||
callback(new Error('请选择商品品类'))
|
||
} else {
|
||
callback()
|
||
}
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**商品券 */
|
||
export function validateGoodsList(args: any, payload: number) {
|
||
const [, value, callback] = args
|
||
if (payload === UseGoodsEnum.CATEGOYR_PART) {
|
||
if (!value.length) {
|
||
callback(new Error('请选择商品'))
|
||
} else {
|
||
callback()
|
||
}
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**有门槛 */
|
||
export function valdiateConditionMoney(args: any, payload: number[]) {
|
||
const [, value, callback] = args
|
||
const [conditionType, money] = payload
|
||
if (conditionType === UseConditionEnum.CONDITION) {
|
||
if (!value) {
|
||
callback(new Error('请输入最低消费金额,但不包含0'))
|
||
} else if (positiveNumberReg.test(value)) {
|
||
if (money && parseFloat(value) < parseFloat(money)) {
|
||
callback(new Error('最低消费金额必须大于优惠券面值'))
|
||
} else {
|
||
callback()
|
||
}
|
||
} else {
|
||
callback(new Error('最低消费金额请输入正数,但不包含0且最多保留两位小数'))
|
||
}
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**限量 */
|
||
export function validateDispatchCount(args: any, payload: number[]) {
|
||
const [, value, callback] = args
|
||
const [sendTotalType, getType] = payload
|
||
if (getType == DispatchEnum.SYSTEM_GIVE) return callback()
|
||
if (sendTotalType === DispatchCountEnum.COUNT) {
|
||
if (!value) {
|
||
callback(new Error('请输入发放数量,但不包含0'))
|
||
} else if (integerReg.test(value)) {
|
||
callback()
|
||
} else {
|
||
callback(new Error('请输入正整数,但不包含0'))
|
||
}
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**用户可领取数量 */
|
||
export function validateGetNum(args: any, payload: number[]) {
|
||
const [, value, callback] = args
|
||
const [sendTotalType, dispatchCount] = payload
|
||
if (value && integerReg.test(value)) {
|
||
if (sendTotalType === DispatchCountEnum.COUNT && dispatchCount && value > dispatchCount) {
|
||
callback(new Error('用户领取数量必须小于发放数量'))
|
||
} else {
|
||
callback()
|
||
}
|
||
} else {
|
||
callback(new Error('请输入正整数,但不包含0'))
|
||
}
|
||
}
|
||
/**发放时间 */
|
||
export function validateSendTime(args: any, payload: number[]) {
|
||
const [, value, callback] = args
|
||
const [sendTimeStart, sendTimeEnd, useTimeStart, useTimeEnd] = payload
|
||
if (!sendTimeStart || !sendTimeEnd) {
|
||
callback(new Error('请选择发放时间'))
|
||
} else if (sendTimeStart === sendTimeEnd) {
|
||
callback(new Error('结束时间不能等于开始时间'))
|
||
} else if ((useTimeStart && sendTimeStart > useTimeStart) || (useTimeEnd && sendTimeEnd > useTimeEnd)) {
|
||
callback(new Error('发放时间的开始时间应该小于使用时间的开始时间,发放时间的结束时间应该小于使用时间的结束时间'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**使用时间 */
|
||
export function validateUseTime(args: any, payload: number[]) {
|
||
const [, value, callback] = args
|
||
const [useTimeStart, useTimeEnd, sendTimeStart, sendTimeEnd] = payload
|
||
if (!useTimeStart || !useTimeEnd) {
|
||
callback(new Error('请选择使用时间'))
|
||
} else if (useTimeStart === useTimeEnd) {
|
||
callback(new Error('结束时间不能等于开始时间'))
|
||
} else if ((useTimeStart && sendTimeStart > useTimeStart) || (useTimeEnd && sendTimeEnd > useTimeEnd)) {
|
||
callback(new Error('使用时间的开始时间应该大于发放时间的开始时间,使用时间的结束时间应该大于发放时间的结束时间'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
|
||
// 服务时间格式校验
|
||
export function validateGoodsTime(args: any) {
|
||
const [, value, callback] = args
|
||
if (!/^\+?[1-9]\d*$/.test(value)) {
|
||
callback(new Error('请输入正整数,但不包含0'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**身份证号 */
|
||
export function validateIdCard(rule: any, value: any, callback: any) {
|
||
if (value === '') {
|
||
callback(new Error('请输入身份证号'))
|
||
} else if (!idCardReg.test(value)) {
|
||
callback(new Error('身份证号格式有误'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**服务类别 */
|
||
export function validateGoodsIds(rule: any, value: any, callback: any) {
|
||
if (!value.length) {
|
||
callback(new Error('请选择服务类别'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**身份证照片 */
|
||
export function validateFileUploadList(args: any, payload: Record<string, UploadFile[]>) {
|
||
const [, , callback] = args
|
||
if (!payload.idCard.length) {
|
||
callback(new Error('请上传身份证正反面照片'))
|
||
} else if (payload.idCard.length < 2) {
|
||
callback(new Error('请上传2张身份证照片'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**师傅全身照 */
|
||
export function validateAvatarUploadList(args: any, payload: Record<string, UploadFile[]>) {
|
||
const [, , callback] = args
|
||
if (!payload.avatar.length) {
|
||
callback(new Error('请上传全身照'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**所在地区 */
|
||
export function validateLocation(args: any, payload: Record<string, any>) {
|
||
const [, , callback] = args
|
||
const { provinceId, cityId, districtId } = payload
|
||
if (provinceId === '' && cityId === '' && districtId === '') {
|
||
callback(new Error('请选择所在地区'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
|
||
export function validateAge(rule: any, value: any, callback: any) {
|
||
if (value === '') {
|
||
callback(new Error('请输入年龄'))
|
||
} else if (!ageReg.test(value)) {
|
||
callback(new Error('请输入正确的年龄'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
// 运营师傅工作时间
|
||
export function validateWorkTime(args: any, value: any) {
|
||
const [, , callback] = args
|
||
if (!value.workStartTime || !value.workEndTime) {
|
||
callback('请选择工作时间')
|
||
} else if (value.workStartTime > value.workEndTime) {
|
||
callback('结束时间不能小于开始时间')
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**重新指派师傅-扣分 */
|
||
export function validateScore(rule: any, value: any, callback: any) {
|
||
const reg = /^\d+(\.\d{1,2})?$/
|
||
if (value) {
|
||
if (value < 0 || value > 5) {
|
||
callback(new Error('最小0分,最大5分'))
|
||
} else if (!/^[0-9]\d*(\.\d+)?$/.test(value)) {
|
||
callback(new Error('请输入正数'))
|
||
} else if (!reg.test(value)) {
|
||
callback(new Error('请输入正数,最多保留2位小数'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
}
|
||
/**体检报告 */
|
||
export function validateFiles(args, payload: any) {
|
||
const [, value, callback] = args
|
||
const { pdf, report } = payload
|
||
if (report.length == 0 && pdf.length == 0) {
|
||
callback(new Error('请上传体检报告'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
/**扣款比例 */
|
||
export function validateValue(rule: any, value: any, callback: any) {
|
||
const _reg = /[^\d.]/g //移除特殊字符
|
||
const zeroReg = /^0+(\d+)/ //连续输入多个0
|
||
const precisionReg = /(\.\d\d)\d+$/ //最多保留2位小数
|
||
const _reg2 = /^\./ //点开头
|
||
const _reg3 = /(\.\d*\.)/g //连续输入多个小数点,只保留一个
|
||
|
||
if (value === '') {
|
||
callback(new Error('请输入退款比例'))
|
||
} else {
|
||
const parsedValue = parseFloat(value)
|
||
if (parsedValue < 0 || parsedValue > 100) {
|
||
callback(new Error('扣款比例范围在0-100'))
|
||
} else if (_reg.test(value)) {
|
||
callback(new Error('不能输入特殊字符'))
|
||
} else if (zeroReg.test(value)) {
|
||
callback(new Error('不能连续输入多个0'))
|
||
} else if (precisionReg.test(value)) {
|
||
callback(new Error('最多保留2位小数'))
|
||
} else if (_reg2.test(value)) {
|
||
callback(new Error('不能输入以点开头字符'))
|
||
} else if (_reg3.test(value)) {
|
||
callback(new Error('不能连续输入多个小数点'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
}
|