From 53baf1b2fa7e17f7b41e0999bc452f80efe6d216 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期二, 25 二月 2025 16:53:12 +0800
Subject: [PATCH] Merge branch 'master' of http://120.26.58.240:8888/r/LifePaymentFront
---
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