From 7b15bbf1363982a03dd33c95f3ccdfdcfb7c1d47 Mon Sep 17 00:00:00 2001
From: cuiqian2004 <cuiqian2004@163.com>
Date: 星期五, 14 三月 2025 18:20:31 +0800
Subject: [PATCH] oi-form

---
 components/oi-form/list/time-picker/index.vue       |   92 +
 components/oi-form/list/date-picker/index.vue       |   82 +
 components/oi-form/list/select/index.vue            |   66 +
 pages/modal/3018_2.vue                              |  347 +-----
 components/oi-form/list/input-number/index.vue      |   72 +
 components/oi-form/list/layout/index.vue            |   68 +
 components/oi-form/list/textarea/index.vue          |   64 +
 pages/modal/3200_view.vue                           |  175 ---
 /dev/null                                           |  128 --
 pages/modal/5601.vue                                |  342 +-----
 pages/modal/3037_2.vue                              |  234 ----
 components/oi-form/list/text/index.vue              |   31 
 components/oi-form/list/switch/index.vue            |   36 
 components/oi-form/list/index.vue                   |  129 ++
 components/oi-form/list/radio/index.vue             |   56 +
 pages/modal/form/index.vue                          |  312 +-----
 components/oi-form/index.vue                        |   99 ++
 components/oi-form/list/input/index.vue             |  103 ++
 components/oi-form/list/date-picker-range/index.vue |   74 +
 pages/modal/3200.vue                                |  265 ----
 manifest.json                                       |    4 
 components/oi-form/list/checkbox/index.vue          |   55 +
 22 files changed, 1,317 insertions(+), 1,517 deletions(-)

diff --git a/components/oi-date-time-picker/index.js b/components/oi-date-time-picker/index.js
deleted file mode 100644
index e4dd950..0000000
--- a/components/oi-date-time-picker/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import OIDatePicker from './oi-date-picker.vue'
-import OIDatePickerRange from './oi-date-picker-range.vue'
-import OITimePicker from './oi-time-picker.vue'
-export default {
-	OIDatePicker,
-	OIDatePickerRange,
-	OITimePicker
-}
\ No newline at end of file
diff --git a/components/oi-date-time-picker/oi-date-picker-range.vue b/components/oi-date-time-picker/oi-date-picker-range.vue
deleted file mode 100644
index 69676ba..0000000
--- a/components/oi-date-time-picker/oi-date-picker-range.vue
+++ /dev/null
@@ -1,126 +0,0 @@
-<template>
-	<uni-datetime-picker type="daterange" v-model="displayValue" :start="start" :end="end" :returnType="returnType"
-		:placeholder="placeholder" :startPlaceholder="startPlaceholder" :endPlaceholder="endPlaceholder"
-		:rangeSeparator="rangeSeparator" :border="border" :disabled="disabled" :clearIcon="clearIcon"
-		@change="onChange" />
-</template>
-
-<script>
-	import dayjs from "dayjs";
-	export default {
-		name: 'OIDatePickerRange',
-		props: {
-			modelValue: {
-				type: [String, Number, Array, Date],
-				default: ''
-			},
-			start: {
-				type: [Number, String],
-				default: ''
-			},
-			end: {
-				type: [Number, String],
-				default: ''
-			},
-			returnType: {
-				type: String,
-				default: 'string'
-			},
-			placeholder: {
-				type: String,
-				default: ''
-			},
-			startPlaceholder: {
-				type: String,
-				default: ''
-			},
-			endPlaceholder: {
-				type: String,
-				default: ''
-			},
-			rangeSeparator: {
-				type: String,
-				default: '-'
-			},
-			border: {
-				type: [Boolean],
-				default: true
-			},
-			disabled: {
-				type: [Boolean],
-				default: false
-			},
-			clearIcon: {
-				type: [Boolean],
-				default: true
-			},
-			format: {
-				type: String,
-				default: ''
-			}
-		},
-		data() {
-			return {
-				displayValue: "",
-			}
-		},
-		methods: {
-			toDate(t) {
-				if (!t) return undefined;
-				else if (typeof t == "string") {
-					if (t.includes(",")) return this.toDate(t.split(","));
-					else return this.toDate([t, t]);
-				} else if (t instanceof Array) {
-					let dt = [];
-					let d0 = t[0];
-					let d1 = t[1];
-					if (!d0 && !d1) return undefined;
-					else if (!d0) return undefined;
-					else if (!d1) d1 = d0;
-
-					let dt0 = new Date(dayjs(d0).format("YYYY-MM-DD"));
-					let dt1 = new Date(dayjs(d1).format("YYYY-MM-DD"));
-					return [dt0, dt1];
-				}
-			},
-			onChange(val) {
-				if (val instanceof Array) {
-					let format = "YYYY-MM-DD";
-					if (this.format)
-						format = this.format
-						.replace(/y/g, "Y")
-						.replace(/m/g, "M")
-						.replace(/d/g, "D");
-					let dt = [];
-					let d0 = val[0];
-					let d1 = val[1];
-					if (!d0 && !d1) return undefined;
-					else if (!d0) return undefined;
-					else if (!d1) d1 = d0;
-					let dt0 = dayjs(d0).format(format);
-					let dt1 = dayjs(d1).format(format);
-
-					this.$emit("update:modelValue", [dt0, dt1])
-					this.$emit('input', [dt0, dt1])
-					this.$emit("change", [dt0, dt1])
-				}
-			},
-		},
-		watch: {
-			// #ifndef VUE3
-			value(val) {
-				this.displayValue = this.toDate(val);
-			},
-			// #endif
-			// #ifdef VUE3
-			modelValue(val) {
-				this.displayValue = this.toDate(val);
-			},
-			// #endif
-		},
-
-	}
-</script>
-
-<style>
-</style>
\ No newline at end of file
diff --git a/components/oi-date-time-picker/oi-date-picker.vue b/components/oi-date-time-picker/oi-date-picker.vue
deleted file mode 100644
index 2aa55ab..0000000
--- a/components/oi-date-time-picker/oi-date-picker.vue
+++ /dev/null
@@ -1,137 +0,0 @@
-<template>
-	<uni-datetime-picker type="date" v-model="displayValue" :start="start" :end="end" :returnType="returnType"
-		:placeholder="placeholder" :border="border" :disabled="disabled" :clearIcon="clearIcon" @change="onChange" />
-</template>
-
-<script>
-	import dayjs from "dayjs";
-	export default {
-		name: 'OIDatePicker',
-		emits: ['update:modelValue', 'clear'],
-		props: {
-			value: {
-				type: [String, Number, Date],
-				default: ''
-			},
-			modelValue: {
-				type: [String, Number, Date],
-				default: ''
-			},
-
-			start: {
-				type: [Number, String],
-				default: ''
-			},
-			end: {
-				type: [Number, String],
-				default: ''
-			},
-			returnType: {
-				type: String,
-				default: 'string'
-			},
-			placeholder: {
-				type: String,
-				default: ''
-			},
-			border: {
-				type: [Boolean],
-				default: true
-			},
-			disabled: {
-				type: [Boolean],
-				default: false
-			},
-			clearIcon: {
-				type: [Boolean],
-				default: true
-			},
-			hideSecond: {
-				type: [Boolean],
-				default: false
-			},
-			format: {
-				type: String,
-				default: ''
-			},
-			defaultToday: {
-				type: Boolean,
-				default: false
-			}
-		},
-		data() {
-			return {
-				displayValue: "",
-			}
-		},
-		methods: {
-			onChange(date) {
-
-				let format = "YYYY-MM-DD";
-				if (this.format)
-					format = this.format
-					.replace(/y/g, "Y")
-					.replace(/m/g, "M")
-					.replace(/d/g, "D");
-				let date2 = dayjs(date).format(format);
-				console.log(date, this.displayValue, date2)
-
-				this.$emit("update:modelValue", date2)
-				this.$emit('input', date2)
-				this.$emit("change", date2)
-			},
-			checkDefaultDate() {
-				let format = "YYYY-MM-DD";
-				if (this.format)
-					format = this.format
-					.replace(/y/g, "Y")
-					.replace(/m/g, "M")
-					.replace(/d/g, "D");
-				if (this.defaultToday && !this.value) {
-					this.displayValue = dayjs().format("YYYY-MM-DD");
-					let date = dayjs(this.displayValue).format(format);
-					this.$emit("update:modelValue", date)
-					this.$emit('input', date)
-					this.$emit("change", date)
-				}
-			},
-		},
-		mounted() {
-			this.checkDefaultDate();
-		},
-		watch: {
-			// #ifndef VUE3
-
-			value: {
-				immediate: true,
-				handler(newVal) {
-					if (newVal) {
-						this.displayValue = dayjs(newVal).format("YYYY-MM-DD");
-					} else {
-						this.displayValue = ''
-					}
-				},
-			},
-			// #endif
-			// #ifdef VUE3
-			modelValue: {
-				immediate: true,
-				handler(newVal) {
-					console.log(newVal)
-					if (newVal) {
-						this.displayValue = dayjs(newVal).format("YYYY-MM-DD");
-					} else {
-						this.displayValue = ''
-					}
-				},
-
-			},
-
-			// #endif
-
-		},
-	}
-</script>
-
-<style>
-</style>
\ No newline at end of file
diff --git a/components/oi-date-time-picker/oi-time-picker.vue b/components/oi-date-time-picker/oi-time-picker.vue
deleted file mode 100644
index f2586a3..0000000
--- a/components/oi-date-time-picker/oi-time-picker.vue
+++ /dev/null
@@ -1,128 +0,0 @@
-<template>
-	<view class="oi-time-picker">
-		<picker mode="time" :disabled="disabled" @change="onChange">
-			<view class="oi-time-picker-x"
-				:class="{'oi-time-picker-disabled': disabled,'oi-time-picker-border': border}">
-				<uni-icons class="icon-calendar" type="calendar" color="#c0c4cc" size="22"></uni-icons>
-				<view class="oi-time-picker-input">{{displayValue}}</view>
-			</view>
-		</picker>
-	</view>
-</template>
-<script>
-	import dayjs from "dayjs";
-	export default {
-		name: 'OITimePicker',
-		props: {
-			value: {
-				type: String,
-				default: ''
-			},
-			modelValue: {
-				type: [String, Number],
-				default: ''
-			},
-			placeholder: {
-				type: String,
-				default: ''
-			},
-			border: {
-				type: [Boolean],
-				default: true
-			},
-			disabled: {
-				type: [Boolean],
-				default: false
-			},
-			format: {
-				type: String,
-				default: ''
-			},
-
-		},
-		data() {
-			return {
-				displayValue: "",
-			}
-		},
-		methods: {
-			onChange(e) {
-				this.displayValue = e.detail.value
-				console.log(this.displayValue, e.detail)
-				this.$emit('update:modelValue', this.displayValue)
-				this.$emit('input', this.displayValue)
-				this.$emit("change", this.displayValue)
-			},
-
-		},
-		mounted() {
-
-		},
-		watch: {
-			// #ifndef VUE3
-			value(val) {
-				this.displayValue = val
-			},
-			// #endif
-			// #ifdef VUE3
-			modelValue(val) {
-				this.displayValue = val
-			},
-			// #endif
-
-		},
-	}
-</script>
-
-<style lang="scss">
-	.oi-time-picker {
-
-		width: 100%;
-		flex: 1;
-
-		.oi-time-picker-x {
-
-
-			display: flex;
-			flex-direction: row;
-			align-items: center;
-			justify-content: center;
-			border-radius: 4px;
-			background-color: #fff;
-			color: #666;
-			font-size: 14px;
-			flex: 1;
-
-
-
-			.icon-calendar {
-				padding-left: 3px;
-			}
-
-			.oi-time-picker-input {
-				width: auto;
-				height: 35px;
-				/* #ifndef MP */
-				padding-left: 5px;
-				/* #endif */
-				position: relative;
-				flex: 1;
-				line-height: 35px;
-				font-size: 14px;
-				overflow: hidden;
-			}
-
-		}
-
-		.oi-time-picker-disabled {
-			opacity: 0.4;
-			cursor: default;
-		}
-
-		.oi-time-picker-border {
-			box-sizing: border-box;
-			border-radius: 4px;
-			border: 1px solid #e5e5e5;
-		}
-	}
-</style>
\ No newline at end of file
diff --git a/components/oi-form/index.vue b/components/oi-form/index.vue
new file mode 100644
index 0000000..fd8bbc0
--- /dev/null
+++ b/components/oi-form/index.vue
@@ -0,0 +1,99 @@
+<template>
+	<uni-forms class="oi-form" ref="baseForm" label-align="right">
+		<template v-for="(item,index) in form.items">
+			<OIFormLayout v-if="item.name == 'Layout'" v-show="!item.isHidden" :focusId="focusId" :viewMode="viewMode"
+				:hiddenIds="hiddenIds" :data="item" @change="onChange" @focus="onFocus" @click="onClick"
+				@click-prefix="onClickPrefix" @click-suffix="onClickSuffix">
+			</OIFormLayout>
+			<OIFormItem v-else :hiddenIds="hiddenIds" :focusId="focusId" :viewMode="viewMode" :data="item"
+				@change="onChange" @focus="onFocus" @click="onClick" @click-prefix="onClickPrefix"
+				@click-suffix="onClickSuffix">
+			</OIFormItem>
+		</template>
+
+	</uni-forms>
+</template>
+
+<script>
+	import OIFormItem from './list/index.vue'
+	import OIFormLayout from './list/layout/index.vue'
+	export default {
+		name: "OIForm",
+		components: {
+			OIFormItem,
+			OIFormLayout
+		},
+		props: {
+			form: {
+				type: Object,
+				required: true,
+			},
+			viewMode: {
+				type: Boolean,
+				default: false
+			},
+			focusId: {
+				type: String,
+				default: ''
+			},
+			hiddenIds: {
+				type: Array,
+				default: () => [],
+			},
+		},
+		data() {
+			return {
+
+			}
+		},
+		methods: {
+			setFormItemVisible(attrs) {
+				attrs.forEach((attr) => {
+					let index = this.hiddenIds.findIndex((id) => id == attr.attr);
+					if (attr.show) {
+						if (index > -1) this.hiddenIds.splice(index, 1);
+					} else {
+						if (index == -1) this.hiddenIds.push(attr.attr);
+					}
+				});
+			},
+			clearFormValues() {
+				if (!this.form.model) return;
+				Object.keys(this.form.model).forEach((attr) => {
+					let value = this.form.model[attr];
+					value =
+						typeof value == "number" ?
+						0 :
+						typeof value == "string" ?
+						"" :
+						value instanceof Array ? [] : {};
+					this.form.model[attr] = value;
+				});
+			},
+			onChange(item) {
+				var attr = item.fieldId;
+				this.form.model[attr] = item.value;
+				this.$emit("change", item)
+			},
+			onClick(item) {
+				this.$emit("click", item)
+			},
+			onFocus(item) {
+				this.$emit("focus", item)
+			},
+			onClickPrefix(item) {
+				this.$emit("click-prefix", item)
+			},
+			onClickSuffix(item) {
+				this.$emit("click-suffix", item)
+			},
+		}
+	};
+</script>
+
+<style lang="less">
+	.oi-form {
+		
+
+	}
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/checkbox/index.vue b/components/oi-form/list/checkbox/index.vue
new file mode 100644
index 0000000..905c4c0
--- /dev/null
+++ b/components/oi-form/list/checkbox/index.vue
@@ -0,0 +1,55 @@
+<template>
+	<view class="oi-form-checkbox">
+		<!-- 澶嶉�妗�-->
+		<checkbox-group v-if="model" :class="data.disabled?'input-disabled':''" :disabled="data.disabled"
+			@change="onChange">
+			<label v-for="(item) in data.selections" :key="item.value" class="checkbox-item">
+				<checkbox :value="item.value" :checked="model[data.fieldId].includes(item.value)" />
+				<text>{{item.label}}</text>
+			</label>
+		</checkbox-group>
+		<checkbox-group v-else :class="data.disabled?'input-disabled':''" :disabled="data.disabled" @change="onChange">
+			<label v-for="(item) in data.selections" :key="item.value" class="checkbox-item">
+				<checkbox :value="item.value" :checked="data.value.includes(item.value)" />
+				<text>{{item.label}}</text>
+			</label>
+		</checkbox-group>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "OIFormCheckbox",
+		props: {
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+		},
+		methods: {
+			onChange(e) {
+				let val = this.data.value = e.detail.value || []
+				if (this.model) {
+					this.model[this.data.fieldId] = val
+				}
+				this.data.value = val
+				this.$emit("change", val)
+			},
+
+		}
+	};
+</script>
+
+<style lang="less" scoped>
+	.oi-form-checkbox {
+		width: 100%;
+		.checkbox-item{
+			vertical-align: middle;
+			margin-left: 10rpx
+		}
+		.input-disabled {
+			background-color: #f3f3f3 !important;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/date-picker-range/index.vue b/components/oi-form/list/date-picker-range/index.vue
new file mode 100644
index 0000000..698ae8f
--- /dev/null
+++ b/components/oi-form/list/date-picker-range/index.vue
@@ -0,0 +1,74 @@
+<template>
+	<uni-datetime-picker v-if="model"  type="daterange" :value="toDate(model[data.fieldId])"
+		:placeholder="data.placeholder" :rangeSeparator="data.setting.separator" border :disabled="data.disabled"
+		@change="onChange" />
+	<uni-datetime-picker v-else type="daterange" :value="data.value" :placeholder="data.placeholder"
+		:rangeSeparator="data.setting.separator" border :disabled="data.disabled" @change="onChange" />
+</template>
+
+<script>
+	import dayjs from "dayjs";
+	export default {
+		name: 'OIFormDatePickerRange',
+		props: {
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+		},
+		data() {
+			return {}
+		},
+		computed: {},
+		methods: {
+			toDate(t) {
+				if (!t) return undefined;
+				else if (typeof t == "string") {
+					if (t.includes(",")) return this.toDate(t.split(","));
+					else return this.toDate([t, t]);
+				} else if (t instanceof Array) {
+					let dt = [];
+					let d0 = t[0];
+					let d1 = t[1];
+					if (!d0 && !d1) return undefined;
+					else if (!d0) return undefined;
+					else if (!d1) d1 = d0;
+
+					let dt0 = new Date(dayjs(d0).format("YYYY-MM-DD"));
+					let dt1 = new Date(dayjs(d1).format("YYYY-MM-DD"));
+					return [dt0, dt1];
+				}
+			},
+			onChange(val) {
+				if (val instanceof Array) {
+					let format = "YYYY-MM-DD";
+					if (this.data.setting.format)
+						format = this.data.setting.format
+						.replace(/y/g, "Y")
+						.replace(/m/g, "M")
+						.replace(/d/g, "D");
+					let dt = [];
+					let d0 = val[0];
+					let d1 = val[1];
+					if (!d0 && !d1) return undefined;
+					else if (!d0) return undefined;
+					else if (!d1) d1 = d0;
+					let dt0 = dayjs(d0).format(format);
+					let dt1 = dayjs(d1).format(format);
+					let date2 = [dt0, dt1]
+					if (!this.model) {
+						this.data.value = date2
+					} else {
+						this.model[this.data.fieldId] = date2
+					}
+					this.$emit("change", date2)
+
+				}
+			},
+		},
+	}
+</script>
+
+<style>
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/date-picker/index.vue b/components/oi-form/list/date-picker/index.vue
new file mode 100644
index 0000000..d78bf70
--- /dev/null
+++ b/components/oi-form/list/date-picker/index.vue
@@ -0,0 +1,82 @@
+<template>
+	<uni-datetime-picker v-if="model" type="date" :value="model[data.fieldId]" :placeholder="data.placeholder" border
+		:disabled="data.disabled" clearIcon @change="onChange" />
+	<uni-datetime-picker v-else type="date" :value="data.value" :placeholder="data.placeholder" border
+		:disabled="data.disabled" clearIcon @change="onChange" />
+</template>
+
+<script>
+	import dayjs from "dayjs";
+	export default {
+		name: 'OIFormDatePicker',
+		props: {
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+		},
+		data() {
+			return {}
+		},
+		computed: {
+		},
+		methods: {
+			onChange(date) {
+				let format = "YYYY-MM-DD";
+				if (this.data.setting.format)
+					format = this.data.setting.format
+					.replace(/y/g, "Y")
+					.replace(/m/g, "M")
+					.replace(/d/g, "D");
+				let date2 = dayjs(date).format(format);
+				if (!this.model) {
+					this.data.value = date2
+				} else {
+					this.model[this.data.fieldId] = date2
+				}
+				this.$emit("change", date2)
+			},
+			checkDefaultDate() {
+				let format = "YYYY-MM-DD";
+				if (!this.model) {
+					return
+				}
+				if (this.data.setting.format)
+					format = this.data.setting.format
+					.replace(/y/g, "Y")
+					.replace(/m/g, "M")
+					.replace(/d/g, "D");
+
+				if (this.data.setting.defaultToday && !this.model[this.data.fieldId]) {
+					let date = dayjs().format(format);
+					this.model[this.data.fieldId] = date
+				}
+
+			},
+		},
+		mounted() {
+			if (!this.model) {
+				if (this.data.setting.defaultToday && !this.data.value) {
+					let format = "YYYY-MM-DD";
+					if (this.data.setting.format)
+						format = this.data.setting.format
+						.replace(/y/g, "Y")
+						.replace(/m/g, "M")
+						.replace(/d/g, "D");
+					let date = dayjs().format(format);
+					this.data.value = date
+				}
+			}
+			this.checkDefaultDate();
+		},
+		watch: {
+			data() {
+				this.checkDefaultDate();
+			},
+		},
+	}
+</script>
+
+<style>
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/index.vue b/components/oi-form/list/index.vue
new file mode 100644
index 0000000..c3abb35
--- /dev/null
+++ b/components/oi-form/list/index.vue
@@ -0,0 +1,129 @@
+<template>
+	<view :class="viewMode ? 'oi-form-item-view':'oi-form-item'">
+		<uni-forms-item v-show="!hiddenIds.includes(data.fieldId)"
+			:label="data.labelWidth === 0 ? '' : data.label? data.label+'锛�:''"
+			:label-width="data.labelWidth || data.labelWidth === 0 ? data.labelWidth : 100+'px'"
+			:style="{ textAlign: data.setting.align }">
+			<OIFormText v-if="viewMode && data.disabled" :data="data" :model="model">
+			</OIFormText>
+			<OIFormInput v-else-if="data.name == 'Input'" :viewMode="viewMode" :focus="focusId== data.fieldId"
+				:data="data" :model="model" @change="onChange" @focus="onFocus" @click="onClick"
+				@click-prefix="onClickPrefix" @click-suffix="onClickSuffix">
+			</OIFormInput>
+			<OIFormInputNumber v-else-if="data.name == 'InputNumber'" :focus="focusId== data.fieldId" :data="data"
+				:model="model" @change="onChange" @focus="onFocus" @click="onClick">
+			</OIFormInputNumber>
+			<OIFormTextArea v-else-if="data.name == 'Textarea'" :focus="focusId== data.fieldId" :data="data"
+				:model="model" @change="onChange" @focus="onFocus" @click="onClick">
+			</OIFormTextArea>
+			<OIFormSelect v-else-if="data.name == 'Select'" :data="data" :model="model" @change="onChange">
+			</OIFormSelect>
+			<OIFormSwitch v-else-if="data.name == 'Switch'" :data="data" :model="model" @change="onChange">
+			</OIFormSwitch>
+			<OIFormCheckbox v-else-if="data.name == 'Checkbox'" :data="data" :model="model" @change="onChange">
+			</OIFormCheckbox>
+			<OIFormRadio v-else-if="data.name == 'Radio'" :data="data" :model="model" @change="onChange">
+			</OIFormRadio>
+			<OIFormDatePicker v-else-if="data.name == 'DatePicker'" :data="data" :model="model" @change="onChange">
+			</OIFormDatePicker>
+			<OIFormTimePicker v-else-if="data.name == 'TimePicker'" :data="data" :model="model" @change="onChange">
+			</OIFormTimePicker>
+			<OIFormDatePickerRange v-else-if="data.name == 'DatePickerRange'" :data="data" :model="model"
+				@change="onChange">
+			</OIFormDatePickerRange>
+			<OIFormText v-else-if="data.name == 'Text'" :data="data" :model="model">
+			</OIFormText>
+			<OIFormText v-else :data="data" :model="model">
+			</OIFormText>
+		</uni-forms-item>
+	</view>
+</template>
+
+<script>
+	import OIFormInput from './input/index.vue'
+	import OIFormInputNumber from './input-number/index.vue'
+	import OIFormText from './text/index.vue'
+	import OIFormTextArea from './textarea/index.vue'
+	import OIFormSelect from './select/index.vue'
+	import OIFormSwitch from './switch/index.vue'
+	import OIFormCheckbox from './checkbox/index.vue'
+	import OIFormRadio from './radio/index.vue'
+	import OIFormDatePicker from './date-picker/index.vue'
+	import OIFormDatePickerRange from './date-picker-range/index.vue'
+	import OIFormTimePicker from './time-picker/index.vue'
+	export default {
+		name: "OIFormItem",
+		components: {
+			OIFormInput,
+			OIFormInputNumber,
+			OIFormText,
+			OIFormTextArea,
+			OIFormSelect,
+			OIFormSwitch,
+			OIFormCheckbox,
+			OIFormRadio,
+			OIFormDatePicker,
+			OIFormDatePickerRange,
+			OIFormTimePicker
+		},
+		props: {
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+			viewMode: {
+				type: Boolean,
+				default: false
+			},
+			focusId: {
+				type: String,
+				default: ''
+			},
+			hiddenIds: {
+				type: Array,
+				default: () => [],
+			},
+		},
+		methods: {
+			onChange(e) {
+				this.$emit("change", this.data)
+			},
+			onClick(e) {
+				this.$emit("click", this.data)
+			},
+			onFocus(e) {
+				this.$emit("focus", this.data)
+			},
+			onClickPrefix() {
+				this.$emit("click-prefix", this.data)
+			},
+			onClickSuffix() {
+				this.$emit("click-suffix", this.data)
+			},
+		},
+		mounted() {
+			console.log("item", this.data)
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	.oi-form-item {
+		.uni-forms-item {
+			margin-bottom: 11rpx;
+		}
+
+	}
+	.oi-form-item-view {
+		.uni-forms-item {
+			padding-bottom: 5rpx;
+			margin-bottom: 0;
+
+			.uni-forms-item__label {
+				height: 20px !important;
+				padding: 0 10rpx 0 0 !important;
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/input-number/index.vue b/components/oi-form/list/input-number/index.vue
new file mode 100644
index 0000000..0063d6d
--- /dev/null
+++ b/components/oi-form/list/input-number/index.vue
@@ -0,0 +1,72 @@
+<template>
+	<view class="oi-form-input-number">
+		<input v-if="model" type="number" class="oi-input-number" :class="data.disabled?'input-disabled':''" v-model="model[data.fieldId]" :focus="focus"
+			:placeholder="data.placeholder" @blur="onChange" @confirm="onConfirm" @click="onClick"
+			:disabled="data.disabled"></input>
+		<input v-else type="number" class="oi-input-number" :class="data.disabled?'input-disabled':''" v-model="data.value" :focus="focus"
+			:placeholder="data.placeholder" @blur="onChange" @confirm="onConfirm" @click="onClick"
+			:disabled="data.disabled"></input>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "OIFormInputNumber",
+		props: {
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+			focus: {
+				type: Boolean,
+				default: false
+			},
+		},
+		methods: {
+			onChange(e) {
+				this.$emit("change", e)
+			},
+			onConfirm(e) {
+				this.onChange(e)
+			},
+			onClick(e) {
+				this.$emit("click", e)
+			},
+		
+		}
+	};
+</script>
+
+<style lang="less" scoped>
+	.oi-form-input-number {
+		border: 1px solid #d5d5d5;
+				width: calc(100%- 6rpx);
+		border-radius: 6px !important;
+		padding: 3rpx;
+		.input-disabled {
+			background-color: #f3f3f3 !important;
+		}
+
+		.oi-input-number {
+			color: #2d8cf0;
+			padding: 10rpx 8rpx;
+			width: calc(100% - 12rpx);
+			padding: 5rpx;
+			border: 1px solid #d5d5d5;
+			color: #2d8cf0;
+			height: 20px;
+			background: #FFF;
+			line-height: 20px;
+			border-radius: 6px !important;
+			font-size: 14px;
+			font-family: inherit;
+			box-shadow: none !important;
+			transition-duration: 0.1s;
+			vertical-align: middle;
+		}
+	}
+	.oi-form-input-number:hover {
+		border: 1px solid rgb(41, 121, 255);
+	}
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/input/index.vue b/components/oi-form/list/input/index.vue
new file mode 100644
index 0000000..a0ec6f0
--- /dev/null
+++ b/components/oi-form/list/input/index.vue
@@ -0,0 +1,103 @@
+<template>
+	<view class="oi-form-input">
+		<text v-if="data.setting.prefix && !viewMode" class="form-input-icon" :class="[data.setting.prefix]"
+			@click="onPrefixButton">&#xe568;</text>
+		<input v-if="model" class="oi-input" :class="data.disabled?'input-disabled':''"
+			:style="{'padding-left':data.setting.prefix?0 : '8rpx','right':data.setting.suffix?0 : '8rpx'}"
+			v-model="model[data.fieldId]" :focus="focus" :placeholder="data.placeholder" @focus="onFocus"
+			@blur="onChange" @confirm="onConfirm" @click="onClick" :disabled="data.disabled" :maxlength="-1"></input>
+		<input v-else class="oi-input" :class="data.disabled?'input-disabled':''"
+			:style="{'padding-left':data.setting.prefix?0 : '8rpx','right':data.setting.suffix?0 : '8rpx'}"
+			v-model="data.value" :focus="focus" :placeholder="data.placeholder" @blur="onChange" @confirm="onConfirm"
+			@click="onClick" :disabled="data.disabled"></input>
+		<text v-if="data.setting.suffix&& !viewMode" class="form-input-icon" :class="[data.setting.suffix]"
+			@click="onSuffixButton">&#xe568;</text>
+
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "OIFormInput",
+		props: {
+			viewMode: {
+				type: Boolean,
+				default: false
+			},
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+			focus: {
+				type: Boolean,
+				default: false
+			},
+		},
+		methods: {
+			onChange(e) {
+				this.$emit("change", e)
+			},
+			onConfirm(e) {
+				this.onChange(e)
+			},
+			onClick(e) {
+				this.$emit("click", e)
+			},
+			onFocus(e) {
+				this.$emit("focus", e)
+			},
+			onPrefixButton() {
+				this.$emit("click-prefix")
+			},
+			onSuffixButton() {
+				this.$emit("click-suffix")
+			},
+		}
+	};
+</script>
+
+<style lang="scss">
+	.oi-form-input {
+		border: 1px solid #d5d5d5;
+		border-radius: 6px !important;
+		padding: 3rpx;
+		width: calc(100%- 6rpx);
+		display: flex;
+		flex-direction: row;
+		
+		.input-disabled {
+			background-color: #f3f3f3 !important;
+		}
+
+		.oi-input {
+			color: #2d8cf0;
+			padding: 10rpx 8rpx;
+			flex: 1;
+			height: 20px;
+			background: #FFF;
+			line-height: 20px;
+			font-size: 14px;
+			font-family: inherit;
+			transition-duration: 0.1s;
+			vertical-align: middle;
+		}
+
+		.form-input-icon {
+			width: 30rpx;
+			font-family: uniicons;
+			font-weight: 400;
+			font-style: normal;
+			cursor: pointer;
+			display: inline-block;
+			vertical-align: middle;
+			padding: 10rpx 5rpx;
+			font-size: 32rpx;
+			color: rgb(192, 196, 204);
+		}
+	}
+
+	.oi-form-input:hover {
+		border: 1px solid rgb(41, 121, 255);
+	}
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/layout/index.vue b/components/oi-form/list/layout/index.vue
new file mode 100644
index 0000000..6c4bec0
--- /dev/null
+++ b/components/oi-form/list/layout/index.vue
@@ -0,0 +1,68 @@
+<template>
+	<!-- 鏍呮牸甯冨眬 -->
+	<uni-row :gutter="data.setting.gutter">
+		<uni-col
+			:span="data.setting.spanList && data.setting.spanList[key]? data.setting.spanList[key] : 24 / data.setting.col"
+			v-for="(col,key) in data.setting.colList">
+			<OIFormItem v-if="col != null" :focusId="focusId" :viewMode="viewMode" :data="col" :model="model"
+				:hiddenIds="hiddenIds" @change="onChange" @focus="onFocus" @click="onClick"
+				@click-prefix="onClickPrefix" @click-suffix="onClickSuffix"></OIFormItem>
+			<uni-forms-item v-else label=""></uni-forms-item>
+		</uni-col>
+	</uni-row>
+
+</template>
+
+<script>
+	import OIFormItem from '../index.vue'
+	export default {
+		name: "OIFormLayout",
+		components: {
+			OIFormItem,
+		},
+		props: {
+			viewMode: {
+				type: Boolean,
+				default: false
+			},
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+			focusId: {
+				type: String,
+				default: ''
+			},
+			hiddenIds: {
+				type: Array,
+				default: () => [],
+			},
+		},
+		methods: {
+			onChange(e) {
+				this.$emit("change", e)
+			},
+			onClick(e) {
+				this.$emit("click", e)
+			},
+			onFocus(e) {
+				this.$emit("focus", e)
+			},
+			onClickPrefix(e) {
+				this.$emit("click-prefix", e)
+			},
+			onClickSuffix(e) {
+				this.$emit("click-suffix", e)
+			},
+		},
+
+		mounted() {
+			console.log("layout", this.data.setting.colList)
+		},
+	};
+</script>
+
+<style lang="scss" scoped>
+	.oi-form-layout {}
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/radio/index.vue b/components/oi-form/list/radio/index.vue
new file mode 100644
index 0000000..236418f
--- /dev/null
+++ b/components/oi-form/list/radio/index.vue
@@ -0,0 +1,56 @@
+<template>
+	<view class="oi-form-radio">
+		<!-- 鍗曢�妗�-->
+		<radio-group v-if="model" :class="data.disabled?'input-disabled':''" :disabled="data.disabled"
+			@change="onChange">
+			<label  v-for="(item) in data.selections" :key="item.value" class="radio-item">
+				<radio :value="item.value" :checked="item.value === model[data.fieldId]" />
+				<text>{{item.label}}</text>
+			</label>
+		</radio-group>
+		<radio-group v-else :class="data.disabled?'input-disabled':''" :disabled="data.disabled" @change="onChange">
+			<label v-for="(item) in data.selections" :key="item.value" class="radio-item">
+				<radio :value="item.value" :checked="item.value === data.value" />
+				<text>{{item.label}}</text>
+			</label>
+		</radio-group>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "OIFormRadio",
+		props: {
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+		},
+		methods: {
+			onChange(e) {
+				let val = this.data.value = e.detail.value || ""
+				if (this.model) {
+					this.model[this.data.fieldId] = val
+				}
+				this.data.value = val
+				this.$emit("change", val)
+			},
+
+		}
+	};
+</script>
+
+<style lang="less" scoped>
+	.oi-form-radio {
+		width: 100%;
+		.radio-item {
+			vertical-align: middle;
+			margin-left: 10rpx
+		}
+
+		.input-disabled {
+			background-color: #f3f3f3 !important;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/select/index.vue b/components/oi-form/list/select/index.vue
new file mode 100644
index 0000000..accc501
--- /dev/null
+++ b/components/oi-form/list/select/index.vue
@@ -0,0 +1,66 @@
+<template>
+	<view class="oi-form-select">
+		<!-- 涓嬫媺閫夋嫨妗�-->
+		<uni-data-picker v-if="model" class="data-picker" :class="data.disabled?'input-disabled':''"
+			v-model="model[data.fieldId]" :localdata="data.useDict ? data.dict : data.selections" @change="onChange"
+			:readonly="data.disabled" :clear-icon="false" :popup-title="data.label"></uni-data-picker>
+		<uni-data-picker v-else class="data-picker" :class="data.disabled?'input-disabled':''" v-model="data.value"
+			:localdata="data.useDict ? data.dict : data.selections" @change="onChange" :readonly="data.disabled"
+			:clear-icon="false" :popup-title="data.label"></uni-data-picker>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "OIFormSelect",
+		props: {
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+		},
+		methods: {
+			onChange(e) {
+				this.$emit("change", e)
+			},
+
+		}
+	};
+</script>
+
+<style lang="less" scoped>
+	.oi-form-select {
+		width: 100%;
+		.data-picker {
+			width: 100%;
+			background: #FFF;
+			border-radius: 0 !important;
+			color: #2d8cf0;
+			/* padding: 10rpx 8rpx 12rpx; */
+			font-size: 34rpx;
+			font-family: inherit;
+			box-shadow: none !important;
+			transition-duration: 0.1s;
+			margin-top: 0rpx;
+			/* vertical-align: 10px; */
+			vertical-align: middle;
+
+			.uni-select {
+				border: 1px solid #ccc;
+				border-radius: 0 !important;
+				color: #2d8cf0;
+			}
+
+			.uni-select__input-text {
+				color: #2d8cf0;
+			}
+		}
+
+
+
+		.input-disabled {
+			background-color: #f3f3f3 !important;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/switch/index.vue b/components/oi-form/list/switch/index.vue
new file mode 100644
index 0000000..61be119
--- /dev/null
+++ b/components/oi-form/list/switch/index.vue
@@ -0,0 +1,36 @@
+<template>
+	<view class="oi-form-switch">
+		<!-- Switch寮�叧 -->
+		<switch v-if="model" :class="data.disabled?'input-disabled':''" :disabled="data.disabled"
+			v-model="model[data.fieldId]" @change="onChange" />
+		<switch v-else :class="data.disabled?'input-disabled':''" :disabled="data.disabled" v-model="data.value"
+			@change="onChange" />
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "OIFormSwitch",
+		props: {
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+		},
+		methods: {
+			onChange(e) {
+				this.$emit("change", e)
+			},
+
+
+		}
+	};
+</script>
+
+<style lang="less" scoped>
+	.oi-form-switch {
+		vertical-align: middle;
+		margin-left: 10rpx
+	}
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/text/index.vue b/components/oi-form/list/text/index.vue
new file mode 100644
index 0000000..beb95c3
--- /dev/null
+++ b/components/oi-form/list/text/index.vue
@@ -0,0 +1,31 @@
+<template>
+
+	<view class="oi-form-text" v-if="model" :class="{ 'align-fixed': data.fontSize < 18 }" :style="{fontSize: `${data.fontSize}px`, color: data.color,fontWeight: data.bold ? 'bold' : '',fontStyle: data.italic ? 'italic' : '',
+	}">{{model[data.fieldId]}}</view>
+	<view class="oi-form-text" v-else :class="{ 'align-fixed': data.fontSize < 18 }" :style="{fontSize: `${data.fontSize}px`, color: data.color,fontWeight: data.bold ? 'bold' : '',fontStyle: data.italic ? 'italic' : '',
+    }">{{data.value}}</view>
+</template>
+
+<script>
+	export default {
+		name: "OIFormText",
+		props: {
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+		},
+	};
+</script>
+
+<style lang="scss" scoped>
+	.oi-form-text {
+		word-break: break-all;
+
+		.align-fixed {
+			line-height: 1;
+			padding: 10px 12px 10px 0;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/textarea/index.vue b/components/oi-form/list/textarea/index.vue
new file mode 100644
index 0000000..57957fd
--- /dev/null
+++ b/components/oi-form/list/textarea/index.vue
@@ -0,0 +1,64 @@
+<template>
+	<view class="oi-form-textarea">
+		<textarea v-if="model" class="textarea" :class="data.disabled?'input-disabled':''" v-model="model[data.fieldId]"
+			:focus="focus" :placeholder="data.placeholder" @blur="onChange" @confirm="onConfirm" @click="onClick"
+			:disabled="data.disabled"></textarea>
+		<textarea v-else class="textarea" :class="data.disabled?'input-disabled':''" v-model="data.value" :focus="focus"
+			:placeholder="data.placeholder" @blur="onChange" @confirm="onConfirm" @click="onClick"
+			:disabled="data.disabled"></textarea>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "OIFormTextarea",
+		props: {
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+			focus: {
+				type: Boolean,
+				default: false
+			},
+		},
+		methods: {
+			onChange(e) {
+				this.$emit("change", e)
+			},
+			onConfirm(e) {
+				this.onChange(e)
+			},
+			onClick(e) {
+				this.$emit("click", e)
+			},
+
+
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	.oi-form-textarea {
+		border: 1px solid #d5d5d5;
+		width: calc(100%- 6rpx);
+		border-radius: 6px !important;
+		padding: 3rpx;
+
+		.input-disabled {
+			background-color: #f3f3f3 !important;
+		}
+
+		.textarea {
+			color: #2d8cf0;
+			padding: 10rpx 8rpx;
+			background: #FFF;
+		}
+
+	}
+
+	.oi-form-textarea:hover {
+		border: 1px solid rgb(41, 121, 255);
+	}
+</style>
\ No newline at end of file
diff --git a/components/oi-form/list/time-picker/index.vue b/components/oi-form/list/time-picker/index.vue
new file mode 100644
index 0000000..b694250
--- /dev/null
+++ b/components/oi-form/list/time-picker/index.vue
@@ -0,0 +1,92 @@
+<template>
+	<view class="oi-form-time-picker">
+		<picker v-if="model" mode="time" :disabled="data.disabled" @change="onChange">
+			<view class="oi-time-picker-x oi-time-picker-border" :class="{'oi-time-picker-disabled': data.disabled}">
+				<uni-icons class="icon-calendar" type="calendar" color="#c0c4cc" size="22"></uni-icons>
+				<view class="oi-time-picker-input">{{model[data.fieldId]}}</view>
+			</view>
+		</picker>
+		<picker v-else mode="time" :disabled="data.disabled" @change="onChange">
+			<view class="oi-time-picker-x oi-time-picker-border" :class="{'oi-time-picker-disabled': data.disabled}">
+				<uni-icons class="icon-calendar" type="calendar" color="#c0c4cc" size="22"></uni-icons>
+				<view class="oi-time-picker-input">{{data.value}}</view>
+			</view>
+		</picker>
+	</view>
+</template>
+<script>
+	export default {
+		name: "OIFormTimePicker",
+		props: {
+			data: {
+				type: Object,
+				required: true,
+			},
+			model: Object,
+		},
+		data() {
+			return {
+
+			}
+		},
+		methods: {
+			onChange(e) {
+				let val = e.detail.value + ":00"
+				if (!this.model) {
+					this.data.value = val
+				} else {
+					this.model[this.data.fieldId] = val
+				}
+				this.$emit("change", val)
+			},
+		},
+
+	}
+</script>
+
+<style lang="scss" scoped>
+	.oi-form-time-picker {
+		width: 100%;
+
+		.oi-time-picker-x {
+			display: flex;
+			flex-direction: row;
+			align-items: center;
+			justify-content: center;
+			border-radius: 4px;
+			background-color: #fff;
+			color: #666;
+			font-size: 14px;
+			flex: 1;
+
+			.icon-calendar {
+				padding-left: 3px;
+			}
+
+			.oi-time-picker-input {
+				width: auto;
+				height: 35px;
+				/* #ifndef MP */
+				padding-left: 5px;
+				/* #endif */
+				position: relative;
+				flex: 1;
+				line-height: 35px;
+				font-size: 14px;
+				overflow: hidden;
+			}
+
+		}
+
+		.oi-time-picker-disabled {
+			opacity: 0.4;
+			cursor: default;
+		}
+
+		.oi-time-picker-border {
+			box-sizing: border-box;
+			border-radius: 4px;
+			border: 1px solid #e5e5e5;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/manifest.json b/manifest.json
index 66cfb8b..7c48b89 100644
--- a/manifest.json
+++ b/manifest.json
@@ -2,8 +2,8 @@
     "name" : "MoboxPDA",
     "appid" : "__UNI__56D451E",
     "description" : "",
-    "versionName" : "1.1.45",
-    "versionCode" : 1145,
+    "versionName" : "1.1.47",
+    "versionCode" : 1147,
     "transformPx" : false,
     /* 5+App鐗规湁鐩稿叧 */
     "app-plus" : {
diff --git a/pages/modal/3018_2.vue b/pages/modal/3018_2.vue
index 29fca4f..462bf79 100644
--- a/pages/modal/3018_2.vue
+++ b/pages/modal/3018_2.vue
@@ -2,161 +2,10 @@
 	<view class="uni-page-modal-3018-2">
 		<view class="view-content">
 			<!-- 琛ㄥご鏍峰紡 -->
-			<uni-forms ref="baseForm" label-align="right">
-				<view class="v-headStyle" v-for="(item,index) in head_styledef.form.items">
-					<!-- 鏅�甯冨眬 -->
-					<uni-forms-item v-if="item.name != 'Layout'&& item.show==true"
-						:label="item.label ? item.label +'锛�:'' " :label-width="item.labelWidth+'px'">
-						<!-- <text class="txt_title" :style="{'width':item.labelWidth+'px'}">{{item.label}}锛�/text> -->
-						<!-- 涓嬫媺妗�鍗曢� item.useDict?item.dict:item.selections-->
-						<uni-data-select id="dv_select" v-if="item.name=='Select'"
-							:style="'width: calc(100% - '+item.labelWidth-10+'px);'"
-							:class="item.disabled?'input-disabled':''" v-model="item.value" :localdata="item.dict"
-							@change="onEnterChange(item)" :disabled="item.disabled" :clear="false"></uni-data-select>
-						<!-- 鏂囨湰妗�鏁板瓧妗�-->
-						<view class="input-wrapper" v-if="(item.name=='Input' || item.name=='InputNumber')">
-							<text v-if="item.setting.prefix" class="uni-icon" :class="[item.setting.prefix]"
-								@click="classAttr_extButton(item)">&#xe568;</text>
-							<input class="uni-input" :class="item.disabled?'input-disabled':''"
-								:type="item.name=='Input'?'text':item.name=='InputNumber'?'number':'text'"
-								v-model="item.value" :disabled="item.disabled" :placeholder="item.placeholder"
-								:style="{'padding-left':item.setting.prefix?0 : '8rpx','right':item.setting.suffix?0 : '8rpx'}"
-								:focus="focusFieldId == item.fieldId" @focus="ontap(item)" @click="onClick(item)"
-								@keyup.enter="onEnterChange(item)" @blur="onEnterChange(item)" :maxlength="-1" />
-							<text v-if="item.setting.suffix" class="uni-icon" :class="[item.setting.suffix]"
-								@click="classAttr_extButton(item)">&#xe568;</text>
-						</view>
-						<!-- 澶氳鏂囨湰 -->
-						<view class="input-wrapper" v-if="item.name=='Textarea' ">
-							<textarea class="uni-input" :class="item.disabled?'input-disabled':''" v-model="item.value"
-								:focus="focusFieldId == item.fieldId" :placeholder="item.placeholder"
-								@blur="onEnterChange(item)" @click="onClick(item)" :data-index="index"
-								style="height:60px;" :style="{'width':'96%'}" :disabled="item.disabled"></textarea>
+			<OIForm ref="refBaseForm" class="v-headStyle" :form="head_styledef.form" :focusId="focusFieldId"
+				@click="onClick" @focus="ontap" @change="onEnterChange" @click-prefix="classAttr_extButton"
+				@click-suffix="classAttr_extButton"></OIForm>
 
-						</view>
-						<!-- 澶嶉�妗�-->
-						<checkbox-group class="check_rememberPwd" v-if="item.name=='Checkbox'"
-							:class="item.disabled?'input-disabled':''" :disabled="item.disabled"
-							@change="onCheckBoxValue" :data-attr="item.fieldId" :data-index="index">
-							<label v-for="(item2) in item.selections" :key="item2.value">
-								<checkbox :value="item2.value" :checked="item.value.includes(item2.value)" />
-								<text>{{item2.label}}</text>
-							</label>
-						</checkbox-group>
-						<!-- 鍗曢�妗�-->
-						<radio-group class="check_rememberPwd" v-if="item.name=='Radio'"
-							:class="item.disabled?'input-disabled':''" :disabled="item.disabled"
-							@change="onRadioBoxValue" :data-attr="item.fieldId" :data-index="index">
-							<label v-for="(item2) in item.selections" :key="item2.value">
-								<radio :value="item2.value" :checked="item2.value === item.value" />
-								<text>{{item2.label}}</text>
-							</label>
-						</radio-group>
-						<!-- Switch寮�叧 -->
-						<switch class="input-switch" v-if="item.name=='Switch'"
-							:class="item.disabled?'input-disabled':''" :disabled="item.disabled" v-model="item.value"
-							@change="onModelValue(item)" />
-						<!-- 鏃ユ湡鏃堕棿 -->
-						<!-- <view class="input-wrapper" v-if="(item.name=='TimePicker' || item.name=='DatePicker')">
-							<picker mode="date" class="date_iput" :class="item.disabled?'input-disabled':''"
-								:disabled="item.disabled" :value="item.value" @change="onModelValue(item)">
-								<view class="picker">{{item.value}}</view>
-							</picker>
-						</view> -->
-						<OIDatePicker v-if="item.name=='DatePicker'" :class="item.disabled?'input-disabled':''"
-							:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-							:defaultToday="item.setting.defaultToday" :format="item.setting.format"
-							@change="onModelValue(item)" />
-						<OIDatePickerRange v-if="item.name=='DatePickerRange'" :rangeSeparator="item.setting.separator"
-							:format="item.setting.format" :class="item.disabled?'input-disabled':''"
-							:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-							@change="onModelValue(item)" />
-						<OITimePicker v-if="item.name=='TimePicker'" :class="item.disabled?'input-disabled':''"
-							:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-							@change="onModelValue(item)" />
-					</uni-forms-item>
-					<!-- 鏍呮牸甯冨眬 -->
-					<uni-row class="demo-uni-row" v-if="item.name=='Layout'">
-						<uni-col v-for="(cols,key) in item.setting.colList"
-							:span="item.setting.spanList?item.setting.spanList[key]:24 / item.setting.col">
-							<uni-forms-item v-if="cols!=null  && cols.show==true"
-								:label="cols.label? cols.label +'锛�:''" :label-width="cols.labelWidth+'px'">
-								<view class="input-wrapper" v-if="(cols.name=='Input' || cols.name=='InputNumber') ">
-									<text v-if="cols.setting.prefix" class="uni-icon" :class="[cols.setting.prefix]"
-										@click="classAttr_extButton(cols)">&#xe568;</text>
-									<input class="uni-input" :class="cols.disabled?'input-disabled':''"
-										:type="cols.name=='Input'?'text':cols.name=='InputNumber'?'number':'text'"
-										v-model="cols.value" :disabled="cols.disabled" :placeholder="cols.placeholder"
-										:style="{'padding-left':cols.setting.prefix?0 : '8px','right':cols.setting.suffix?0 : '8px'}"
-										:focus="focusFieldId == cols.fieldId" @focus="ontap(cols)"
-										@click="onClick(cols)" @keyup.enter="onEnterChange(cols)"
-										@blur="onEnterChange(cols)" :maxlength="-1" />
-									<text v-if="cols.setting.suffix" class="uni-icon" :class="[cols.setting.suffix]"
-										@click="classAttr_extButton(cols)">&#xe568;</text>
-								</view>
-								<!-- 涓嬫媺妗�鍗曢� cols.useDict?cols.dict:cols.selections-->
-								<uni-data-select id="dv_select" v-if="cols.name=='Select' "
-									:class="cols.disabled?'input-disabled':''" v-model="cols.value"
-									:localdata="cols.dict" @change="onEnterChange(cols)" :disabled="cols.disabled"
-									:clear="false"></uni-data-select>
-								<!-- 澶氳鏂囨湰 -->
-								<view class="input-wrapper" v-if="cols.name=='Textarea' ">
-									<textarea class="uni-input" v-model="cols.value"
-										:class="cols.disabled?'input-disabled':''" :placeholder="cols.placeholder"
-										:focus="focusFieldId == cols.fieldId" @blur="onEnterChange(cols)"
-										@click="onClick(cols)" style="height:60px;" :style="{'width':'96%'}"
-										:disabled="cols.disabled"></textarea>
-								</view>
-								<!-- 澶嶉�妗�-->
-								<checkbox-group class="check_rememberPwd" v-if="cols.name=='Checkbox'"
-									:class="cols.disabled?'input-disabled':''" :disabled="cols.disabled"
-									@change="onCheckBoxValue" :data-attr="cols.fieldId" :data-index="index"
-									:data-iindex="key">
-									<label v-for="(cols2) in cols.selections" :key="cols2.value">
-										<checkbox :value="cols2.value" :checked="cols.value.includes(cols2.value)" />
-										<text>{{cols2.label}}</text>
-									</label>
-								</checkbox-group>
-								<!-- 鍗曢�妗�-->
-								<radio-group class="check_rememberPwd" v-if="cols.name=='Radio'"
-									:class="cols.disabled?'input-disabled':''" :disabled="cols.disabled"
-									@change="onRadioBoxValue" :data-attr="cols.fieldId" :data-index="index"
-									:data-iindex="key">
-									<label v-for="(cols2) in cols.selections" :key="cols2.value">
-										<radio :value="cols2.value" :checked="cols2.value === cols.value" />
-										<text>{{cols2.label}}</text>
-									</label>
-								</radio-group>
-								<!-- Switch寮�叧 -->
-								<switch v-if="cols.name=='Switch'" :class="cols.disabled?'input-disabled':''"
-									:disabled="cols.disabled" v-model="cols.value" @change="onModelValue(cols)"
-									:style="{'margin-left':'10rpx'}" />
-								<!-- 鏃ユ湡鏃堕棿 -->
-								<!-- <view class="input-wrapper"
-									v-if="(cols.name=='TimePicker' || cols.name=='DatePicker') && !cols.disabled">
-									<picker mode="date" class="date_iput" :class="cols.disabled?'input-disabled':''"
-										:disabled="cols.disabled" :value="cols.value" @change="onModelValue(cols)">
-										<view class="picker">{{cols.value}}</view>
-									</picker>
-								</view> -->
-								<OIDatePicker v-if="cols.name=='DatePicker'" :class="cols.disabled?'input-disabled':''"
-									:disabled="cols.disabled" v-model="cols.value" :placeholder="cols.placeholder"
-									:defaultToday="cols.setting.defaultToday" :format="cols.setting.format"
-									@change="onModelValue(cols)" />
-								<OIDatePickerRange v-if="cols.name=='DatePickerRange'"
-									:rangeSeparator="cols.setting.separator" :format="cols.setting.format"
-									:class="cols.disabled?'input-disabled':''" :disabled="cols.disabled"
-									v-model="cols.value" :placeholder="cols.placeholder" @change="onModelValue(cols)" />
-								<OITimePicker v-if="cols.name=='TimePicker'" :class="cols.disabled?'input-disabled':''"
-									:disabled="cols.disabled" v-model="cols.value" :placeholder="cols.placeholder"
-									@change="onModelValue(cols)" />
-							</uni-forms-item>
-							<uni-forms-item v-else label=""></uni-forms-item>
-
-						</uni-col>
-					</uni-row>
-				</view>
-			</uni-forms>
 		</view>
 		<view class="view-bottom">
 			<view class="uni-padding-wrap" v-if="dropdownBtns.length>0">
@@ -205,10 +54,7 @@
 	import Base64 from '../../components/js-base64/base64.js'
 	import utils from "@/js/utils.js"
 	import dayjs from "dayjs";
-	import OIDatePicker from '@/components/oi-date-time-picker/oi-date-picker.vue'
-	import OIDatePickerRange from '@/components/oi-date-time-picker/oi-date-picker-range.vue'
-	import OITimePicker from '@/components/oi-date-time-picker/oi-time-picker.vue'
-
+	import OIForm from '@/components/oi-form/index.vue'
 	import {
 		appGetInfo,
 		dictGetInfo
@@ -224,9 +70,7 @@
 			Base64,
 		},
 		components: {
-			OIDatePicker,
-			OIDatePickerRange,
-			OITimePicker
+			OIForm,
 		},
 		data() {
 			return {
@@ -734,11 +578,17 @@
 			onScanValue(item, value) {
 				const $this = this;
 				//console.log("onScanValue", item);
-				if (item.oldvalue != value) {
-					item.oldvalue = value;
-					item.value = value;
+				item.value = value
+				let newVal = item.value 
+				if (typeof item.value == "string") {
+					newVal = item.value.trim()
+					if (!newVal)
+						return
+				}
+				if (item.oldvalue != newVal) {
+					item.oldvalue = newVal;
 					var attr = item.fieldId;
-					$this.head_styledef.form.model[attr] = value;
+					$this.head_styledef.form.model[attr] = newVal;
 					var eventid = item.bind.onChangeEvent.id; //鍐呭鍙樺寲鍚庝簨浠� 					if (eventid) {
 						var obj_attr = this.head_styledef.form.model;
@@ -762,63 +612,60 @@
 						}
 						this.DataObjRunCustomEvent(info, '');
 					}
-					if (item.value) { //绗竴涓緭鍏ユ涓嶄负绌�-						//鍒濆鍖栵紝涓嬩釜杈撳叆妗唂ocus灞炴�
-						var findd = false
-						for (let i in $this.head_styledef.form.items) {
-							const ele = $this.head_styledef.form.items[i]
+					//鍒濆鍖栵紝涓嬩釜杈撳叆妗唂ocus灞炴�
+					var findd = false
+					for (let i in $this.head_styledef.form.items) {
+						const ele = $this.head_styledef.form.items[i]
 
-							if (ele.name != "Layout") {
-								if (ele.name == 'Input' || ele.name == 'InputNumber') {
-									if (attr == ele.fieldId) {
-										findd = true
-									} else {
-										if (findd) {
-											$this.setData({
-												focusFieldId: ele.fieldId
-											})
-											break
-										}
-
-									}
-
-								}
-							} else {
-								if (findd) {
-									let curIndex = ele.setting.colList.findIndex((col, index2, arr) => {
-										return (col.name == 'Input' || col.name == 'InputNumber');
-									})
-									if (curIndex > -1) {
+						if (ele.name != "Layout") {
+							if (ele.name == 'Input' || ele.name == 'InputNumber') {
+								if (attr == ele.fieldId) {
+									findd = true
+								} else {
+									if (findd) {
 										$this.setData({
-											focusFieldId: ele.setting.colList[curIndex]
-												.fieldId
+											focusFieldId: ele.fieldId
 										})
 										break
 									}
 
-								} else {
-									let curIndex = ele.setting.colList.findIndex((col, index2, arr) => {
-										return attr == col.fieldId;
-									})
-									if (curIndex > -1) {
-										findd = true
-										let curIndex2 = ele.setting.colList.findIndex((col, index2, arr) => {
-											return (col.name == 'Input' || col.name ==
-													'InputNumber') &&
-												index2 >
-												curIndex;
-										})
-										if (curIndex2 > -1) {
-											$this.setData({
-												focusFieldId: ele.setting.colList[curIndex]
-													.fieldId
-											})
-											break
-										}
-									}
 								}
 
 							}
+						} else {
+							if (findd) {
+								let curIndex = ele.setting.colList.findIndex((col, index2, arr) => {
+									return (col.name == 'Input' || col.name == 'InputNumber');
+								})
+								if (curIndex > -1) {
+									$this.setData({
+										focusFieldId: ele.setting.colList[curIndex]
+											.fieldId
+									})
+									break
+								}
+
+							} else {
+								let curIndex = ele.setting.colList.findIndex((col, index2, arr) => {
+									return attr == col.fieldId;
+								})
+								if (curIndex > -1) {
+									findd = true
+									let curIndex2 = ele.setting.colList.findIndex((col, index2, arr) => {
+										return (col.name == 'Input' || col.name ==
+												'InputNumber') &&
+											index2 >
+											curIndex;
+									})
+									if (curIndex2 > -1) {
+										$this.setData({
+											focusFieldId: ele.setting.colList[curIndex].fieldId
+										})
+										break
+									}
+								}
+							}
+
 						}
 					}
 
@@ -829,11 +676,16 @@
 				this.focusFieldId = item.fieldId
 			},
 			onEnterChange(item) {
-				console.log("onEnterChange", item);
-				if (item.oldvalue != item.value) {
-					item.oldvalue = item.value;
+				let newVal = item.value
+				if (typeof item.value == "string") {
+					newVal = item.value.trim()
+					if (!newVal)
+						return
+				}
+				if (item.oldvalue != newVal) {
+					item.oldvalue = newVal;
 					var attr = item.fieldId;
-					this.head_styledef.form.model[attr] = item.value;
+					this.head_styledef.form.model[attr] = newVal;
 					var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠� 					if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠� 						this.onChange(onChangeEvent);
@@ -869,67 +721,6 @@
 
 			},
 
-			onCheckBoxValue(e) { //缁戝畾Model鍊�-				let values = e.detail.value || []
-				const item = this.head_styledef.form.items[e.currentTarget?.dataset?.index || 0]
-				if (item?.setting?.colList) {
-					const col = item.setting.colList[e.currentTarget?.dataset?.iindex || 0]
-					if (col) {
-						col.value = values
-						let attr = col.fieldId;
-						this.head_styledef.form.model[attr] = col.value;
-						var onChangeEvent = col.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-						return
-					}
-				} else {
-					if (item) {
-						item.value = values
-						let attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
-						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-					}
-				}
-
-			},
-			onRadioBoxValue(e) { //缁戝畾Model鍊�-				let values = e.detail.value || ""
-				const item = this.head_styledef.form.items[e.currentTarget?.dataset?.index || 0]
-				if (item?.setting?.colList) {
-					const col = item.setting.colList[e.currentTarget?.dataset?.iindex || 0]
-					if (col) {
-						col.value = values
-						let attr = col.fieldId;
-						this.head_styledef.form.model[attr] = col.value;
-						var onChangeEvent = col.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-						return
-					}
-				} else {
-					if (item) {
-						item.value = values
-						let attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
-						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-					}
-
-				}
-
-			},
-			onModelValue(item) {
-				var attr = item.fieldId;
-				this.head_styledef.form.model[attr] = item.value;
-			},
 			classAttr_extButton(item) {
 				var onSuffixClickCallbackEvent = item.bind.onSuffixClickCallbackEvent; //鍚庡浘鏍囩偣鍑讳簨浠� 				var onSuffixClickEvent = item.bind.onSuffixClickEvent; //鍚庡浘鏍囩偣鍑诲洖璋�diff --git a/pages/modal/3037_2.vue b/pages/modal/3037_2.vue
index 9487d2a..1aff5ff 100644
--- a/pages/modal/3037_2.vue
+++ b/pages/modal/3037_2.vue
@@ -1,81 +1,8 @@
 <template>
 	<view class="uni-page-modal-3017-2">
 		<!-- 琛ㄥご鏍峰紡 -->
-		<view class="v-headStyle" v-for="(item,index) in head_styledef.form.items">
-			<!-- 鏅�甯冨眬 -->
-			<view v-if="item.name!='Layout' && item.show==true">
-				<text class="txt_title" :style="{'width':item.labelWidth+'px'}">{{item.label}}锛�/text>
-				<!-- 涓嬫媺妗�鍗曢� item.useDict?item.dict:item.selections-->
-				<uni-data-select id="dv_select" v-if="item.name=='Select'" :class="item.disabled?'input-disabled':''"
-					v-model="item.value" :localdata="item.dict" @change="onEnterChange(item)" :disabled="item.disabled"
-					:clear="false"></uni-data-select>
-				<!-- 鏂囨湰妗�鏁板瓧妗�-->
-				<view class="input-wrapper" v-if="item.name=='Input' || item.name=='InputNumber'">
-					<text v-if="item.setting.prefix" class="uni-icon" :class="[item.setting.prefix]"
-						@click="classAttr_extButton(item)">&#xe568;</text>
-					<input class="uni-input" :class="item.disabled?'input-disabled':''"
-						:type="item.name=='Input'?'text':item.name=='InputNumber'?'number':'text'" v-model="item.value"
-						:disabled="item.disabled" :placeholder="item.placeholder"
-						:style="{'width':item.setting.prefix && item.setting.suffix?'78%':item.setting.prefix || item.setting.suffix?'87%':'96%'}"
-						:focus="focusMateria" @focus="ontap(item)" @keyup.enter="onEnterChange(item)"
-						@blur="onEnterChange(item)" :maxlength="-1" />
-					<text v-if="item.setting.suffix" class="uni-icon" :class="[item.setting.suffix]"
-						@click="classAttr_extButton(item)">&#xe568;</text>
-				</view>
-				<!-- 澶氳鏂囨湰 -->
-				<view class="input-wrapper" v-if="item.name=='Textarea'">
-					<textarea class="uni-input" :class="item.disabled?'input-disabled':''" v-model="item.value"
-						:placeholder="item.placeholder"  @blur="onEnterChange(item)"
-						:data-index="index" style="height:60px;" :style="{'width':'96%'}"
-						:disabled="item.disabled"></textarea>
-
-				</view>
-				<!-- 澶嶉�妗�-->
-				<checkbox-group class="check_rememberPwd" v-if="item.name=='Checkbox'"
-					:class="item.disabled?'input-disabled':''" :disabled="item.disabled" @change="onCheckBoxValue"
-					:data-attr="item.fieldId" :data-index="index">
-					<label v-for="(item2) in item.selections" :key="item2.value">
-						<checkbox :value="item2.value" :checked="item.value.includes(item2.value)" />
-						<text>{{item2.label}}</text>
-					</label>
-				</checkbox-group>
-				<!-- 鍗曢�妗�-->
-				<radio-group class="check_rememberPwd" v-if="item.name=='Radio'"
-					:class="item.disabled?'input-disabled':''" :disabled="item.disabled" @change="onRadioBoxValue"
-					:data-attr="item.fieldId" :data-index="index">
-					<label v-for="(item2) in item.selections" :key="item2.value">
-						<radio :value="item2.value" :checked="item2.value === item.value" />
-						<text>{{item2.label}}</text>
-					</label>
-				</radio-group>
-				<!-- Switch寮�叧 -->
-				<switch v-if="item.name=='Switch'" :class="item.disabled?'input-disabled':''" :disabled="item.disabled"
-					v-model="item.value" @change="onModelValue(item)" :style="{'margin-left':'10rpx'}" />
-				<!-- 鏃ユ湡鏃堕棿 -->
-				<!-- 	<view class="input-wrapper" v-if="item.name=='TimePicker' || item.name=='DatePicker'">
-					<picker mode="date" class="date_iput" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" :value="item.value" @change="onModelValue(item)">
-						<view class="picker">{{item.value}}</view>
-					</picker>
-				</view>
-			 -->
-				<view class="input-wrapper"
-					v-if="item.name=='TimePicker' || item.name=='DatePicker'|| item.name=='DatePickerRange'">
-					<OIDatePicker v-if="item.name=='DatePicker'" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-						:defaultToday="item.setting.defaultToday" :format="item.setting.format"
-						@change="onModelValue(item)" />
-					<OIDatePickerRange v-if="item.name=='DatePickerRange'" :rangeSeparator="item.setting.separator"
-						:format="item.setting.format" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-						@change="onModelValue(item)" />
-					<OITimePicker v-if="item.name=='TimePicker'" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-						@change="onModelValue(item)" />
-				</view>
-			</view>
-
-		</view>
+		<OIForm ref="refBaseForm" class="v-headStyle" :form="head_styledef.form" @focus="ontap" @change="onEnterChange"
+			@click-prefix="classAttr_extButton" @click-suffix="classAttr_extButton"></OIForm>
 		<!-- 浠庢暟鎹�-->
 		<view class="v-panel">
 			<div class="panel_title">{{param.Sub_Cls.Title}}</div>
@@ -105,39 +32,7 @@
 			<!-- 浠庢暟鎹樉绀鸿鎯呭尯 -->
 			<view class="v-panellist" v-for="(subpanel,iiindex) in subPanelList" @tap="onPanelClick(iiindex)"
 				:class="activelist[iiindex].active==true?'bk-active':''">
-				<view class="v-area dv-panel" v-for="(item,index) in subpanel.subClassAttr.form.items">
-					<div class="dv-panel-input">
-						<!-- 鏅�甯冨眬 -->
-						<view v-if="item.name!='Layout' && item.show==true">
-							<text class="txt_title" :style="{'width':item.labelWidth+'px'}">{{item.label}}锛�/text>
-							<span class="form-item-span" v-if="item.disabled">{{item.value}}</span>
-							<!-- 鏂囨湰妗�鏁板瓧妗�-->
-							<view v-else class="input-wrapper">
-								<input :type="item.name=='InputNumber'?'number':'text'" v-model="item.value"
-									:placeholder="item.placeholder" :maxlength="-1"
-									@on-enter="onDetail1EnterChange(item)" />
-							</view>
-						</view>
-						<!-- 鏍呮牸甯冨眬 -->
-						<uni-row class="demo-uni-row" v-if="item.name=='Layout' && item.show==true">
-							<uni-col v-for="(cols,key) in item.setting.colList"
-								:span="item.setting.spanList?item.setting.spanList[key]:24 / item.setting.col">
-								<view v-if="cols!=null">
-									<text class="txt_title"
-										:style="{'width':cols.labelWidth+'px'}">{{cols.label}}锛�/text>
-									<span class="form-item-span" v-if="cols.disabled">{{cols.value}}</span>
-									<!-- 鏂囨湰妗�鏁板瓧妗�-->
-									<view v-else class="input-wrapper">
-										<input :type="cols.name=='InputNumber'?'number':'text'" v-model="cols.value"
-											:placeholder="cols.placeholder" :maxlength="-1"
-											@on-enter="onDetail1EnterChange(cols)" />
-									</view>
-
-								</view>
-							</uni-col>
-						</uni-row>
-					</div>
-				</view>
+				<OIForm class="v-area dv-panel" :form="subpanel.subClassAttr.form" viewMode></OIForm>
 
 				<view class="v-paneldel" v-if="param.Sub_Cls.Can_Add_Delete == true">
 					<a href="javascript:;" class="panel_del" @tap="panel_del(iiindex)"><i
@@ -199,18 +94,14 @@
 		dataObjDel
 	} from "@/api/data.js"
 	import dayjs from "dayjs";
-	import OIDatePicker from '@/components/oi-date-time-picker/oi-date-picker.vue'
-	import OIDatePickerRange from '@/components/oi-date-time-picker/oi-date-picker-range.vue'
-	import OITimePicker from '@/components/oi-date-time-picker/oi-time-picker.vue'
+	import OIForm from '@/components/oi-form/index.vue'
 
 	export default {
 		modules: {
 			Base64,
 		},
 		components: {
-			OIDatePicker,
-			OIDatePickerRange,
-			OITimePicker
+			OIForm
 		},
 		data() {
 			return {
@@ -694,20 +585,19 @@
 					uni.hideKeyboard();
 					var $this = this;
 					console.log(item);
-					if (item.oldvalue != result.decodedata) {
-						item.oldvalue = result.decodedata;
-						item.value = result.decodedata;
+					item.value = result.decodedata
+					let newVal = item.value.trim()
+					if (item.oldvalue != newVal) {
+						item.oldvalue = newVal;
 						var attr = item.fieldId;
-						$this.head_styledef.form.model[attr] = result.decodedata;
-						if (result.decodedata) { //绗竴涓緭鍏ユ涓嶄负绌�-							$this.focusMateria = true; //鍒濆鍖栵紝绗簩涓緭鍏ユfocus灞炴�
-							// setTimeout(function(){
-							// 	$this.focusMateria=true; //绗簩涓緭鍏ユ鑾峰彇鐒︾偣
-							setTimeout(function() {
-								uni.hideKeyboard();
-							}, 1000);
-							// },500);
-						}
+						$this.head_styledef.form.model[attr] = newVal;
+						$this.focusMateria = true; //鍒濆鍖栵紝绗簩涓緭鍏ユfocus灞炴�
+						// setTimeout(function(){
+						// 	$this.focusMateria=true; //绗簩涓緭鍏ユ鑾峰彇鐒︾偣
+						setTimeout(function() {
+							uni.hideKeyboard();
+						}, 1000);
+						// },500);
 						//瀛愭暟鎹被鎵爜鍖轰簨浠惰剼鏈� 						var eventid = this.$data.param.Scan_Code.Input_Change_Event.ID;
 						if (eventid) {
@@ -730,7 +620,7 @@
 								mast_attr: [],
 								inputParamter: [{
 									attr: 'mast_input_3037',
-									value: result.decodedata
+									value: newVal
 								}]
 							}
 
@@ -743,10 +633,16 @@
 				// console.log(e.target);
 				var $this = this;
 				console.log(item);
-				if (item.oldvalue != item.value && item.value.trim() != "") {
-					item.oldvalue = item.value;
+				let newVal = item.value
+				if (typeof item.value == "string") {
+					newVal = item.value.trim()
+					if (!newVal)
+						return
+				}
+				if (item.oldvalue != newVal) {
+					item.oldvalue = newVal;
 					var attr = item.fieldId;
-					$this.head_styledef.form.model[attr] = item.value;
+					$this.head_styledef.form.model[attr] = newVal;
 					//瀛愭暟鎹被鎵爜鍖轰簨浠惰剼鏈� 					var eventid = this.$data.param.Scan_Code.Input_Change_Event.ID;
 					if (eventid) {
@@ -769,7 +665,7 @@
 							mast_attr: [],
 							inputParamter: [{
 								attr: 'mast_input_3037',
-								value: item.value
+								value: newVal
 							}]
 						}
 
@@ -1125,10 +1021,16 @@
 
 			onEnterChange(item) {
 				console.log("onEnterChange", item);
-				if (item.oldvalue != item.value && item.value.trim() != "") {
-					item.oldvalue = item.value;
+				let newVal = item.value
+				if (typeof item.value == "string") {
+					newVal = item.value.trim()
+					if (!newVal)
+						return
+				}
+				if (item.oldvalue != newVal) {
+					item.oldvalue = newVal;
 					var attr = item.fieldId;
-					this.head_styledef.form.model[attr] = item.value;
+					this.head_styledef.form.model[attr] = newVal;
 					var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠� 					if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠� 						this.onChange(onChangeEvent);
@@ -1272,68 +1174,6 @@
 						}
 					}
 				}
-			},
-			onCheckBoxValue(e) { //缁戝畾Model鍊�-				let values = e.detail.value || []
-				const item = this.head_styledef.form.items[e.currentTarget?.dataset?.index || 0]
-				if (item?.setting?.colList) {
-					const col = item.setting.colList[e.currentTarget?.dataset?.iindex || 0]
-					if (col) {
-						col.value = values
-						let attr = col.fieldId;
-						this.head_styledef.form.model[attr] = col.value;
-						var onChangeEvent = col.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-						return
-					}
-				} else {
-					if (item) {
-						item.value = values
-						let attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
-						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-					}
-				}
-
-			},
-			onRadioBoxValue(e) { //缁戝畾Model鍊�-				let values = e.detail.value || ""
-				const item = this.head_styledef.form.items[e.currentTarget?.dataset?.index || 0]
-				if (item?.setting?.colList) {
-					const col = item.setting.colList[e.currentTarget?.dataset?.iindex || 0]
-					if (col) {
-						col.value = values
-						let attr = col.fieldId;
-						this.head_styledef.form.model[attr] = col.value;
-						var onChangeEvent = col.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-						return
-					}
-				} else {
-					if (item) {
-						item.value = values
-						let attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
-						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-					}
-
-				}
-
-			},
-			onModelValue(item) { //缁戝畾Model鍊�-				//console.log(e.target)
-				var attr = item.fieldId;
-				this.head_styledef.form.model[attr] = item.value;
 			},
 
 			panel_del(index) { //闈㈡澘鍒犻櫎
diff --git a/pages/modal/3200.vue b/pages/modal/3200.vue
index 45fb2f3..e8899f1 100644
--- a/pages/modal/3200.vue
+++ b/pages/modal/3200.vue
@@ -2,40 +2,8 @@
 	<view class="uni-page-modal-3200">
 		<view class="v-content">
 			<!-- 琛ㄥご鏍峰紡 -->
-			<view class="v-headStyle" v-for="(item,index) in head_styledef.form.items" v-if="isFilter==true">
-				<text class="txt_title" :style="{'width':item.labelWidth+'px'}">{{item.label}}锛�/text>
-				<!-- 涓嬫媺妗�鍗曢� item.useDict?item.dict:item.selections-->
-				<uni-data-select id="dv_select" v-if="item.name=='Select'" :class="item.disabled?'input-disabled':''"
-					v-model="item.value" :localdata="item.dict" @change="onEnterChange(item)" :disabled="item.disabled"
-					:clear="false"></uni-data-select>
-				<view class="input-wrapper" v-if="item.name=='Input' || item.name=='InputNumber'">
-					<text v-if="item.setting.prefix" class="uni-icon" :class="[item.setting.prefix]"
-						@click="onEnterChange(item)">&#xe568;</text>
-					<input class="uni-input" :class="item.disabled?'input-disabled':''"
-						:type="item.name=='Input'?'text':'number'" v-model="item.value" :disabled="item.disabled"
-						:placeholder="item.placeholder"
-						:style="{'width':item.setting.prefix && item.setting.suffix?'78%':item.setting.prefix || item.setting.suffix?'87%':'96%'}"
-						:focus="focusMateria" @focus="ontap(item)" @keyup.enter="onEnterChange(item)"
-						@blur="onEnterChange(item)" :maxlength="-1" />
-					<text v-if="item.setting.suffix" class="uni-icon" :class="[item.setting.suffix]"
-						@click="onEnterChange(item)">&#xe568;</text>
-				</view>
-				<view class="input-wrapper"
-					v-if="item.name=='TimePicker' || item.name=='DatePicker'|| item.name=='DatePickerRange'">
-					<OIDatePicker v-if="item.name=='DatePicker'" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-						:defaultToday="item.setting.defaultToday" :format="item.setting.format"
-						@change="onModelValue(item)" />
-					<OIDatePickerRange v-if="item.name=='DatePickerRange'" :rangeSeparator="item.setting.separator"
-						:format="item.setting.format" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-						@change="onModelValue(item)" />
-					<OITimePicker v-if="item.name=='TimePicker'" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-						@change="onModelValue(item)" />
-				</view>
-			</view>
-
+			<OIForm ref="refBaseForm" class="v-headStyle" :form="head_styledef.form" @focus="ontap"
+				@change="onEnterChange" @click-prefix="onEnterChange" @click-suffix="onEnterChange"></OIForm>
 			<view class="v-scroll-view">
 				<scroll-view :scroll-top="scrollTop" :scroll-y="true" class="scroll-y" @scrolltolower="scrolltolower"
 					@scroll="scroll">
@@ -51,45 +19,14 @@
 								</checkbox-group>
 							</div>
 							<!-- HTML椤甸潰绫诲瀷鏄剧ず -->
-							<div class="dv-listHtml-Panel" v-if="ListHtml_Panel" v-html="ListHtml_Panel[ii]" :style="param.ListPage.CheckBox==true && param.ListPage.Click_View==true?'width:85%;':
-				  param.ListPage.CheckBox==false && param.ListPage.Click_View==true?'width:91%;':
-				  param.ListPage.CheckBox==true && param.ListPage.Click_View==false?'width:88%;':'width:100%;'">
+							<div class="dv-listHtml-Panel" v-if="ListHtml_Panel" v-html="ListHtml_Panel[ii]"
+								:style="param.ListPage.CheckBox==true && param.ListPage.Click_View==true?'width:85%;': param.ListPage.CheckBox==false && param.ListPage.Click_View==true?'width:91%;':param.ListPage.CheckBox==true && param.ListPage.Click_View==false?'width:88%;':'width:100%;'">
 
 							</div>
-							<div class="dv-panel-input" v-if="!ListHtml_Panel" :style="param.ListPage.CheckBox==true && param.ListPage.Click_View==true?'width:85%;':
-				  param.ListPage.CheckBox==false && param.ListPage.Click_View==true?'width:91%;':
-				  param.ListPage.CheckBox==true && param.ListPage.Click_View==false?'width:88%;':'width:100%;'">
-								<div v-for="(item,index) in style.form.items">
-									<!-- 鏅�甯冨眬 -->
-									<view v-if="item.name!='Layout'">
-										<text class="txt_title"
-											:style="{'width':item.labelWidth+'px'}">{{item.label}}锛�/text>
-										<span class="form-item-span" v-if="item.disabled">{{item.value}}</span>
-										<!-- 鏂囨湰妗�鏁板瓧妗�-->
-										<view v-else class="form-item-input">
-											<input :type="item.name=='InputNumber'?'number':'text'" v-model="item.value"
-												:placeholder="item.placeholder" :maxlength="-1"
-												@on-enter="onDetail1EnterChange(item)" />
-										</view>
-									</view>
-									<!-- 鏍呮牸甯冨眬 -->
-									<uni-row class="demo-uni-row" v-if="item.name=='Layout'">
-										<uni-col v-for="(cols,key) in item.setting.colList"
-											:span="item.setting.spanList?item.setting.spanList[key]:24 / item.setting.col">
-											<view v-if="cols!=null">
-												<text class="txt_title"
-													:style="{'width':cols.labelWidth+'px'}">{{cols.label}}锛�/text>
-												<span class="form-item-span" v-if="cols.disabled">{{cols.value}}</span>
-												<!-- 鏂囨湰妗�鏁板瓧妗�-->
-												<view v-else class="form-item-input">
-													<input :type="cols.name=='InputNumber'?'number':'text'"
-														v-model="cols.value" :placeholder="cols.placeholder"
-														:maxlength="-1" @on-enter="onDetail1EnterChange(cols)" />
-												</view>
-											</view>
-										</uni-col>
-									</uni-row>
-								</div>
+							<div class="dv-panel-input" v-if="!ListHtml_Panel"
+								:style="param.ListPage.CheckBox==true && param.ListPage.Click_View==true?'width:85%;':param.ListPage.CheckBox==false && param.ListPage.Click_View==true?'width:91%;':param.ListPage.CheckBox==true && param.ListPage.Click_View==false?'width:88%;':'width:100%;'">
+								<OIForm class="v-area dv-panel" :form="style.form.items" viewMode></OIForm>
+
 							</div>
 							<div class="dv-panel-button" v-if="param.ListPage.Click_View==true">
 								<a @click="onViewPageClick(style)"><i class="mobox-normal-right-arrow" /></a>
@@ -140,17 +77,14 @@
 		dataObjDel
 	} from "@/api/data.js"
 	import dayjs from "dayjs";
-	import OIDatePicker from '@/components/oi-date-time-picker/oi-date-picker.vue'
-	import OIDatePickerRange from '@/components/oi-date-time-picker/oi-date-picker-range.vue'
-	import OITimePicker from '@/components/oi-date-time-picker/oi-time-picker.vue'
+	import OIForm from '@/components/oi-form/index.vue'
+
 	export default {
 		modules: {
 			Base64,
 		},
 		components: {
-			OIDatePicker,
-			OIDatePickerRange,
-			OITimePicker
+			OIForm
 		},
 		onNavigationBarButtonTap(e) {
 			//  	console.log(e);
@@ -1260,12 +1194,15 @@
 					item.value = result.decodedata;
 					uni.hideKeyboard();
 					var $this = this;
-
 					console.log(item);
-					if (item.oldvalue != item.value) {
-						item.oldvalue = item.value;
+					let newVal = item.value.trim()
+					if (!newVal)
+						return
+					if (item.oldvalue != newVal) {
+						item.oldvalue = newVal;
+
 						var attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
+						this.head_styledef.form.model[attr] = newVal;
 						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠� 						var onSuffixClickCallbackEvent = item.bind
 							.onSuffixClickCallbackEvent; //鍚庡浘鏍囩偣鍑讳簨浠�@@ -1276,24 +1213,19 @@
 						if (onChangeEvent.id) { //鍐呭鍙樺寲鍚庝簨浠� 							$this.onChange(onChangeEvent);
 						} else {
-							$this.where = '';
-							if (item.value)
-								$this.where = item.fieldId + " like '%" + item
-								.value + "%'";
+							$this.where = item.fieldId + " like '%" + newVal + "%'";
 							$this.query_id = '';
 							$this.pageindex = 1;
 							$this.detail1StyleDefList = [];
 							$this.loadDataGetList();
 						}
-						if (item.value) { //绗竴涓緭鍏ユ涓嶄负绌�-							$this.focusMateria = true; //鍒濆鍖栵紝绗簩涓緭鍏ユfocus灞炴�
-							// setTimeout(function(){
-							// 	$this.focusMateria=true; //绗簩涓緭鍏ユ鑾峰彇鐒︾偣
-							setTimeout(function() {
-								uni.hideKeyboard();
-							}, 1000);
-							// },500);
-						}
+						$this.focusMateria = true; //鍒濆鍖栵紝绗簩涓緭鍏ユfocus灞炴�
+						// setTimeout(function(){
+						// 	$this.focusMateria=true; //绗簩涓緭鍏ユ鑾峰彇鐒︾偣
+						setTimeout(function() {
+							uni.hideKeyboard();
+						}, 1000);
+						// },500);
 						// if(onSuffixClickCallbackEvent.id){   //鍚庡浘鏍囩偣鍑讳簨浠� 						//   this.onSuffixClick(onSuffixClickCallbackEvent);
 						// }
@@ -1306,10 +1238,16 @@
 
 			onEnterChange(item) { //鍥炶溅锛岀偣鍑绘寜閽紝鍙栨秷鑺傜偣浜嬩欢
 				// console.log(item);
-				if (item.oldvalue != item.value) {
-					item.oldvalue = item.value;
+				let newVal = item.value
+				if (typeof item.value == "string") {
+					newVal = item.value.trim()
+					if (!newVal)
+						return
+				}
+				if (item.oldvalue != newVal) {
+					item.oldvalue = newVal;
 					var attr = item.fieldId;
-					this.head_styledef.form.model[attr] = item.value;
+					this.head_styledef.form.model[attr] = newVal;
 					var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠� 					var onSuffixClickCallbackEvent = item.bind
 						.onSuffixClickCallbackEvent; //鍚庡浘鏍囩偣鍑讳簨浠�@@ -1319,9 +1257,7 @@
 					if (onChangeEvent.id) { //鍐呭鍙樺寲鍚庝簨浠� 						this.onChange(onChangeEvent);
 					} else {
-						this.where = '';
-						if (item.value)
-							this.where = item.fieldId + " like '%" + item.value + "%'";
+						this.where = item.fieldId + " like '%" + item.value + "%'";
 						this.query_id = '';
 						this.pageindex = 1;
 						this.detail1StyleDefList = [];
@@ -1495,68 +1431,6 @@
 					});
 
 				}
-			},
-			onCheckBoxValue(e) { //缁戝畾Model鍊�-				let values = e.detail.value || []
-				const item = this.head_styledef.form.items[e.currentTarget?.dataset?.index || 0]
-				if (item?.setting?.colList) {
-					const col = item.setting.colList[e.currentTarget?.dataset?.iindex || 0]
-					if (col) {
-						col.value = values
-						let attr = col.fieldId;
-						this.head_styledef.form.model[attr] = col.value;
-						var onChangeEvent = col.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-						return
-					}
-				} else {
-					if (item) {
-						item.value = values
-						let attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
-						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-					}
-				}
-
-			},
-			onRadioBoxValue(e) { //缁戝畾Model鍊�-				let values = e.detail.value || ""
-				const item = this.head_styledef.form.items[e.currentTarget?.dataset?.index || 0]
-				if (item?.setting?.colList) {
-					const col = item.setting.colList[e.currentTarget?.dataset?.iindex || 0]
-					if (col) {
-						col.value = values
-						let attr = col.fieldId;
-						this.head_styledef.form.model[attr] = col.value;
-						var onChangeEvent = col.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-						return
-					}
-				} else {
-					if (item) {
-						item.value = values
-						let attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
-						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-					}
-
-				}
-
-			},
-
-			onModelValue(item) {
-				var attr = item.fieldId;
-				this.head_styledef.form.model[attr] = item.value;
 			},
 			onDetail1EnterChange() {},
 			//鐐逛腑琛ㄥ崟
@@ -2015,71 +1889,8 @@
 		height: calc(100vh - 30rpx);
 		padding: 15rpx 0;
 
-		.v-headStyle:first-child {
-			margin-top: 15rpx;
-		}
-
-		.v-headStyle .txt_title {
-			font-size: 34rpx;
-			text-align: right;
-			display: inline-block;
-			vertical-align: 24rpx;
-		}
-
-		.v-headStyle input {
-			display: inline-block;
-			/* border: 1px solid #d5d5d5; */
-			/* width: 65%; */
-			width: 85%;
-			height: 52rpx;
-			line-height: 34rpx;
-			background: #FFF;
-			border-radius: 0 !important;
-			color: #2d8cf0;
-			padding: 10rpx 8rpx 12rpx;
-			font-size: 34rpx;
-			font-family: inherit;
-			box-shadow: none !important;
-			transition-duration: 0.1s;
-			margin-top: 4rpx;
-		}
-
-		.v-headStyle input::-webkit-input-placeholder {
-			font-size: 12rpx;
-		}
-
-		.input-wrapper {
-			border: 1px solid #d5d5d5;
-			display: inline-block;
-			width: 65%;
-			line-height: 22rpx;
-		}
-
-		[nvue] uni-view {
-			position: relative;
-			border: 0 solid #000;
-			box-sizing: border-box;
-		}
-
-		.uni-input {
-			/* border: none; */
-		}
-
-		.uni-icon {
-			/* border: 1px solid red; */
-			width: 30rpx;
-			padding: 10rpx 5rpx;
-			font-family: uniicons;
-			font-size: 40rpx;
-			font-weight: 400;
-			font-style: normal;
-			/* width: 48rpx; */
-			height: 48rpx;
-			line-height: 48rpx;
-			color: #2d8cf0;
-			cursor: pointer;
-			display: inline-block;
-			vertical-align: 18rpx;
+		.v-headStyle {
+			width: 98%;
 		}
 
 		.v-content {
diff --git a/pages/modal/3200_view.vue b/pages/modal/3200_view.vue
index 63b1fa5..d10f7d2 100644
--- a/pages/modal/3200_view.vue
+++ b/pages/modal/3200_view.vue
@@ -12,172 +12,8 @@
 					</div>
 					<!-- 鑷畾涔夎〃鍗曠被鍨嬫樉绀�-->
 					<div v-if="!ViewHtml_Panel">
-						<div v-for="(item,index) in detail2_styledef.form.items">
-							<!-- 鏅�甯冨眬 -->
-							<view v-if="item.name!='Layout'">
-								<text class="txt_title" :style="{'width':item.labelWidth+'px'}">{{item.label}}锛�/text>
-								<!-- 鏂囨湰妗�鏁板瓧妗�-->
-								<view class="dv_input" v-if="(item.name=='Input' || item.name=='InputNumber') ">
-									<text v-if="item.setting.prefix" class="uni-icon" :class="[item.setting.prefix]"
-										@click="onEnterChange(item)">&#xe568;</text>
-									<input class="uni-input" :class="item.disabled?'input-disabled':''"
-										:type="item.name=='Input'?'text':item.name=='InputNumber'?'number':'text'"
-										v-model="item.value" :disabled="item.disabled" :placeholder="item.placeholder"
-										:style="{'width':item.setting.prefix && item.setting.suffix?'78%':item.setting.prefix || item.setting.suffix?'87%':'96%'}"
-										:focus="focusMateria" @focus="ontap(item)" @keyup.enter="onEnterChange(item)"
-										@blur="onEnterChange(item)" :maxlength="-1" />
-									<text v-if="item.setting.suffix" class="uni-icon" :class="[item.setting.suffix]"
-										@click="onEnterChange(item)">&#xe568;</text>
-								</view>
-								<!-- 涓嬫媺妗�鍗曢� item.useDict?item.dict:item.selections-->
-								<uni-data-select id="dv_select" v-if="item.name=='Select'"
-									:class="item.disabled?'input-disabled':''" v-model="item.value"
-									:localdata="item.dict" @change="onEnterChange(item)" :disabled="item.disabled"
-									:clear="false"></uni-data-select>
-								<!-- 澶氳鏂囨湰 -->
-								<view class="input-wrapper" v-if="item.name=='Textarea'">
-									<textarea class="uni-input" :value="item.value"
-										:class="item.disabled?'input-disabled':''" :placeholder="item.placeholder"
-										@blur="onEnterChange(item)" style="height:60px;" :style="{'width':'96%'}"
-										:disabled="item.disabled"></textarea>
-								</view>
-								<!-- 澶嶉�妗�-->
-								<checkbox-group class="check_rememberPwd" v-if="item.name=='Checkbox'"
-									:class="item.disabled?'input-disabled':''" :disabled="item.disabled"
-									@change="onCheckBoxValue" :data-attr="item.fieldId" :data-index="index">
-									<label v-for="(item2) in item.selections" :key="item2.value">
-										<checkbox :value="item2.value" :checked="item.value.includes(item2.value)" />
-										<text>{{item2.label}}</text>
-									</label>
-								</checkbox-group>
-								<!-- 鍗曢�妗�-->
-								<radio-group class="check_rememberPwd" v-if="item.name=='Radio'"
-									:class="item.disabled?'input-disabled':''" :disabled="item.disabled"
-									:style="{'margin-left':'10rpx'}" @change="onRadioBoxValue" :data-attr="item.fieldId"
-									:data-index="index">
-									<label v-for="(item2) in item.selections" :key="item2.value">
-										<radio :value="item2.value" :checked="item2.value === item.value" />
-										<text>{{item2.label}}</text>
-									</label>
-								</radio-group>
-								<!-- Switch寮�叧 -->
-								<switch v-if="item.name=='Switch'" :class="item.disabled?'input-disabled':''"
-									:disabled="item.disabled" v-model="item.value" @change="onModelValue(item)"
-									:style="{'margin-left':'10rpx'}" />
-								<!-- 鏃ユ湡鏃堕棿 -->
-								<!-- <view class="input-wrapper"
-									v-if="(item.name=='TimePicker' || item.name=='DatePicker') ">
-									<picker mode="date" class="date_iput" :class="item.disabled?'input-disabled':''"
-										:disabled="item.disabled" :value="item.value" @change="onModelValue(item)">
-										<view class="picker">{{item.value}}</view>
-									</picker>
-								</view> -->
-								<view class="input-wrapper"
-									v-if="(item.name=='TimePicker' || item.name=='DatePicker' || item.name=='DatePickerRange') ">
-									<OIDatePicker v-if="item.name=='DatePicker'"
-										:class="item.disabled?'input-disabled':''" :disabled="item.disabled"
-										v-model="item.value" :placeholder="item.placeholder"
-										:defaultToday="item.setting.defaultToday" :format="item.setting.format"
-										@change="onModelValue(item)" />
-									<OIDatePickerRange v-if="item.name=='DatePickerRange'"
-										:rangeSeparator="item.setting.separator" :format="item.setting.format"
-										:class="item.disabled?'input-disabled':''" :disabled="item.disabled"
-										v-model="item.value" :placeholder="item.placeholder"
-										@change="onModelValue(item)" />
-									<OITimePicker v-if="item.name=='TimePicker'"
-										:class="item.disabled?'input-disabled':''" :disabled="item.disabled"
-										v-model="item.value" :placeholder="item.placeholder"
-										@change="onModelValue(item)" />
-								</view>
-							</view>
-							<!-- 鏍呮牸甯冨眬 -->
-							<uni-row class="demo-uni-row" v-if="item.name=='Layout'">
-								<uni-col v-for="(cols,key) in item.setting.colList"
-									:span="item.setting.spanList?item.setting.spanList[key]:24 / item.setting.col">
-									<view v-if="cols!=null">
-										<text class="txt_title"
-											:style="{'width':cols.labelWidth+'px'}">{{cols.label}}锛�/text>
-										<view class="dv_input" v-if="(cols.name=='Input' || cols.name=='InputNumber') ">
-											<text v-if="cols.setting.prefix" class="uni-icon"
-												:class="[cols.setting.prefix]"
-												@click="onEnterChange(cols)">&#xe568;</text>
-											<input class="uni-input" :class="cols.disabled?'input-disabled':''"
-												:type="cols.name=='Input'?'text':cols.name=='InputNumber'?'number':'text'"
-												v-model="cols.value" :disabled="cols.disabled"
-												:placeholder="cols.placeholder"
-												:style="{'width':cols.setting.prefix && cols.setting.suffix?'78%':cols.setting.prefix || cols.setting.suffix?'87%':'96%'}"
-												:focus="focusMateria" @focus="ontap(cols)" @blur="onEnterChange(cols)"
-												@keyup.enter="onEnterChange(cols)" :maxlength="-1" />
-											<text v-if="cols.setting.suffix" class="uni-icon"
-												:class="[cols.setting.suffix]"
-												@click="onEnterChange(cols)">&#xe568;</text>
-										</view>
-										<!-- 涓嬫媺妗�鍗曢� cols.useDict?cols.dict:cols.selections-->
-										<uni-data-select id="dv_select" v-if="cols.name=='Select' "
-											:class="cols.disabled?'input-disabled':''" v-model="cols.value"
-											:localdata="cols.dict" @change="onEnterChange(cols)"
-											:disabled="cols.disabled" :clear="false"></uni-data-select>
-										<!-- 澶氳鏂囨湰 -->
-										<view class="input-wrapper" v-if="cols.name=='Textarea' ">
-											<textarea class="uni-input" :value="cols.value"
-												:class="cols.disabled?'input-disabled':''"
-												:placeholder="cols.placeholder" @blur="onEnterChange(cols)"
-												style="height:60px;" :style="{'width':'96%'}"
-												:disabled="cols.disabled"></textarea>
-										</view>
-										<!-- 澶嶉�妗�-->
-										<checkbox-group class="check_rememberPwd" v-if="cols.name=='Checkbox'"
-											:class="cols.disabled?'input-disabled':''" :disabled="cols.disabled"
-											@change="onCheckBoxValue" :data-attr="cols.fieldId" :data-index="index"
-											:data-iindex="key">
-											<label v-for="(cols2) in cols.selections" :key="cols2.value">
-												<checkbox :value="cols2.value"
-													:checked="cols.value.includes(cols2.value)" />
-												<text>{{cols2.label}}</text>
-											</label>
-										</checkbox-group>
-										<!-- 鍗曢�妗�-->
-										<radio-group class="check_rememberPwd" v-if="cols.name=='Radio'"
-											:class="cols.disabled?'input-disabled':''" :disabled="cols.disabled"
-											:style="{'margin-left':'10rpx'}" @change="onRadioBoxValue"
-											:data-attr="cols.fieldId" :data-index="index" :data-iindex="key">
-											<label v-for="(cols2) in cols.selections" :key="cols2.value">
-												<radio :value="cols2.value" :checked="cols2.value === cols.value" />
-												<text>{{cols2.label}}</text>
-											</label>
-										</radio-group>
-										<!-- Switch寮�叧 -->
-										<switch v-if="cols.name=='Switch'" :class="cols.disabled?'input-disabled':''"
-											:disabled="cols.disabled" v-model="cols.value" @change="onModelValue(cols)"
-											:style="{'margin-left':'10rpx'}" />
-										<!-- 鏃ユ湡鏃堕棿 -->
-										<view class="input-wrapper"
-											v-if="(cols.name=='TimePicker' || cols.name=='DatePicker') && !cols.disabled">
-											<!-- <picker mode="date" class="date_iput"
-												:class="cols.disabled?'input-disabled':''" :disabled="item.disabled"
-												:value="cols.value" @change="onModelValue(cols)">
-												<view class="picker">{{cols.value}}</view>
-											</picker> -->
-											<OIDatePicker v-if="cols.name=='DatePicker'"
-												:class="cols.disabled?'input-disabled':''" :disabled="cols.disabled"
-												v-model="cols.value" :placeholder="cols.placeholder"
-												:defaultToday="cols.setting.defaultToday" :format="cols.setting.format"
-												@change="onModelValue(cols)" />
-											<OIDatePickerRange v-if="cols.name=='DatePickerRange'"
-												:rangeSeparator="cols.setting.separator" :format="cols.setting.format"
-												:class="cols.disabled?'input-disabled':''" :disabled="cols.disabled"
-												v-model="cols.value" :placeholder="cols.placeholder"
-												@change="onModelValue(cols)" />
-											<OITimePicker v-if="cols.name=='TimePicker'"
-												:class="cols.disabled?'input-disabled':''" :disabled="cols.disabled"
-												v-model="cols.value" :placeholder="cols.placeholder"
-												@change="onModelValue(cols)" />
-										</view>
+						<OIForm :form="detail2_styledef.form.items" viewMode></OIForm>
 
-									</view>
-								</uni-col>
-							</uni-row>
-						</div>
 					</div>
 				</div>
 			</view>
@@ -213,17 +49,14 @@
 		runCustomEvent,
 		dataObjQuery
 	} from "@/api/data.js"
-	import OIDatePicker from '@/components/oi-date-time-picker/oi-date-picker.vue'
-	import OIDatePickerRange from '@/components/oi-date-time-picker/oi-date-picker-range.vue'
-	import OITimePicker from '@/components/oi-date-time-picker/oi-time-picker.vue'
+	import OIForm from '@/components/oi-form/index.vue'
+
 	export default {
 		modules: {
 			Base64,
 		},
 		components: {
-			OIDatePicker,
-			OIDatePickerRange,
-			OITimePicker
+			OIForm
 		},
 		onBackPress(e) {
 			// console.log("鐩戝惉杩斿洖鎸夐挳浜嬩欢",e);
diff --git a/pages/modal/5601.vue b/pages/modal/5601.vue
index 1082962..bf0326f 100644
--- a/pages/modal/5601.vue
+++ b/pages/modal/5601.vue
@@ -1,122 +1,10 @@
 <template>
 	<view class="uni-page-modal-5601">
 		<!-- 琛ㄥご鏍峰紡 -->
-		<uni-forms ref="baseForm" label-align="right">
-			<view v-for="(item,index) in head_styledef.form.items" :key="index" class="v-head-style">
-				<!-- 鏅�甯冨眬 -->
-				<uni-forms-item v-if="item.name != 'Layout'" :label="item.label ?item.label +'锛�:'' "
-					:label-width="item.labelWidth+'px'">
-					<uni-data-picker v-if="item.name=='Select'" :class="item.disabled?'input-disabled':''"
-						v-model="item.value" :localdata="item.useDict ? item.dict : item.selections"
-						@change="onEnterChange(item)" :readonly="item.disabled" :clear-icon="false"
-						:popup-title="item.label"></uni-data-picker>
-					<view class="input-wrapper" v-if="item.name=='Input' || item.name=='InputNumber'">
-						<text v-if="item.setting.prefix" class="uni-icon" :class="[item.setting.prefix]"
-							@click="classAttr_extButton(item)">&#xe568;</text>
-						<input class="uni-input" :class="item.disabled?'input-disabled':''"
-							:style="{'padding-left':item.setting.prefix?0 : '8rpx','right':item.setting.suffix?0 : '8rpx'}"
-							:type="item.name=='Input'?'text':'number'" v-model="item.value" :disabled="item.disabled"
-							:placeholder="item.placeholder" :focus="focusFieldId == item.fieldId" @focus="ontap(item)"
-							@click="onClick(item)" @keyup.enter="onEnterChange(item)" @blur="onEnterChange(item)"
-							:maxlength="-1" />
-						<text v-if="item.setting.suffix" class="uni-icon" :class="[item.setting.suffix]"
-							@click="classAttr_extButton(item)"></text>
-					</view>
-					<!-- 澶嶉�妗�-->
-					<checkbox-group v-if="item.name=='Checkbox'" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" @change="onCheckBoxValue" :data-attr="item.fieldId"
-						:data-index="index">
-						<label v-for="(item2) in item.selections" :key="item2.value">
-							<checkbox :value="item2.value" :checked="item.value.includes(item2.value)" />
-							<text>{{item2.label}}</text>
-						</label>
-					</checkbox-group>
-					<!-- 鍗曢�妗�-->
-					<radio-group v-if="item.name=='Radio'" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" @change="onRadioBoxValue" :data-attr="item.fieldId"
-						:data-index="index">
-						<label v-for="(item2) in item.selections" :key="item2.value">
-							<radio :value="item2.value" :checked="item2.value === item.value" />
-							<text>{{item2.label}}</text>
-						</label>
-					</radio-group>
-					<!-- Switch寮�叧 -->
-					<switch class="input-switch" v-if="item.name=='Switch'" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" v-model="item.value" @change="onEnterChange(item)" />
-					<OIDatePicker v-if="item.name=='DatePicker'" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-						:defaultToday="item.setting.defaultToday" :format="item.setting.format"
-						@change="onModelValue(item)" />
-					<OIDatePickerRange v-if="item.name=='DatePickerRange'" :rangeSeparator="item.setting.separator"
-						:format="item.setting.format" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-						@change="onModelValue(item)" />
-					<OITimePicker v-if="item.name=='TimePicker'" :class="item.disabled?'input-disabled':''"
-						:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-						@change="onModelValue(item)" />
+		<OIForm ref="refBaseForm" class="v-headStyle" :form="head_styledef.form" :focusId="focusFieldId"
+			@click="onClick" @focus="ontap" @change="onEnterChange" @click-prefix="classAttr_extButton"
+			@click-suffix="classAttr_extButton"></OIForm>
 
-				</uni-forms-item>
-				<!-- 鏍呮牸甯冨眬 -->
-				<uni-row v-else :gutter="item.setting.gutter">
-					<uni-col
-						:span=" item.setting.spanList && item.setting.spanList[key]? item.setting.spanList[key] : 24 / item.setting.col"
-						v-for="(col,key) in item.setting.colList">
-						<uni-forms-item v-if="col!=null" :label="col.label ? col.label +'锛�:''"
-							:label-width="col.labelWidth+'px'">
-							<uni-data-picker v-if="col.name=='Select'" :class="col.disabled?'input-disabled':''"
-								v-model="col.value" :localdata="col.useDict ? col.dict : col.selections"
-								@change="onEnterChange(col)" :readonly="col.disabled" :clear-icon="false"
-								:popup-title="col.label"></uni-data-picker>
-							<view class="input-wrapper" v-if="col.name=='Input' || col.name=='InputNumber'">
-								<text v-if="col.setting.prefix" class="uni-icon" :class="[col.setting.prefix]"
-									@click="classAttr_extButton(col)">&#xe568;</text>
-								<input class="uni-input" :class="col.disabled?'input-disabled':''"
-									:style="{'padding-left':col.setting.prefix?0 : '8px','right':col.setting.suffix?0 : '8px'}"
-									:type="col.name=='Input'?'text':'number'" v-model="col.value"
-									:disabled="col.disabled" :placeholder="col.placeholder"
-									:focus="focusFieldId == col.fieldId" @focus="ontap(col)" @click="onClick(col)"
-									@keyup.enter="onEnterChange(col)" @blur="onEnterChange(col)" :maxlength="-1" />
-								<text v-if="col.setting.suffix" class="uni-icon" :class="[col.setting.suffix]"
-									@click="classAttr_extButton(col)"></text>
-							</view>
-							<!-- 澶嶉�妗�-->
-							<checkbox-group v-if="col.name=='Checkbox'" :class="col.disabled?'input-disabled':''"
-								:disabled="col.disabled" @change="onCheckBoxValue" :data-attr="col.fieldId"
-								:data-index="index" :data-iindex="key">
-								<label v-for="(col2) in col.selections" :key="col2.value">
-									<checkbox :value="col2.value" :checked="col.value.includes(col2.value)" />
-									<text>{{col2.label}}</text>
-								</label>
-							</checkbox-group>
-							<!-- 鍗曢�妗�-->
-							<radio-group v-if="col.name=='Radio'" :class="col.disabled?'input-disabled':''"
-								:disabled="col.disabled" @change="onRadioBoxValue" :data-attr="col.fieldId"
-								:data-index="index" :data-iindex="key">
-								<label v-for="(col2) in col.selections" :key="col2.value">
-									<radio :value="col2.value" :checked="col2.value === col.value" />
-									<text>{{col2.label}}</text>
-								</label>
-							</radio-group>
-							<!-- Switch寮�叧 -->
-							<switch v-if="col.name=='Switch'" :class="col.disabled?'input-disabled':''"
-								:disabled="col.disabled" v-model="col.value" @change="onEnterChange(col)" />
-							<OIDatePicker v-if="col.name=='DatePicker'" :class="col.disabled?'input-disabled':''"
-								:disabled="col.disabled" v-model="col.value" :placeholder="col.placeholder"
-								:defaultToday="col.setting.defaultToday" :format="col.setting.format"
-								@change="onModelValue(col)" />
-							<OIDatePickerRange v-if="col.name=='DatePickerRange'"
-								:rangeSeparator="col.setting.separator" :format="col.setting.format"
-								:class="col.disabled?'input-disabled':''" :disabled="col.disabled" v-model="col.value"
-								:placeholder="col.placeholder" @change="onModelValue(col)" />
-							<OITimePicker v-if="col.name=='TimePicker'" :class="col.disabled?'input-disabled':''"
-								:disabled="col.disabled" v-model="col.value" :placeholder="col.placeholder"
-								@change="onModelValue(col)" />
-						</uni-forms-item>
-						<uni-forms-item v-else label=""></uni-forms-item>
-					</uni-col>
-				</uni-row>
-			</view>
-		</uni-forms>
 		<view class="view-content">
 			<!-- 鐮佺洏瀛愮晫闈�-->
 			<view v-if="param.Show_Welcom_Page==false" class="uni-panel-content">
@@ -139,39 +27,8 @@
 										@tap="onPanelClick(ii,style.form.htmlobjId)"
 										:id="'dvpanel'+style.form.htmlobjId"
 										:class="style.form.htmlobjId==active_id?'bk-active':''">
-										<uni-forms class="dv-panel-form" label-align="right">
-											<div class="dv-panel-form-item" v-for="(item,index) in style.form.items">
-												<!-- 鏅�甯冨眬 -->
-												<uni-forms-item v-if="item.name != 'Layout'"
-													:label="item.label ?item.label +'锛�:'' "
-													:label-width="item.labelWidth+'px'">
-													<span class="form-item-span"
-														v-if="item.disabled">{{item.value}}</span>
-													<input v-else class="uni-input"
-														:type="item.name=='InputNumber'?'number':'text'"
-														v-model="item.value" :disabled="item.disabled"
-														:placeholder="item.placeholder" :maxlength="-1" />
-												</uni-forms-item>
-												<!-- 鏍呮牸甯冨眬 -->
-												<uni-row v-else :gutter="item.setting.gutter">
-													<uni-col
-														:span=" item.setting.spanList && item.setting.spanList[key]? item.setting.spanList[key] : (24 / item.setting.col)"
-														v-for="(col,key) in item.setting.colList">
-														<uni-forms-item v-if="col!=null"
-															:label="col.label ? col.label +'锛�:''"
-															:label-width="col.labelWidth+'px'">
-															<span class="form-item-span"
-																v-if="col.disabled">{{col.value}}</span>
-															<input v-else class="uni-input"
-																:type="col.name=='InputNumber'?'number':'text'"
-																v-model="col.value" :disabled="col.disabled"
-																:placeholder="col.placeholder" :maxlength="-1" />
-														</uni-forms-item>
-														<uni-forms-item v-else label=""></uni-forms-item>
-													</uni-col>
-												</uni-row>
-											</div>
-										</uni-forms>
+										<OIForm class="dv-panel-form" :form="style.form" viewMode></OIForm>
+
 										<div class="dv-panel-button"
 											v-if="pageData.Select_Button==true || pageData.Row_Button.length > 0">
 
@@ -265,9 +122,7 @@
 		runCustomEvent,
 	} from "@/api/data.js"
 	import dayjs from "dayjs";
-	import OIDatePicker from '@/components/oi-date-time-picker/oi-date-picker.vue'
-	import OIDatePickerRange from '@/components/oi-date-time-picker/oi-date-picker-range.vue'
-	import OITimePicker from '@/components/oi-date-time-picker/oi-time-picker.vue'
+	import OIForm from '@/components/oi-form/index.vue'
 
 	export default {
 		name: "PageModal5601",
@@ -275,9 +130,7 @@
 			Base64,
 		},
 		components: {
-			OIDatePicker,
-			OIDatePickerRange,
-			OITimePicker
+			OIForm,
 		},
 		data() {
 			return {
@@ -773,10 +626,11 @@
 					console.log(result.decodedata);
 					item.value = result.decodedata;
 					var $this = this;
-					if (item.oldvalue != item.value && item.value.trim() != "") {
-						item.oldvalue = item.value;
+					let newVal = item.value.trim()
+					if (item.oldvalue != newVal) {
+						item.oldvalue = newVal;
 						var attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
+						this.head_styledef.form.model[attr] = newVal;
 						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠� 						var onSuffixClickCallbackEvent = item.bind
 							.onSuffixClickCallbackEvent; //鍚庡浘鏍囩偣鍑讳簨浠�@@ -787,36 +641,60 @@
 						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠� 							$this.onChange(onChangeEvent);
 						}
-						if (item.value) { //绗竴涓緭鍏ユ涓嶄负绌�-							//鍒濆鍖栵紝涓嬩釜杈撳叆妗唂ocus灞炴�
-							var findd = false
-							for (let i in $this.head_styledef.form.items) {
-								const ele = $this.head_styledef.form.items[i]
 
-								if (ele.name != "Layout") {
-									if (ele.name == 'Input' || ele.name ==
-										'InputNumber') {
-										if (attr == ele.fieldId) {
-											findd = true
-										} else {
-											if (findd) {
-												$this.setData({
-													focusFieldId: ele.fieldId
-												})
-												break
-											}
+						//鍒濆鍖栵紝涓嬩釜杈撳叆妗唂ocus灞炴�
+						var findd = false
+						for (let i in $this.head_styledef.form.items) {
+							const ele = $this.head_styledef.form.items[i]
 
+							if (ele.name != "Layout") {
+								if (ele.name == 'Input' || ele.name ==
+									'InputNumber') {
+									if (attr == ele.fieldId) {
+										findd = true
+									} else {
+										if (findd) {
+											$this.setData({
+												focusFieldId: ele.fieldId
+											})
+											break
 										}
 
 									}
-								} else {
-									if (findd) {
-										let curIndex = ele.setting.colList.findIndex((
-											col, index2, arr) => {
-											return (col.name == 'Input' || col
-												.name == 'InputNumber');
+
+								}
+							} else {
+								if (findd) {
+									let curIndex = ele.setting.colList.findIndex((
+										col, index2, arr) => {
+										return (col.name == 'Input' || col
+											.name == 'InputNumber');
+									})
+									if (curIndex > -1) {
+										$this.setData({
+											focusFieldId: ele.setting
+												.colList[curIndex]
+												.fieldId
 										})
-										if (curIndex > -1) {
+										break
+									}
+
+								} else {
+									let curIndex = ele.setting.colList.findIndex((
+										col, index2, arr) => {
+										return attr == col.fieldId;
+									})
+									if (curIndex > -1) {
+										findd = true
+										let curIndex2 = ele.setting.colList
+											.findIndex((col, index2, arr) => {
+												return (col.name == 'Input' ||
+														col.name ==
+														'InputNumber') &&
+													index2 >
+													curIndex;
+											})
+										if (curIndex2 > -1) {
 											$this.setData({
 												focusFieldId: ele.setting
 													.colList[curIndex]
@@ -824,47 +702,27 @@
 											})
 											break
 										}
-
-									} else {
-										let curIndex = ele.setting.colList.findIndex((
-											col, index2, arr) => {
-											return attr == col.fieldId;
-										})
-										if (curIndex > -1) {
-											findd = true
-											let curIndex2 = ele.setting.colList
-												.findIndex((col, index2, arr) => {
-													return (col.name == 'Input' ||
-															col.name ==
-															'InputNumber') &&
-														index2 >
-														curIndex;
-												})
-											if (curIndex2 > -1) {
-												$this.setData({
-													focusFieldId: ele.setting
-														.colList[curIndex]
-														.fieldId
-												})
-												break
-											}
-										}
 									}
-
 								}
+
 							}
 						}
-
 					}
 				})
 			},
 
 			onEnterChange(item) { //鍥炶溅锛岀偣鍑绘寜閽紝鍙栨秷鑺傜偣浜嬩欢
 				console.log(item);
-				if (item.oldvalue != item.value && item.value.trim() != "") {
-					item.oldvalue = item.value;
+				let newVal = item.value
+				if (typeof item.value == "string") {
+					newVal = item.value.trim()
+					if (!newVal)
+						return
+				}
+				if (item.oldvalue != newVal) {
+					item.oldvalue = newVal;
 					var attr = item.fieldId;
-					this.head_styledef.form.model[attr] = item.value;
+					this.head_styledef.form.model[attr] = newVal;
 					var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠� 
 					if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�@@ -873,67 +731,7 @@
 
 				}
 			},
-			onCheckBoxValue(e) { //缁戝畾Model鍊�-				let values = e.detail.value || []
-				const item = this.head_styledef.form.items[e.currentTarget?.dataset?.index || 0]
-				if (item?.setting?.colList) {
-					const col = item.setting.colList[e.currentTarget?.dataset?.iindex || 0]
-					if (col) {
-						col.value = values
-						let attr = col.fieldId;
-						this.head_styledef.form.model[attr] = col.value;
-						var onChangeEvent = col.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-						return
-					}
-				} else {
-					if (item) {
-						item.value = values
-						let attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
-						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-					}
-				}
-
-			},
-			onRadioBoxValue(e) { //缁戝畾Model鍊�-				let values = e.detail.value || ""
-				const item = this.head_styledef.form.items[e.currentTarget?.dataset?.index || 0]
-				if (item?.setting?.colList) {
-					const col = item.setting.colList[e.currentTarget?.dataset?.iindex || 0]
-					if (col) {
-						col.value = values
-						let attr = col.fieldId;
-						this.head_styledef.form.model[attr] = col.value;
-						var onChangeEvent = col.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-						return
-					}
-				} else {
-					if (item) {
-						item.value = values
-						let attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
-						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-					}
-
-				}
-
-			},
-			onModelValue(item) {
-				var attr = item.fieldId;
-				this.head_styledef.form.model[attr] = item.value;
-			},
+	
 			classAttr_extButton(item) {
 				var onSuffixClickCallbackEvent = item.bind.onSuffixClickCallbackEvent; //鍚庡浘鏍囩偣鍑讳簨浠� 				var onSuffixClickEvent = item.bind.onSuffixClickEvent; //鍚庡浘鏍囩偣鍑诲洖璋�diff --git a/pages/modal/form/index.vue b/pages/modal/form/index.vue
index a1acb6d..55c95e5 100644
--- a/pages/modal/form/index.vue
+++ b/pages/modal/form/index.vue
@@ -2,122 +2,9 @@
 	<view class="uni-page-modal-form">
 		<view class="view-content">
 			<!-- 琛ㄥご鏍峰紡 -->
-			<uni-forms ref="baseForm" label-align="right">
-				<view v-for="(item,index) in head_styledef.form.items" :key="index" class="v-head-style">
-					<!-- 鏅�甯冨眬 -->
-					<uni-forms-item v-if="item.name != 'Layout'" :label="item.label ?item.label +'锛�:'' "
-						:label-width="item.labelWidth+'px'">
-						<uni-data-picker v-if="item.name=='Select'" :class="item.disabled?'input-disabled':''"
-							v-model="item.value" :localdata="item.useDict ? item.dict : item.selections"
-							@change="onEnterChange(item)" :readonly="item.disabled" :clear-icon="false"
-							:popup-title="item.label"></uni-data-picker>
-						<view class="input-wrapper" v-if="item.name=='Input' || item.name=='InputNumber'">
-							<text v-if="item.setting.prefix" class="uni-icon" :class="[item.setting.prefix]"
-								@click="classAttr_extButton(item)">&#xe568;</text>
-							<input class="uni-input" :class="item.disabled?'input-disabled':''"
-								:style="{'padding-left':item.setting.prefix?0 : '8rpx','right':item.setting.suffix?0 : '8rpx'}"
-								:type="item.name=='Input'?'text':'number'" v-model="item.value"
-								:disabled="item.disabled" :placeholder="item.placeholder"
-								:focus="focusFieldId == item.fieldId" @focus="ontap(item)" @click="onClick(item)"
-								@keyup.enter="onEnterChange(item)" @blur="onEnterChange(item)" :maxlength="-1" />
-							<text v-if="item.setting.suffix" class="uni-icon" :class="[item.setting.suffix]"
-								@click="classAttr_extButton(item)"></text>
-						</view>
-						<!-- 澶嶉�妗�-->
-						<checkbox-group v-if="item.name=='Checkbox'" :class="item.disabled?'input-disabled':''"
-							:disabled="item.disabled" @change="onCheckBoxValue" :data-attr="item.fieldId"
-							:data-index="index">
-							<label v-for="(item2) in item.selections" :key="item2.value">
-								<checkbox :value="item2.value" :checked="item.value.includes(item2.value)" />
-								<text>{{item2.label}}</text>
-							</label>
-						</checkbox-group>
-						<!-- 鍗曢�妗�-->
-						<radio-group v-if="item.name=='Radio'" :class="item.disabled?'input-disabled':''"
-							:disabled="item.disabled" @change="onRadioBoxValue" :data-attr="item.fieldId"
-							:data-index="index">
-							<label v-for="(item2) in item.selections" :key="item2.value">
-								<radio :value="item2.value" :checked="item2.value === item.value" />
-								<text>{{item2.label}}</text>
-							</label>
-						</radio-group>
-						<!-- Switch寮�叧 -->
-						<switch class="input-switch" v-if="item.name=='Switch'"
-							:class="item.disabled?'input-disabled':''" :disabled="item.disabled" v-model="item.value"
-							@change="onEnterChange(item)" />
-						<OIDatePicker v-if="item.name=='DatePicker'" :class="item.disabled?'input-disabled':''"
-							:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-							:defaultToday="item.setting.defaultToday" :format="item.setting.format"
-							@change="onDatetimePickerChange(item)" />
-						<OIDatePickerRange v-if="item.name=='DatePickerRange'" :rangeSeparator="item.setting.separator"
-							:format="item.setting.format" :class="item.disabled?'input-disabled':''"
-							:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-							@change="onDatetimePickerChange(item)" />
-						<OITimePicker v-if="item.name=='TimePicker'" :class="item.disabled?'input-disabled':''"
-							:disabled="item.disabled" v-model="item.value" :placeholder="item.placeholder"
-							@change="onDatetimePickerChange(item)" />
-					</uni-forms-item>
-					<!-- 鏍呮牸甯冨眬 -->
-					<uni-row v-else :gutter="item.setting.gutter">
-						<uni-col
-							:span=" item.setting.spanList && item.setting.spanList[key]? item.setting.spanList[key] : 24 / item.setting.col"
-							v-for="(col,key) in item.setting.colList">
-							<uni-forms-item v-if="col!=null" :label="col.label ? col.label +'锛�:''"
-								:label-width="col.labelWidth+'px'">
-								<uni-data-picker v-if="col.name=='Select'" :class="col.disabled?'input-disabled':''"
-									v-model="col.value" :localdata="col.useDict ? col.dict : col.selections"
-									@change="onEnterChange(col)" :readonly="col.disabled" :clear-icon="false"
-									:popup-title="col.label"></uni-data-picker>
-								<view class="input-wrapper" v-if="col.name=='Input' || col.name=='InputNumber'">
-									<text v-if="col.setting.prefix" class="uni-icon" :class="[col.setting.prefix]"
-										@click="classAttr_extButton(col)">&#xe568;</text>
-									<input class="uni-input" :class="col.disabled?'input-disabled':''"
-										:style="{'padding-left':col.setting.prefix?0 : '8px','right':col.setting.suffix?0 : '8px'}"
-										:type="col.name=='Input'?'text':'number'" v-model="col.value"
-										:disabled="col.disabled" :placeholder="col.placeholder"
-										:focus="focusFieldId == col.fieldId" @focus="ontap(col)" @click="onClick(col)"
-										@keyup.enter="onEnterChange(col)" @blur="onEnterChange(col)" :maxlength="-1" />
-									<text v-if="col.setting.suffix" class="uni-icon" :class="[col.setting.suffix]"
-										@click="classAttr_extButton(col)"></text>
-								</view>
-								<!-- 澶嶉�妗�-->
-								<checkbox-group v-if="col.name=='Checkbox'" :class="col.disabled?'input-disabled':''"
-									:disabled="col.disabled" @change="onCheckBoxValue" :data-attr="col.fieldId"
-									:data-index="index" :data-iindex="key">
-									<label v-for="(col2) in col.selections" :key="col2.value">
-										<checkbox :value="col2.value" :checked="col.value.includes(col2.value)" />
-										<text>{{col2.label}}</text>
-									</label>
-								</checkbox-group>
-								<!-- 鍗曢�妗�-->
-								<radio-group v-if="col.name=='Radio'" :class="col.disabled?'input-disabled':''"
-									:disabled="col.disabled" @change="onRadioBoxValue" :data-attr="col.fieldId"
-									:data-index="index" :data-iindex="key">
-									<label v-for="(col2) in col.selections" :key="col2.value">
-										<radio :value="col2.value" :checked="col2.value === col.value" />
-										<text>{{col2.label}}</text>
-									</label>
-								</radio-group>
-								<!-- Switch寮�叧 -->
-								<switch v-if="col.name=='Switch'" :class="col.disabled?'input-disabled':''"
-									:disabled="col.disabled" v-model="col.value" @change="onEnterChange(col)" />
-								<OIDatePicker v-if="col.name=='DatePicker'" :class="col.disabled?'input-disabled':''"
-									:disabled="col.disabled" v-model="col.value" :placeholder="col.placeholder"
-									:defaultToday="col.setting.defaultToday" :format="col.setting.format"
-									@change="onDatetimePickerChange(col)" />
-								<OIDatePickerRange v-if="col.name=='DatePickerRange'"
-									:rangeSeparator="col.setting.separator" :format="col.setting.format"
-									:class="col.disabled?'input-disabled':''" :disabled="col.disabled"
-									v-model="col.value" :placeholder="col.placeholder"
-									@change="onDatetimePickerChange(col)" />
-								<OITimePicker v-if="col.name=='TimePicker'" :class="col.disabled?'input-disabled':''"
-									:disabled="col.disabled" v-model="col.value" :placeholder="col.placeholder"
-									@change="onDatetimePickerChange(col)" />
-							</uni-forms-item>
-						</uni-col>
-					</uni-row>
-				</view>
-			</uni-forms>
+			<OIForm ref="refBaseForm" class="v-head-style" :form="head_styledef.form" :focusId="focusFieldId"
+				@click="onClick" @focus="ontap" @change="onEnterChange" @click-prefix="classAttr_extButton"
+				@click-suffix="classAttr_extButton"></OIForm>
 		</view>
 		<view class="view-bottom">
 			<button type="primary" @tap="ok" class="btn_add" :class="okLoading?'btn_disabled':''"
@@ -166,18 +53,15 @@
 		dataObjInfo
 	} from "@/api/data.js"
 	import dayjs from "dayjs";
-	import OIDatePicker from '@/components/oi-date-time-picker/oi-date-picker.vue'
-	import OIDatePickerRange from '@/components/oi-date-time-picker/oi-date-picker-range.vue'
-	import OITimePicker from '@/components/oi-date-time-picker/oi-time-picker.vue'
+	import OIForm from '@/components/oi-form/index.vue'
+
 	export default {
 		name: "PageModalForm",
 		modules: {
 			Base64,
 		},
 		components: {
-			OIDatePicker,
-			OIDatePickerRange,
-			OITimePicker
+			OIForm
 		},
 		data() {
 			return {
@@ -650,10 +534,13 @@
 					console.log(result.decodedata);
 					item.value = result.decodedata;
 					var $this = this;
-					if (item.oldvalue != item.value && item.value.trim() != "") {
-						item.oldvalue = item.value;
+					let newVal = item.value.trim()
+					if (!newVal)
+						return
+					if (item.oldvalue != newVal) {
+						item.oldvalue = newVal;
 						var attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
+						this.head_styledef.form.model[attr] = newVal;
 						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠� 						var onSuffixClickCallbackEvent = item.bind
 							.onSuffixClickCallbackEvent; //鍚庡浘鏍囩偣鍑讳簨浠�@@ -664,36 +551,59 @@
 						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠� 							$this.onChange(onChangeEvent);
 						}
-						if (item.value) { //绗竴涓緭鍏ユ涓嶄负绌�-							//鍒濆鍖栵紝涓嬩釜杈撳叆妗唂ocus灞炴�
-							var findd = false
-							for (let i in $this.head_styledef.form.items) {
-								const ele = $this.head_styledef.form.items[i]
+						//鍒濆鍖栵紝涓嬩釜杈撳叆妗唂ocus灞炴�
+						var findd = false
+						for (let i in $this.head_styledef.form.items) {
+							const ele = $this.head_styledef.form.items[i]
 
-								if (ele.name != "Layout") {
-									if (ele.name == 'Input' || ele.name ==
-										'InputNumber') {
-										if (attr == ele.fieldId) {
-											findd = true
-										} else {
-											if (findd) {
-												$this.setData({
-													focusFieldId: ele.fieldId
-												})
-												break
-											}
-
+							if (ele.name != "Layout") {
+								if (ele.name == 'Input' || ele.name ==
+									'InputNumber') {
+									if (attr == ele.fieldId) {
+										findd = true
+									} else {
+										if (findd) {
+											$this.setData({
+												focusFieldId: ele.fieldId
+											})
+											break
 										}
 
 									}
-								} else {
-									if (findd) {
-										let curIndex = ele.setting.colList.findIndex((
-											col, index2, arr) => {
-											return (col.name == 'Input' || col
-												.name == 'InputNumber');
+
+								}
+							} else {
+								if (findd) {
+									let curIndex = ele.setting.colList.findIndex((
+										col, index2, arr) => {
+										return (col.name == 'Input' || col
+											.name == 'InputNumber');
+									})
+									if (curIndex > -1) {
+										$this.setData({
+											focusFieldId: ele.setting
+												.colList[curIndex]
+												.fieldId
 										})
-										if (curIndex > -1) {
+										break
+									}
+
+								} else {
+									let curIndex = ele.setting.colList.findIndex((
+										col, index2, arr) => {
+										return attr == col.fieldId;
+									})
+									if (curIndex > -1) {
+										findd = true
+										let curIndex2 = ele.setting.colList
+											.findIndex((col, index2, arr) => {
+												return (col.name == 'Input' ||
+														col.name ==
+														'InputNumber') &&
+													index2 >
+													curIndex;
+											})
+										if (curIndex2 > -1) {
 											$this.setData({
 												focusFieldId: ele.setting
 													.colList[curIndex]
@@ -701,34 +611,9 @@
 											})
 											break
 										}
-
-									} else {
-										let curIndex = ele.setting.colList.findIndex((
-											col, index2, arr) => {
-											return attr == col.fieldId;
-										})
-										if (curIndex > -1) {
-											findd = true
-											let curIndex2 = ele.setting.colList
-												.findIndex((col, index2, arr) => {
-													return (col.name == 'Input' ||
-															col.name ==
-															'InputNumber') &&
-														index2 >
-														curIndex;
-												})
-											if (curIndex2 > -1) {
-												$this.setData({
-													focusFieldId: ele.setting
-														.colList[curIndex]
-														.fieldId
-												})
-												break
-											}
-										}
 									}
-
 								}
+
 							}
 						}
 
@@ -738,79 +623,22 @@
 
 			onEnterChange(item) { //鍥炶溅锛岀偣鍑绘寜閽紝鍙栨秷鑺傜偣浜嬩欢
 				console.log(item);
-				if (item.oldvalue != item.value && item.value.trim() != "") {
-					item.oldvalue = item.value;
+				let newVal = item.value
+				if (typeof item.value == "string") {
+					newVal = item.value.trim()
+					if (!newVal)
+						return
+				}
+				if (item.oldvalue != newVal) {
+					item.oldvalue = newVal;
 					var attr = item.fieldId;
-					this.head_styledef.form.model[attr] = item.value;
+					this.head_styledef.form.model[attr] = newVal;
 					var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-
 					if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠� 						this.onChange(onChangeEvent);
 					}
 
 				}
-			},
-			onCheckBoxValue(e) { //缁戝畾Model鍊�-				let values = e.detail.value || []
-				const item = this.head_styledef.form.items[e.currentTarget?.dataset?.index || 0]
-				if (item?.setting?.colList) {
-					const col = item.setting.colList[e.currentTarget?.dataset?.iindex || 0]
-					if (col) {
-						col.value = values
-						let attr = col.fieldId;
-						this.head_styledef.form.model[attr] = col.value;
-						var onChangeEvent = col.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-						return
-					}
-				} else {
-					if (item) {
-						item.value = values
-						let attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
-						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-					}
-				}
-
-			},
-			onRadioBoxValue(e) { //缁戝畾Model鍊�-				let values = e.detail.value || ""
-				const item = this.head_styledef.form.items[e.currentTarget?.dataset?.index || 0]
-				if (item?.setting?.colList) {
-					const col = item.setting.colList[e.currentTarget?.dataset?.iindex || 0]
-					if (col) {
-						col.value = values
-						let attr = col.fieldId;
-						this.head_styledef.form.model[attr] = col.value;
-						var onChangeEvent = col.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-						return
-					}
-				} else {
-					if (item) {
-						item.value = values
-						let attr = item.fieldId;
-						this.head_styledef.form.model[attr] = item.value;
-						var onChangeEvent = item.bind.onChangeEvent; //鍐呭鍙樺寲鍚庝簨浠�-						if (onChangeEvent?.id) { //鍐呭鍙樺寲鍚庝簨浠�-							this.onChange(onChangeEvent);
-						}
-					}
-
-				}
-
-			},
-			onDatetimePickerChange(e) {
-				var attr = item.fieldId;
-				this.head_styledef.form.model[attr] = item.value;
-
 			},
 			classAttr_extButton(item) {
 				var onSuffixClickCallbackEvent = item.bind.onSuffixClickCallbackEvent; //鍚庡浘鏍囩偣鍑讳簨浠�
--
Gitblit v1.9.1