fuyuan-housekeeping-admin/src/utils/validate.ts

360 lines
12 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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()
}
}
}