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) { 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) { const [, , callback] = args if (!payload.avatar.length) { callback(new Error('请上传全身照')) } else { callback() } } /**所在地区 */ export function validateLocation(args: any, payload: Record) { 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() } } }