From e7b532e0514eae9c426465da6e6f922e6e9a0696 Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期二, 25 二月 2025 15:13:03 +0800 Subject: [PATCH] fix: bug --- packages/components/src/views/electricBillRecharge/electricBillRecharge.vue | 16 ++++++-- packages/components/src/components/Input/NumberInput.vue | 71 +++++++++++++++++++++++++++++++++++ packages/components/src/utils/validator.ts | 11 +++++ 3 files changed, 94 insertions(+), 4 deletions(-) diff --git a/packages/components/src/components/Input/NumberInput.vue b/packages/components/src/components/Input/NumberInput.vue new file mode 100644 index 0000000..c14c749 --- /dev/null +++ b/packages/components/src/components/Input/NumberInput.vue @@ -0,0 +1,71 @@ +<template> + <nut-input type="number" :formatter="formatter" formatTrigger="onBlur" v-model="innerModelValue"> + <template #right> + <slot name="right"></slot> + </template> + </nut-input> +</template> + +<script setup lang="ts"> +import { computed } from 'vue'; + +defineOptions({ + name: 'NumberInput', +}); + +type Props = { + min?: number; + max?: number; + precision?: number; + modelValue?: number | string; +}; + +const props = withDefaults(defineProps<Props>(), { + max: Math.pow(2, 53) - 1, +}); + +const emit = defineEmits<{ + (e: 'update:modelValue', val: string | number): void; +}>(); + +const innerModelValue = computed({ + get() { + return props.modelValue + ''; + }, + set(val) { + emit('update:modelValue', val); + }, +}); + +function formatter(value: string): string { + const newVal = value !== '' ? Number.parseFloat(value) : ''; + if (Number.isNaN(newVal)) { + return ''; + } + if (newVal && newVal > props.max) { + return `${toPrecision(props.max)}`; + } + if (props.min !== undefined && !!`${newVal}` && (newVal as number) < props.min) { + return `${toPrecision(props.min)}`; + } + return newVal !== '' ? `${toPrecision(newVal)}` : newVal; +} + +function toPrecision(num: number) { + if (props.precision) { + if (props.precision === 0) return Math.round(num); + let snum = String(num); + const pointPos = snum.indexOf('.'); + if (pointPos === -1) return num; + const nums = snum.replace('.', '').split(''); + const datum = nums[pointPos + props.precision]; + if (!datum) return num; + const length = snum.length; + if (snum.charAt(length - 1) === '5') { + snum = `${snum.slice(0, Math.max(0, length - 1))}6`; + } + return Number(snum).toFixed(props.precision); + } + return String(num); +} +</script> diff --git a/packages/components/src/utils/validator.ts b/packages/components/src/utils/validator.ts index cb4a54b..eecc3e3 100644 --- a/packages/components/src/utils/validator.ts +++ b/packages/components/src/utils/validator.ts @@ -20,6 +20,14 @@ // return Promise.resolve(true); // } + // 韬唤璇佸悗鍏綅 + static validatorIDNumberSix(value: string, ruleCfg: FormItemRuleWithoutValidator) { + if (BoleRegExp.RegIDNumberSix.test(value)) { + return Promise.resolve(true); + } + return Promise.reject(ruleCfg.message); + } + static validatorUrl(value: string, ruleCfg: FormItemRuleWithoutValidator) { if (BoleRegExp.RegUrl.test(value)) { return Promise.resolve(true); @@ -107,6 +115,9 @@ static RegUrl = /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})(\/\w+)*\/?$/; + // 韬唤璇佸悗鍏綅 + static RegIDNumberSix = /^\d{5}[X]$|^\d{6}$/; + static RegUrlWithParameter = /^((http|ftp|https):\/\/)?[\w\-_]+(\.[\w\-_]+)+([\w\-\\.,@?^=%&:/~\\+#]*[\w\-\\@?^=%&/~\\+#])?$/; diff --git a/packages/components/src/views/electricBillRecharge/electricBillRecharge.vue b/packages/components/src/views/electricBillRecharge/electricBillRecharge.vue index cb77357..bc8a618 100644 --- a/packages/components/src/views/electricBillRecharge/electricBillRecharge.vue +++ b/packages/components/src/views/electricBillRecharge/electricBillRecharge.vue @@ -30,11 +30,11 @@ /> </FormItem> <FormItem label="鐢电綉鎴峰彿" class="bole-form-item" prop="electricAccount" required> - <NutInput + <NumberInput v-model.trim="form.electricAccount" class="bole-input-text" placeholder="璇疯緭鍏�13浣嶆暟瀛楃紪鍙�" - type="text" + max-length="13" /> </FormItem> <FormItem @@ -49,6 +49,7 @@ class="bole-input-text" placeholder="璇疯緭鍏ヨ韩浠借瘉鍚庡叚浣�" type="text" + max-length="6" /> </FormItem> <FormItem @@ -132,6 +133,7 @@ import ConfirmDialog from '../../components/Dialog/ConfirmDialog.vue'; import ConfirmDialogInfoItem from '../../components/Dialog/ConfirmDialogInfoItem.vue'; import ChooseInputWithPicker from '../../components/Input/ChooseInputWithPicker.vue'; +import NumberInput from '../../components/Input/NumberInput.vue'; import { useGetRate, useGetElectricParValue } from '../../hooks'; import { FormValidator } from '../../utils'; @@ -187,8 +189,14 @@ const rules = reactive<FormRules>({ province: [{ required: true, message: '璇烽�夋嫨鎵�鍦ㄥ煄甯�' }], electricAccountType: [{ required: true, message: '璇烽�夋嫨鐢佃垂绫诲瀷' }], - electricAccount: [{ required: true, message: '璇疯緭鍏ョ數缃戞埛鍙�' }], - sixID: [{ required: true, message: '璇疯緭鍏ヨ韩浠借瘉鍚庡叚浣�' }], + electricAccount: [{ required: true, message: '璇疯緭鍏ョ數缃戞埛鍙�', regex: /^\d{13}$/ }], + sixID: [ + { + required: true, + message: '璇疯緭鍏ヨ韩浠借瘉鍚庡叚浣�', + validator: FormValidator.validatorIDNumberSix, + }, + ], parValue: [ { required: true, message: '璇烽�夋嫨鍏呭�奸噾棰�', validator: FormValidator.validatorNumberNotNull }, ], -- Gitblit v1.9.1