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