From af29ed5e850186b1e89f764b167a1318bfb401a3 Mon Sep 17 00:00:00 2001
From: schangxiang@126.com <schangxiang@126.com>
Date: 周一, 12 5月 2025 21:56:15 +0800
Subject: [PATCH] 增加 高级查询组件

---
 Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/templatedemo_web/src/components/DyFormForHighQuery/DyFormForHighQuery.tsx         |  239 +++++++++++++++++++++++++++++++++++++++
 Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/templatedemo_web/src/components/DyFormForHighQuery/DyFormForHighQuery.module.scss |   41 ++++++
 Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/templatedemo_web/src/components/DyFormForHighQuery/DyFormForHighQuery.d.ts        |   39 ++++++
 Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/templatedemo_web/src/widgets/WmsMaterial/Controllers/WmsMaterialQueryDrawer.tsx   |   13 +
 4 files changed, 330 insertions(+), 2 deletions(-)

diff --git "a/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/components/DyFormForHighQuery/DyFormForHighQuery.d.ts" "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/components/DyFormForHighQuery/DyFormForHighQuery.d.ts"
new file mode 100644
index 0000000..37a99ee
--- /dev/null
+++ "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/components/DyFormForHighQuery/DyFormForHighQuery.d.ts"
@@ -0,0 +1,39 @@
+import { VNode, Component, DefineComponent } from 'vue'
+
+export interface OptionItemType {
+  label?: string
+  description?: string
+  name?: string
+  value: string | number
+}
+
+export interface FormItemPropType {
+  prop?: string | Ref<string>
+  highSelectProp?: string | Ref<string>
+  label?: String | Ref<string>
+  rules?: any[] | Ref<any[]>
+  disabled?: boolean | Ref<boolean>
+  placeholder?: string | Ref<string>
+  type?: string | Ref<string>
+  width?: string | Ref<string>
+  el?: string | Component | DefineComponent | Ref<string>
+  options?: OptionItemType[] | any[] | Ref<any>
+  highSelectOptions?: OptionItemType[] | any[] | Ref<any>
+  highSelectAttrs?: object | Ref<object>
+  isTitle?: boolean
+  title?:string | Component
+  [key: string]: any | Ref<string>
+}
+
+export interface FormPropsType {
+  formData: { [key: string]: any }
+  formItemProps: FormItemPropType[]
+  [key: string]: any
+}
+
+export interface PropsType {
+  formItemProps: FormItemPropType[]
+  formData: { [key: string]: any }
+  labelWidth: string
+  [key: string]: any
+}
diff --git "a/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/components/DyFormForHighQuery/DyFormForHighQuery.module.scss" "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/components/DyFormForHighQuery/DyFormForHighQuery.module.scss"
new file mode 100644
index 0000000..0fff059
--- /dev/null
+++ "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/components/DyFormForHighQuery/DyFormForHighQuery.module.scss"
@@ -0,0 +1,41 @@
+.formStyle {
+  .formItem {
+    // 绉婚櫎鍥哄畾瀹藉害闄愬埗
+    width: auto !important;
+    margin-right: 0 !important;
+  }
+  
+  .formControl {
+    flex: 1; // 璁╂帶浠跺崰鎹墿浣欑┖闂�
+    min-width: 0; // 鍏佽鎺т欢鏀剁缉
+  }
+
+  .formItemLabel {
+    display: inline-flex;
+    justify-content: flex-end;
+    align-items: center;
+    flex: 0 0 auto;
+    font-size: var(--cs-form-label-font-size);
+    color: var(--cs-text-color-regular);
+    height: 32px;
+    line-height: 32px;
+    padding: 0 12px 0 0;
+    box-sizing: border-box;
+    > img {
+      margin-left: 10px;
+    }
+  }
+  
+  :global(.cs-select) {
+    width: 100%;
+  }
+  
+  // 绉婚櫎鍥哄畾瀹藉害璁剧疆
+  :global(.cs-form--inline .cs-form-item) {
+    width: auto !important;
+  }
+  
+  :global(.cs-form--inline .cs-form-item:nth-last-of-type(2n)) {
+    margin-right: 0 !important;
+  }
+}
\ No newline at end of file
diff --git "a/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/components/DyFormForHighQuery/DyFormForHighQuery.tsx" "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/components/DyFormForHighQuery/DyFormForHighQuery.tsx"
new file mode 100644
index 0000000..1896216
--- /dev/null
+++ "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/components/DyFormForHighQuery/DyFormForHighQuery.tsx"
@@ -0,0 +1,239 @@
+// import { ElInput } from "element-plus";
+import {
+  defineComponent,
+  PropType,
+  ref,
+  Ref,
+  SetupContext,
+  computed,
+  unref,
+  markRaw,
+  DefineComponent,
+} from 'vue'
+import styles from './DyForm.module.scss'
+import ElInput from 'element-plus/es/components/input/index'
+import Option from '@/components/Select/Option'
+import Select from '@/components/Select/Select'
+import SelectInput from '@/components/SelectInput/SelectInput'
+import type { FormInstance } from 'element-plus'
+import Icon from '../Icon/Icon'
+import {
+  FormPropsType,
+  FormItemPropType,
+  PropsType,
+  OptionItemType,
+} from './DyFormForHighQuery.d'
+import Variable from '../Variable/Variable'
+import Title from '../Title/Title'
+import TextareaFlow from '../Flow/Flow'
+import get from 'lodash/get'
+import set from 'lodash/set'
+
+const formItemElementMap = markRaw<Record<string, any>>({
+  input: ElInput,
+  select: Select,
+  selectInput: SelectInput,
+  variable: Variable,
+  textareaFlow: TextareaFlow,
+})
+
+const Type: Record<string, any> = {
+  select: 'select',
+}
+export default defineComponent<FormPropsType>({
+  //@ts-ignore
+  name: '鍔ㄦ�佽〃鍗�',
+  props: {
+    labelWidth: {
+      type: String,
+      default: '100px',
+    },
+    labelPosition: {
+      type: String,
+      default: 'left',
+    },
+    formData: {
+      type: Object as PropType<{ [key: string]: any }>,
+      default: () => ({}),
+    },
+    formItemProps: {
+      type: Array,
+      default: () => [],
+    },
+    inLine: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  setup(props: PropsType, { attrs, emit, expose }: SetupContext) {
+    const formRef = ref<FormInstance>()
+    const form: any = computed({
+      get() {
+        return props.formData
+      },
+      set(v) {
+        emit('update:formData', v)
+      },
+    })
+
+    const currentWidgetModel = computed(() => {
+      return (path: string) => {
+        return get(form.value, path)
+      }
+    })
+
+    const validate = () => {
+      if (!formRef.value) return false
+      return new Promise((resolve, reject) => {
+        formRef.value?.validate((valid: boolean) => {
+          if (valid) {
+            resolve(true)
+          } else {
+            reject(false)
+          }
+        })
+      })
+    }
+
+    const resetForm = () => {
+      if (!formRef.value) return false
+      formRef.value.resetFields()
+    }
+
+    const formItemProps = computed(() => {
+      return props.formItemProps || []
+    })
+
+    expose({ validate, resetForm })
+
+    const FormRender: any = ($props: any) => {
+      const item: FormItemPropType = $props.item
+      const options = $props.item.options || []
+      if (item.el && Type[item.el as string]) {
+        return options.map((el: OptionItemType) => (
+          <Option
+            label={el.label || el.description || el.name}
+            value={el.value}
+          ></Option>
+        ))
+      }
+      return null
+    }
+    const FormRenderForHighSelectOptions: any = ($props: any) => {
+      const item: FormItemPropType = $props.item
+      const options = $props.item.highSelectOptions || []
+      if (1===1) {
+        return options.map((el: OptionItemType) => (
+          <Option
+            label={el.label || el.description || el.name}
+            value={el.value}
+          ></Option>
+        ))
+      }
+      return null
+    }
+
+    const onUpdateModelValue = (v: string | number, prop: string) => {
+      set(form.value, prop, v)
+    }
+
+    return () => {
+      return (
+        <div class={styles.formStyle}>
+          <el-form
+            labelPosition={props.labelPosition}
+            labelWidth={props.labelWidth}
+            model={form.value}
+            ref={formRef}
+            inline={props.inLine}
+          >
+            {formItemProps.value.map(
+              (item: FormItemPropType, index: number) => {
+                if (item.isTitle) {
+                  if (typeof item.title === 'string') {
+                    return (
+                      <Title style="margin-bottom: 10px">{item.title}</Title>
+                    )
+                  }
+                  return item.title
+                }
+
+                const itemProps: FormItemPropType = {}
+                Object.entries(item).forEach(([key, value]) => {
+                  itemProps[key] = unref(value)
+                })
+
+                const el =
+                  typeof itemProps.el === 'string'
+                    ? formItemElementMap[itemProps.el]
+                    : itemProps.el || null
+                const Component = el
+                const el2 =
+                   formItemElementMap['select'];
+                const Component2 = el2
+                return Component && !item.isHide ? (
+                
+                  <el-form-item
+                    label={itemProps.label}
+                    prop={itemProps.prop}
+                    rules={itemProps.rules}
+                    key={itemProps.prop}
+                    vSlots={
+                      itemProps.labelIcon
+                        ? {
+                            label: () => (
+                              <label class={styles.formitemPropsLabel}>
+                                {itemProps.label}
+                                <Icon icon={itemProps.labelIcon} />
+                              </label>
+                            ),
+                          }
+                        : null
+                    }
+                  >
+                   {/* 娣诲姞鐨勬瘮杈冩搷浣滅閫夋嫨鍣� */}
+                   {/* 浣跨敤flex甯冨眬璁╀笁涓厓绱犲湪鍚屼竴琛� */}
+                   <div class="flex items-center w-full" style="width:100%">
+                  {/* <el-select
+                  size="small"
+                  style="margin-right: 8px; min-width: 10px;"
+                >
+                  <el-option label="绛変簬" value="2" />
+                  <el-option label="涓嶇瓑浜�" value="8" />
+                </el-select>  */}
+                
+                <Component2 style="width:150px;"
+                   {...itemProps.highSelectAttrs}
+                     modelValue={currentWidgetModel.value(itemProps.highSelectAttrs)}
+                     onUpdate:modelValue={(val: string | number) =>
+                        onUpdateModelValue(val, itemProps.highSelectAttrs)
+                      }>
+                  <FormRenderForHighSelectOptions item={itemProps} />
+                </Component2>
+                      &nbsp; 
+                    <Component
+                      style={{
+                        width: itemProps.width, // 榛樿鍗犳弧鍓╀綑瀹藉害
+                        // width: itemProps.width , // 榛樿鍗犳弧鍓╀綑瀹藉害
+                        height: itemProps.height,
+                      }}
+                      {...itemProps}
+                      // v-model={form.value[itemProps.prop as keyof any]}
+                      modelValue={currentWidgetModel.value(itemProps.prop)}
+                      onUpdate:modelValue={(val: string | number) =>
+                        onUpdateModelValue(val, itemProps.prop)
+                      }
+                    >
+                      <FormRender item={itemProps} />
+                    </Component>
+                    </div>
+                  </el-form-item>
+                ) : null
+              }
+            )}
+          </el-form>
+        </div>
+      )
+    }
+  },
+})
diff --git "a/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/widgets/WmsMaterial/Controllers/WmsMaterialQueryDrawer.tsx" "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/widgets/WmsMaterial/Controllers/WmsMaterialQueryDrawer.tsx"
index 301eb74..dcb33ed 100644
--- "a/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/widgets/WmsMaterial/Controllers/WmsMaterialQueryDrawer.tsx"
+++ "b/Weben_CMS\344\270\223\347\224\250\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250/Weben_CMS_TemplateDemo/templatedemo_web/src/widgets/WmsMaterial/Controllers/WmsMaterialQueryDrawer.tsx"
@@ -84,6 +84,13 @@
                    el: 'input', 
                    //disabled: disabled, 
                    placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮侊紙鍞竴鏍囪瘑锛�', 
+                   highSelectOptions: [{label: '鐪�',value: true}, {label: '鍋囧晩',value: false}],
+                   highSelectAttrs:{
+                     prop: 'materialCodexxx',
+                     el: 'select', 
+                     placeholder: '璇烽�夋嫨', 
+                     options:[]
+                   }
                 }, 
                 { 
                    label: '鏄惁鏈夋晥鐗╂枡', 
@@ -91,7 +98,8 @@
                    el: 'select', 
                    //disabled: disabled, 
                    placeholder: '璇疯緭鍏ユ槸鍚︽湁鏁堢墿鏂�', 
-                 options: [{label: '鏄�',value: true}, {label: '鍚�',value: false}] 
+                 options: [{label: '鏄�',value: true}, {label: '鍚�',value: false}],
+                 selectOptions: [{label: '鐪�',value: true}, {label: '鍋囧晩',value: false}] 
                 }, 
                 { 
                    label: '鏄惁鑷骇', 
@@ -99,7 +107,8 @@
                    el: 'select', 
                    //disabled: disabled, 
                    placeholder: '璇疯緭鍏ユ槸鍚﹁嚜浜�', 
-                 options: [{label: '鏄�',value: true}, {label: '鍚�',value: false}] 
+                 options: [{label: '鏄�',value: true}, {label: '鍚�',value: false}] ,
+                 selectOptions: [{label: '鐪�',value: true}, {label: '鍋囧晩',value: false}] 
                 }, 
                 { 
                    label: '鏁伴噺', 

--
Gitblit v1.9.3