Explorar el Código

fix: 表单渲染迁移

johnsen hace 3 meses
padre
commit
152b75225a

+ 36 - 1
src/business/platform/form/dynamic-form/form-field.vue

@@ -5,6 +5,7 @@
       fieldType === 'text' || fieldType === 'textarea' || fieldType === 'number'
     "
     v-model="dataModel"
+    :class="readonly ? '' : 'pink'"
     :name="field.name"
     :label="label"
     :placeholder="placeholder"
@@ -14,7 +15,7 @@
     :readonly="readonly"
     :rules="rules"
     :autosize="autosize"
-    :rows="fieldOptions.rows || 2"
+    :rows="1"
     :desc="field.desc"
     autocomplete="off"
     border
@@ -45,6 +46,7 @@
     :label="label"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     v-on="$listeners"
   />
@@ -62,6 +64,7 @@
     :other-option-value.sync="otherOptionValue"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     :desc-position="descPosition"
     :desc="field.desc"
@@ -83,6 +86,7 @@
     :other-option-value.sync="otherOptionValue"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     :desc-position="descPosition"
     :desc="field.desc"
@@ -102,6 +106,7 @@
     value-key="val"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     :desc-position="descPosition"
     :desc="field.desc"
@@ -130,6 +135,11 @@
         ? true
         : readonly
     "
+    :class="
+      readonly || fieldType === 'currentTime' || fieldType === 'currentDate'
+        ? ''
+        : 'pink'
+    "
     :rules="rules"
     type="custom"
     v-on="$listeners"
@@ -153,6 +163,7 @@
     :inactive-color="fieldOptions.inactive_color"
     :required="required"
     :disabled="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     v-on="$listeners"
   />
@@ -171,6 +182,7 @@
     :step="fieldOptions.step"
     :required="required"
     :disabled="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     v-on="$listeners"
   />
@@ -189,6 +201,7 @@
     :allow-half="fieldOptions.allow_half"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     v-on="$listeners"
   />
@@ -204,6 +217,7 @@
     :name="field.name"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     v-on="$listeners"
   />
@@ -224,6 +238,7 @@
     :name="field.name"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     v-on="$listeners"
   />
@@ -241,6 +256,7 @@
     :name="field.name"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     v-on="$listeners"
   />
@@ -264,6 +280,7 @@
     :name="field.name"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     v-on="$listeners"
   />
@@ -294,6 +311,11 @@
         ? true
         : readonly
     "
+    :class="
+      readonly || fieldType === 'currentUser' || fieldType === 'currentOrg'
+        ? ''
+        : 'pink'
+    "
     :rules="rules"
     @bind-callback="selectorBindCallback"
     v-on="$listeners"
@@ -316,6 +338,7 @@
     :name="field.name"
     :required="required"
     :readonly="fieldType === 'currentPosition' ? true : readonly"
+    :class="readonly || fieldType === 'currentPosition' ? '' : 'pink'"
     :rules="rules"
     @bind-callback="selectorBindCallback"
     v-on="$listeners"
@@ -338,6 +361,7 @@
     :name="field.name"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     v-on="$listeners"
     @callback="handleLinkageData"
@@ -348,6 +372,7 @@
     v-else-if="fieldType === 'linkdata'"
     v-model="dataModel"
     :label="field.label"
+    :field-options="fieldOptions"
     :desc="field.desc"
     :desc-position="descPosition"
     :placeholder="placeholder"
@@ -362,6 +387,7 @@
     :name="field.name"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     v-on="$listeners"
     @callback="handleLinkageData"
@@ -384,6 +410,7 @@
     :name="field.name"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     :rules="rules"
     v-on="$listeners"
   />
@@ -451,6 +478,7 @@
       :field="field"
       :form-data="formData"
       :readonly="readonly"
+      :class="readonly ? '' : 'pink'"
       :readonly-style="readonlyStyle"
       :code="code"
       :row="row"
@@ -496,6 +524,7 @@
     :name="field.name"
     :required="required"
     readonly
+    :class="readonly ? '' : 'pink'"
     autosize
     v-on="$listeners"
   >
@@ -562,6 +591,7 @@
     :name="field.name"
     :required="required"
     :readonly="readonly"
+    :class="readonly ? '' : 'pink'"
     v-on="$listeners"
   />
   <!-- 流程关联 -->
@@ -1184,4 +1214,9 @@ export default {
   line-height: 20px;
   padding: 2px 0 10px 15px;
 }
+.pink {
+  ::v-deep .van-field__label {
+    color: #f66 !important;
+  }
+}
 </style>

+ 77 - 28
src/business/platform/form/dynamic-form/form-item.vue

@@ -1,10 +1,14 @@
 <template>
-  <div v-show="!hidden">
+  <div
+    v-show="!hidden"
+    :data-field-type="field.field_type"
+    :data-label-field="field.name"
+  >
     <!-- 子表-->
     <ibps-dynamic-form-table
-      v-if="field.field_type==='table'"
+      v-if="field.field_type === 'table'"
       ref="formItem"
-      :value.sync="dataModel"
+      v-model="dataModel"
       :label="field.label"
       :field="field"
       :rights="fieldRights"
@@ -21,13 +25,14 @@
     <ibps-dynamic-form-field
       v-else
       ref="formItem"
+      v-model="dataModel"
+      class="form-item"
       :field="field"
       :desc-position="descPosition"
-      :value.sync="dataModel"
       :readonly="readonly"
       :required="required"
       :rules="rules"
-      :form-data="$utils.isNotEmpty(row)?formData:models"
+      :form-data="$utils.isNotEmpty(row) ? formData : models"
       :params="params"
       :form-opinion="formOpinion"
       v-on="listeners"
@@ -46,7 +51,8 @@ export default {
   props: {
     models: [Object, Array], // 字段数据
     formData: [Array, Object], // 表单数据(包含子表)
-    rights: { // 字段权限
+    rights: {
+      // 字段权限
       type: [String, Object],
       default: 'e'
     },
@@ -59,7 +65,9 @@ export default {
     code: {
       type: String
     },
-    readonlyRights: { // 只读
+    rowElClass: String,
+    readonlyRights: {
+      // 只读
       type: Boolean,
       default: false
     },
@@ -71,7 +79,8 @@ export default {
   data() {
     let defaultVal = ''
     if (this.fieldType === 'table') {
-      const isOne2More = (this.fieldOptions['relation'] || 'one2More') === 'one2More'
+      const isOne2More =
+        (this.fieldOptions['relation'] || 'one2More') === 'one2More'
       defaultVal = isOne2More ? [] : {}
     } else {
       defaultVal = ''
@@ -88,14 +97,19 @@ export default {
     fieldType() {
       return this.field.field_type
     },
-    subTableRights() { // 子表权限
-      if (this.fieldType === 'table' && this.$utils.isNotEmpty(this.fieldRights) &&
-      this.$utils.isPlainObject(this.fieldRights)) {
+    subTableRights() {
+      // 子表权限
+      if (
+        this.fieldType === 'table' &&
+        this.$utils.isNotEmpty(this.fieldRights) &&
+        this.$utils.isPlainObject(this.fieldRights)
+      ) {
         return this.fieldRights['rights']
       }
       return false
     },
-    hidden() { // 是否隐藏
+    hidden() {
+      // 是否隐藏
       // pc 设置移动端隐藏
       if (!this.$utils.toBoolean(this.fieldOptions.mobile, true)) {
         return true
@@ -103,23 +117,33 @@ export default {
       if (this.subTableRights) {
         return this.subTableRights === FormOptions.t.PERMISSIONS.HIDE
       }
-      return this.fieldRights === FormOptions.t.PERMISSIONS.HIDE || this.fieldType === 'hidden' ||
-      (this.fieldType === 'approval_opinion' && (this.$utils.isNotEmpty(this.defId) || this.hiddenApprovalOpinion))
+      return (
+        this.fieldRights === FormOptions.t.PERMISSIONS.HIDE ||
+        this.fieldType === 'hidden' ||
+        (this.fieldType === 'approval_opinion' &&
+          (this.$utils.isNotEmpty(this.defId) || this.hiddenApprovalOpinion))
+      )
     },
-    readonly() { // 是否只读
+    readonly() {
+      // 是否只读
       if (this.subTableRights) {
         return this.subTableRights === FormOptions.t.PERMISSIONS.READ
       }
-      return this.readonlyRights ? true : this.fieldRights === FormOptions.t.PERMISSIONS.READ
+      return this.readonlyRights
+        ? true
+        : this.fieldRights === FormOptions.t.PERMISSIONS.READ
     },
-    required() { // 必填  【只读隐藏,都设置非必填】
+    required() {
+      // 必填  【只读隐藏,都设置非必填】
       if (this.readonly || this.hidden) {
         return false
       }
       if (this.subTableRights) {
         return this.subTableRights === FormOptions.t.PERMISSIONS.REQUIRED
       }
-      return this.fieldRights === FormOptions.t.PERMISSIONS.REQUIRED ? true : this.field.field_options.required || false
+      return this.fieldRights === FormOptions.t.PERMISSIONS.REQUIRED
+        ? true
+        : this.field.field_options.required || false
     },
     fieldOptions() {
       return this.field.field_options || {}
@@ -131,20 +155,36 @@ export default {
       return this.params.responseLinkages ? this.params.responseLinkages : null
     },
     noDesc() {
-      const noDesc = ['editor', 'attachment', 'signature', 'desc', 'bpmInstHis', 'bpmLink', 'alert']
+      const noDesc = [
+        'editor',
+        'attachment',
+        'signature',
+        'desc',
+        'bpmInstHis',
+        'bpmLink',
+        'alert'
+      ]
       return noDesc.includes(this.fieldType)
     },
     // 表单验证
     rules() {
-      if (this.readonly || this.hidden) { return [] }
+      if (this.readonly || this.hidden) {
+        return []
+      }
       return FormUtil.buildFormRules(this.field, this.required, this.formData)
     },
     listeners() {
       return {
         ...this.$listeners,
-        change: (data) => { this.emitEvent('change', data) }, // 在 Input 值改变时触发
-        focus: (event) => { this.emitEvent('focus', event) }, // 在 Input 获得焦点时触发
-        blur: (event) => { this.emitEvent('blur', event) }, // 在 Input 失去焦点时触发
+        change: (data) => {
+          this.emitEvent('change', data)
+        }, // 在 Input 值改变时触发
+        focus: (event) => {
+          this.emitEvent('focus', event)
+        }, // 在 Input 获得焦点时触发
+        blur: (event) => {
+          this.emitEvent('blur', event)
+        }, // 在 Input 失去焦点时触发
         // click: (event) => { this.emitEvent('click', event) } // 在 Input 点击时触发
         'change-data': this.handleModels // 数据改变
       }
@@ -164,7 +204,6 @@ export default {
           this.runLinkage()
         })
       },
-      deep: true,
       immediate: true
     },
     models: {
@@ -197,9 +236,11 @@ export default {
       })
     },
     handleFieldRights(name, val) {
+      // console.log('name, val===>', name, val)
       if (this.$utils.isEmpty(name)) {
         return
       }
+
       this.rights[name] = val
       this.$emit('update:rights', {
         ...this.rights,
@@ -249,7 +290,8 @@ export default {
     runLinkage() {
       if (!this.linkages) return
       const { field, code } = this
-      if (field.isSub) { // 子表
+      if (field.isSub) {
+        // 子表
         const key = code + '.' + field.name
         const linkages = this.linkages ? this.linkages[key] : null
         if (linkages) {
@@ -264,8 +306,14 @@ export default {
         }
       }
     },
-    emitEvent(event) {
+    emitEvent(event, val) {
       this.$emit(event, ...Array.from(arguments).slice(1))
+      this.$emit('onEvent', {
+        type: event,
+        val,
+        field: this.field,
+        trClass: this.rowElClass
+      })
     },
     /**
      * 获得表单验证
@@ -277,7 +325,9 @@ export default {
      *  获得表单验证的第一个错误
      */
     getFirstError() {
-      return this.$refs.formField.errors.has(this.field.name) ? this.$refs.formField.errors.first(this.field.name) : ''
+      return this.$refs.formField.errors.has(this.field.name)
+        ? this.$refs.formField.errors.first(this.field.name)
+        : ''
     },
     /**
      * 获得表单错误信息
@@ -294,4 +344,3 @@ export default {
   }
 }
 </script>
-

+ 2 - 0
src/business/platform/form/dynamic-form/form-table-block.vue

@@ -15,6 +15,7 @@
       :row="row"
       :readonly-rights="readonlyRights"
       :params="params"
+      :row-el-class="rowElClass"
       v-on="$listeners"
     />
     <!--其他类型-->
@@ -30,6 +31,7 @@
       :main-code="mainCode"
       :code="code"
       :row="row"
+      :row-el-class="rowElClass"
       :readonly-rights="readonlyRights"
       :params="params"
       v-on="$listeners"

+ 360 - 227
src/business/platform/form/dynamic-form/form-table.vue

@@ -3,12 +3,9 @@
     <van-collapse v-model="activeCollapseNames">
       <!--一对一-->
       <template v-if="isOne2One">
-        <van-collapse-item
-          :name="collapseNameKey+'0'"
-          :is-link="false"
-        >
+        <van-collapse-item :name="collapseNameKey + '0'" :is-link="false">
           <template #title>
-            <div class="van-cell table-cell ">
+            <div class="van-cell table-cell">
               <div class="van-cell__title">
                 {{ field.label }}
               </div>
@@ -16,7 +13,7 @@
           </template>
           <!--子表字段-->
           <ibps-dynamic-form-table-block
-            v-for="(column,j) in columns"
+            v-for="(column, j) in columns"
             :ref="'formItem'"
             :key="j"
             :models.sync="dataModel[i]"
@@ -31,37 +28,56 @@
             :readonly-rights="readonlyRights"
             :params="params"
             @update-form-data="updateFormData"
+            @onEvent="(e) => onEvent(e, dataModel[i], i)"
           />
         </van-collapse-item>
       </template>
       <!--一对多-->
       <template v-else>
         <van-collapse-item
-          v-for="(data,i) in dataModel"
+          v-for="(data, i) in dataModel"
           :key="i"
-          :name="collapseNameKey+i"
-          :test="collapseNameKey+i"
+          :class="'tr' + i"
+          :name="collapseNameKey + i"
+          :test="collapseNameKey + i"
         >
           <template #title>
             <div class="col-title">
               <div class="van-cell__title">
-                <i v-if="required" class="van-cell--required" /><van-tag v-if="dataModel.length !== 1" round type="primary">{{ i+1 }}</van-tag> {{ field.label }}
+                <i v-if="required" class="van-cell--required" /><van-tag
+                  v-if="dataModel.length !== 1"
+                  round
+                  type="primary"
+                  >{{ i + 1 }}</van-tag
+                >
+                {{ field.label }}
               </div>
               <div class="van-cell__value" @click.stop="stopClick">
                 <!-- <template v-for="(button,b) in toolbarButtons ">
                   <template v-if="!(button.key === 'remove' && mode==='block' && dataModel.length===1) "> -->
-                <template v-for="(button,b) in (getShowBtn().length<=num?getShowBtn():getShowBtn().slice(0,num-1)) ">
+                <template
+                  v-for="(button, b) in getShowBtn().length <= num
+                    ? getShowBtn()
+                    : getShowBtn().slice(0, num - 1)"
+                >
                   <template>
                     <!-- 工具栏-->
                     <van-tag
-                      :key="i+'-'+b"
+                      :key="i + '-' + b"
                       size="medium"
                       class="ibps-mr-5"
-                      :color="button.type | optionsFilter(colorOptions,'color','type')"
-                      :text-color="button.type | optionsFilter(colorOptions,'textColor','type')"
-                      @click="handleActionEvent(button,i)"
+                      :color="
+                        button.type
+                          | optionsFilter(colorOptions, 'color', 'type')
+                      "
+                      :text-color="
+                        button.type
+                          | optionsFilter(colorOptions, 'textColor', 'type')
+                      "
+                      @click="handleActionEvent(button, i)"
+                    >
+                      {{ button.label }}</van-tag
                     >
-                      {{ button.label }}</van-tag>
                     <!-- <van-button
                       :key="b"
                       :type="button.type"
@@ -74,28 +90,44 @@
                     </van-button> -->
                   </template>
                 </template>
-                <template v-if="getShowBtn().length >num">
+                <template v-if="getShowBtn().length > num">
                   <template>
                     <van-tag
-                      :key="'tag'+i"
+                      :key="'tag' + i"
                       size="medium"
                       class="ibps-mr-5"
-                      :color="'danger' | optionsFilter(colorOptions,'color','type')"
-                      :text-color="'danger' | optionsFilter(colorOptions,'textColor','type')"
+                      :color="
+                        'danger' | optionsFilter(colorOptions, 'color', 'type')
+                      "
+                      :text-color="
+                        'danger'
+                          | optionsFilter(colorOptions, 'textColor', 'type')
+                      "
                       @click="toggleBtn(i)"
                     >
-                      更多<van-icon :name="toggle!==field.id+''+i ? 'arrow-down': 'arrow-up'" /></van-tag>
+                      更多<van-icon
+                        :name="
+                          toggle !== field.id + '' + i
+                            ? 'arrow-down'
+                            : 'arrow-up'
+                        "
+                    /></van-tag>
                   </template>
                 </template>
                 <!-- todo -->
-                <div v-if="getShowBtn().length >num && toggle===field.id+''+i" v-clickoutside="outFn">
+                <div
+                  v-if="
+                    getShowBtn().length > num && toggle === field.id + '' + i
+                  "
+                  v-clickoutside="outFn"
+                >
                   <div class="btn-pop-top" />
                   <div class="btn-pop">
                     <div
-                      v-for="(button,b) in getShowBtn().slice(num-1) "
-                      :key="button.key+b"
+                      v-for="(button, b) in getShowBtn().slice(num - 1)"
+                      :key="button.key + b"
                       class="btn-pop-text"
-                      @click.stop="handleActionEvent(button,i)"
+                      @click.stop="handleActionEvent(button, i)"
                     >
                       {{ button.label }}
                     </div>
@@ -105,17 +137,24 @@
             </div>
           </template>
           <template #right-icon>
-            <div class="expand">{{ activeCollapseNames.includes(collapseNameKey+i) ? '收起': '展开' }}</div>
+            <div class="expand">
+              {{
+                activeCollapseNames.includes(collapseNameKey + i)
+                  ? '收起'
+                  : '展开'
+              }}
+            </div>
           </template>
           <!--子表字段-->
           <ibps-dynamic-form-table-block
-            v-for="(column,j) in columns"
+            v-for="(column, j) in columns"
             :ref="'formItem'"
-            :key="i+j"
+            :key="i + j"
             :models.sync="dataModel[i]"
             :rights.sync="columnsRights"
             :form-data="formData"
             :row="i"
+            :row-el-class="'tr' + i"
             :field="column"
             :desc-position="descPosition"
             :main-code="mainCode"
@@ -123,68 +162,111 @@
             :mode="mode"
             :readonly-rights="readonlyRights"
             :params="params"
+            @onEvent="(e) => onEvent(e, dataModel[i], i)"
             @update-form-data="updateFormData"
           />
         </van-collapse-item>
-        <template v-if="dataModel.length === 0">
+        <!-- 修复部分值为null代码报错问题 -->
+        <template v-if="!dataModel || dataModel.length === 0">
           <van-field
             ref="input"
             v-model="inputValue"
             :required="required"
-            :rules="tableReadonly?null:rules"
+            :rules="tableReadonly ? null : rules"
             class="table-field"
           >
             <template #input>
               <van-collapse-item
-                :name="collapseNameKey+'0'"
-                :test="collapseNameKey+'0'"
-                style="width: 100%;"
+                :name="collapseNameKey + '0'"
+                :test="collapseNameKey + '0'"
+                style="width: 100%"
                 :is-link="false"
               >
                 <template #title>
                   <div class="col-title">
                     <div class="van-cell__title">
-                      <i v-if="required" class="van-cell--required" /> {{ field.label }}
+                      <i v-if="required" class="van-cell--required" />
+                      {{ field.label }}
                     </div>
                     <div class="van-cell__value">
-                      <template v-for="(button,j) in (getShowBtnByRemove().length<=num?getShowBtnByRemove():getShowBtnByRemove().slice(0,num-1)) ">
+                      <template
+                        v-for="(button, j) in getShowBtnByRemove().length <= num
+                          ? getShowBtnByRemove()
+                          : getShowBtnByRemove().slice(0, num - 1)"
+                      >
                         <van-tag
                           :key="j"
                           size="medium"
                           class="ibps-mr-5"
-                          :color="button.type | optionsFilter(colorOptions,'color','type')"
-                          :text-color="button.type | optionsFilter(colorOptions,'textColor','type')"
-                          @click.stop="handleActionEvent(button,j)"
+                          :color="
+                            button.type
+                              | optionsFilter(colorOptions, 'color', 'type')
+                          "
+                          :text-color="
+                            button.type
+                              | optionsFilter(colorOptions, 'textColor', 'type')
+                          "
+                          @click.stop="handleActionEvent(button, j)"
+                        >
+                          {{ button.label }}</van-tag
                         >
-                          {{ button.label }}</van-tag>
                       </template>
-                      <template v-if="getShowBtnByRemove().length >num">
+                      <template v-if="getShowBtnByRemove().length > num">
                         <template>
                           <van-tag
                             size="medium"
                             class="ibps-mr-5"
-                            :color="'danger' | optionsFilter(colorOptions,'color','type')"
-                            :text-color="'danger' | optionsFilter(colorOptions,'textColor','type')"
+                            :color="
+                              'danger'
+                                | optionsFilter(colorOptions, 'color', 'type')
+                            "
+                            :text-color="
+                              'danger'
+                                | optionsFilter(
+                                  colorOptions,
+                                  'textColor',
+                                  'type'
+                                )
+                            "
                             @click.stop="toggleBtn('o')"
                           >
-                            更多<van-icon :name="toggle!==field.id+'o' ? 'arrow-down': 'arrow-up'" /></van-tag>
+                            更多<van-icon
+                              :name="
+                                toggle !== field.id + 'o'
+                                  ? 'arrow-down'
+                                  : 'arrow-up'
+                              "
+                          /></van-tag>
                         </template>
                       </template>
-                      <div v-if="getShowBtnByRemove().length >num && toggle===field.id+'o'" v-clickoutside="outFn" @click.stop="stopClick">
+                      <div
+                        v-if="
+                          getShowBtnByRemove().length > num &&
+                          toggle === field.id + 'o'
+                        "
+                        v-clickoutside="outFn"
+                        @click.stop="stopClick"
+                      >
                         <div class="btn-pop-top" />
                         <div class="btn-pop">
-                          <div
-                            v-if="button.key!='import'&&button.key!='export'"
-                            v-for="(button,j) in getShowBtnByRemove().slice(num-1) "
-                            :key="button.key+j"
-                            class="btn-pop-text"
-                            @click.stop="handleActionEvent(button)"
+                          <template
+                            v-if="
+                              button.key != 'import' && button.key != 'export'
+                            "
                           >
-                            {{ button.label }}
-                          </div>
+                            <div
+                              v-for="(button, j) in getShowBtnByRemove().slice(
+                                num - 1
+                              )"
+                              :key="button.key + j"
+                              class="btn-pop-text"
+                              @click.stop="handleActionEvent(button)"
+                            >
+                              {{ button.label }}
+                            </div>
+                          </template>
                         </div>
                       </div>
-
                     </div>
                   </div>
                 </template>
@@ -193,7 +275,6 @@
                 </template> -->
               </van-collapse-item>
             </template>
-
           </van-field>
         </template>
       </template>
@@ -218,16 +299,15 @@
 
       <div class="ibps-fixed-navbar">
         <ibps-dynamic-form-item
-          v-for="(column) in columns"
+          v-for="column in columns"
           ref="dialogForm"
           :key="column.name"
           v-model="dialogData[column.name]"
           :field="column"
           :data="dialogFormData"
-
           :rights="rights[column.name]"
           :params="params"
-
+          @onEvent="(e) => $emit('onEvent', e)"
           @cinput="handleDialogInput($event)"
         />
       </div>
@@ -252,7 +332,7 @@ const JForm = window.JForm
 // import JForm from '../utils/JForm'// 自定义脚本
 const COLLAPSE_NAME_KEY = 'table_'
 export default {
-  name: 'form-table',
+  name: 'FormTable',
   directives: { clickoutside },
   props: {
     value: [Array, Object, String], // 值
@@ -264,7 +344,8 @@ export default {
     rights: {
       type: [String, Object]
     },
-    readonlyRights: { // 只读
+    readonlyRights: {
+      // 只读
       type: Boolean,
       default: false
     },
@@ -294,16 +375,6 @@ export default {
     descPosition: String
   },
   data() {
-    // const activeCollapseNames = []
-    // let val = []
-    // if (this.$utils.isNotEmpty(this.value)) {
-    //   console.log('this.value==>', JSON.parse(JSON.stringify(this.value)))
-    //   val = this.value || []
-    //   this.value.forEach((e, i) => {
-    //     activeCollapseNames.push(COLLAPSE_NAME_KEY + i)
-    //   })
-    // }
-
     return {
       activeCollapseNames: [],
       collapseNameKey: COLLAPSE_NAME_KEY,
@@ -344,7 +415,8 @@ export default {
     },
     fieldOptions() {
       const fieldOptions = this.field.field_options || {}
-      fieldOptions.default_value_type = fieldOptions.default_value_type || 'fixed'
+      fieldOptions.default_value_type =
+        fieldOptions.default_value_type || 'fixed'
       return fieldOptions
     },
 
@@ -357,7 +429,8 @@ export default {
     mode() {
       return this.field.field_options.mode || 'inner'
     },
-    dialogMode() { // 弹窗模式
+    dialogMode() {
+      // 弹窗模式
       return false
       // TODO 弹窗模式有bug 暂时屏蔽
       // this.tableMode === 'dialog'
@@ -393,7 +466,7 @@ export default {
         fields.forEach((field) => {
           if (FormOptions.t.NESTED_FIELD_TYPES.includes(field.field_type)) {
             const columns = field.field_options.columns
-            columns.forEach(child => {
+            columns.forEach((child) => {
               traverse(child.fields)
             })
           } else {
@@ -409,7 +482,7 @@ export default {
     buttons() {
       const buttons = this.field.field_options.buttons || []
       const bs = []
-      buttons.forEach(button => {
+      buttons.forEach((button) => {
         const b = JSON.parse(JSON.stringify(button))
         b.key = button.type
         b.type = button.style
@@ -420,7 +493,9 @@ export default {
       return bs
     },
     tableReadonly() {
-      return this.readonlyRights ? true : this.tableRights === FormOptions.t.PERMISSIONS.READ
+      return this.readonlyRights
+        ? true
+        : this.tableRights === FormOptions.t.PERMISSIONS.READ
     },
     tableHidden() {
       return this.tableRights === FormOptions.t.PERMISSIONS.HIDE
@@ -436,14 +511,19 @@ export default {
     value: {
       deep: true,
       immediate: true,
-      handler(val, oldVal) {
+      handler(val) {
         this.dataModel = val
+        val &&
+          val.forEach &&
+          val.forEach((t, i) => {
+            this.activeCollapseNames.push(COLLAPSE_NAME_KEY + i)
+          })
         this.inputValue = this.$utils.isNotEmpty(val) ? JSON.stringify(val) : ''
       }
     },
     dataModel: {
       deep: true,
-      handler(val, oldVal) {
+      handler(val) {
         this.$emit('update:value', val)
       }
     },
@@ -459,8 +539,13 @@ export default {
     // 字段权限
     fieldRights: {
       handler(fieldRights) {
-        if (this.$utils.isNotEmpty(fieldRights) && this.$utils.isPlainObject(fieldRights)) {
-          this.tableRights = this.getRealRights(fieldRights['rights'] || FormOptions.t.PERMISSIONS.EDIT)
+        if (
+          this.$utils.isNotEmpty(fieldRights) &&
+          this.$utils.isPlainObject(fieldRights)
+        ) {
+          this.tableRights = this.getRealRights(
+            fieldRights['rights'] || FormOptions.t.PERMISSIONS.EDIT
+          )
           this.columnsRights = this.getColumnsRights(fieldRights['columns'])
           this.buttonsRights = this.getButtonsRights(fieldRights['buttons'])
         } else {
@@ -487,6 +572,11 @@ export default {
     })
   },
   methods: {
+    onEvent(e, row, i) {
+      e.row = row
+      e.colName = i
+      this.$emit('onEvent', e)
+    },
     /**
      * 获取本地缓存
      */
@@ -516,28 +606,40 @@ export default {
       this.toggle = ''
       this._setItem(this.toggle)
     },
-    stopClick() {
-    },
+    stopClick() {},
     /**
      * 获取需要显示的这样按钮
      */
     getShowBtn() {
       if (!this.toolbarButtons) return []
-      return this.toolbarButtons.filter(el => !(el.key === 'remove' && this.mode === 'block' && this.dataModel.length === 1))
+      return this.toolbarButtons.filter(
+        (el) =>
+          !(
+            el.key === 'remove' &&
+            this.mode === 'block' &&
+            this.dataModel.length === 1
+          )
+      )
     },
     getShowBtnByRemove() {
       if (!this.toolbarButtons) return []
-      return this.toolbarButtons.filter(el => el.key !== 'remove')
+      return this.toolbarButtons.filter((el) => el.key !== 'remove')
     },
-    columnHidden(column) { // 是否隐藏
-      return this.columnsRights[column.name] === FormOptions.t.PERMISSIONS.HIDE || column.field_type === 'hidden'
+    columnHidden(column) {
+      // 是否隐藏
+      return (
+        this.columnsRights[column.name] === FormOptions.t.PERMISSIONS.HIDE ||
+        column.field_type === 'hidden'
+      )
     },
     /**
      * 获取真实的权限
      */
     getRealRights(rights) {
       if (this.readonlyRights) {
-        return rights === FormOptions.t.PERMISSIONS.HIDE ? rights : FormOptions.t.PERMISSIONS.READ
+        return rights === FormOptions.t.PERMISSIONS.HIDE
+          ? rights
+          : FormOptions.t.PERMISSIONS.READ
       } else {
         return rights
       }
@@ -545,8 +647,10 @@ export default {
     getColumnsRights(rights = {}) {
       const columnsRights = {}
       if (this.nameColumns && this.nameColumns.length > 0) {
-        this.nameColumns.forEach(column => {
-          columnsRights[column.name] = this.getRealRights(rights[column.name] || FormUtil.getDefaultRigths(column))
+        this.nameColumns.forEach((column) => {
+          columnsRights[column.name] = this.getRealRights(
+            rights[column.name] || FormUtil.getDefaultRigths(column)
+          )
         })
       }
       return columnsRights
@@ -555,7 +659,7 @@ export default {
       if (this.$utils.isEmpty(rights)) {
         const buttonsRights = {}
         if (this.$utils.isNotEmpty(this.buttons)) {
-          this.buttons.forEach(button => {
+          this.buttons.forEach((button) => {
             buttonsRights[button.key] = FormOptions.t.PERMISSIONS.SHOW
           })
         }
@@ -572,16 +676,20 @@ export default {
     handleSelectionChange(selection) {
       this.multipleSelection = selection
     },
-    handleRowClick(row, event, column) {
+    handleRowClick(row) {
       this.$refs.elTable.toggleRowSelection(row)
     },
     filterButtons(position) {
       if (this.tableReadonly) return
       const bs = []
-      this.buttons.forEach(button => {
-        if (hasPermission(button.key, position) && // 有位置权限
-        (!button.position || button.position === 'all' || button.position === position) &&// 有位置权限
-        (this.$utils.isEmpty(this.buttonsRights[button.key]) || this.buttonsRights[button.key] !== FormOptions.t.PERMISSIONS.HIDE) // 有按钮权限
+      this.buttons.forEach((button) => {
+        if (
+          hasPermission(button.key, position) && // 有位置权限
+          (!button.position ||
+            button.position === 'all' ||
+            button.position === position) && // 有位置权限
+          (this.$utils.isEmpty(this.buttonsRights[button.key]) ||
+            this.buttonsRights[button.key] !== FormOptions.t.PERMISSIONS.HIDE) // 有按钮权限
         ) {
           const b = JSON.parse(JSON.stringify(button))
           b.position = position
@@ -593,7 +701,8 @@ export default {
     handleActionEvent(button, index) {
       // 起始下标
       // const index = (this.currentPage - 1) * this.pageSize + buttonIndex
-      this.actionCode = button.key === 'custom' ? button.code || button.key + index : button.key
+      this.actionCode =
+        button.key === 'custom' ? button.code || button.key + index : button.key
       this.actionPosition = button.position || 'toolbar'
       this.actionButton = button
       // 前置事件
@@ -662,27 +771,29 @@ export default {
       this.afterScript('add', 'toolbar')
     },
     // 复制已有数据
-    handleCopyData (button, index) {
-      const position = button.position
+    handleCopyData(button, index) {
+      // const position = button.position
       const selection = this.getSelection('block', index)
-      console.log(button, index,selection)
-      ActionUtils.selectedMultiRecord(selection).then((ids) => {
-        selection.forEach(i => {
-          const obj = this.dataModel[i]
-          delete obj.$index
-          delete obj.id
-          this.dataModel.push(obj)
+      console.log(button, index, selection)
+      ActionUtils.selectedMultiRecord(selection)
+        .then((ids) => {
+          selection.forEach((i) => {
+            const obj = this.dataModel[i]
+            delete obj.$index
+            delete obj.id
+            this.dataModel.push(obj)
+          })
+          // 初始化运行公式计算
+          this.initRunCalFormula(this.dataModel.length - 1)
+          // 后置事件
+          this.afterScript(this.actionCode, this.actionPosition)
+          if (this.$refs.elTable) {
+            this.$refs.elTable.doLayout()
+          }
         })
-        // 初始化运行公式计算
-        this.initRunCalFormula(this.dataModel.length - 1)
-        // 后置事件
-        this.afterScript(this.actionCode, this.actionPosition)
-        if (this.$refs.elTable) {
-          this.$refs.elTable.doLayout()
-        }
-      }).catch(() => {})
+        .catch(() => {})
     },
-    getSelection (position, index) {
+    getSelection(position, index) {
       const selection = []
       if (position === 'toolbar' && this.mode !== 'block') {
         if (this.multipleSelection && this.multipleSelection.length > 0) {
@@ -702,30 +813,37 @@ export default {
       }
       const position = button.position
 
-      this.$dialog.confirm({
-        title: '提示',
-        message: '确定删除?'
-      }).then(() => {
-        this.dataModel.splice(index, 1)
-        // TODO: 处理折叠面板
+      this.$dialog
+        .confirm({
+          title: '提示',
+          message: '确定删除?'
+        })
+        .then(() => {
+          this.dataModel.splice(index, 1)
+          // TODO: 处理折叠面板
 
-        // 后置事件
-        this.afterScript('remove', position, {
-          selection: [index],
-          index: index
+          // 后置事件
+          this.afterScript('remove', position, {
+            selection: [index],
+            index: index
+          })
         })
-      })
     },
     // 初始化运行公式计算
     initRunCalFormula(row) {
       // 不需要字段的进行公式计算 比如获取但其当前时间,随机数
-      FormUtil.runCalFormula(this, this.formula[FormUtil.NOT_NEED_FIELD], this.mainCode, row)
-    },
-    handleImport () {
+      FormUtil.runCalFormula(
+        this,
+        this.formula[FormUtil.NOT_NEED_FIELD],
+        this.mainCode,
+        row
+      )
+    },
+    handleImport() {
       this.importTableDialogVisible = true
     },
     // 导出
-    handleExport (button, index) {
+    handleExport(button, index) {
       const position = button.position
       const selection = this.getSelection(position, index)
       if (selection.length > 0) {
@@ -737,32 +855,32 @@ export default {
     /**
      * 导出数据
      */
-    exportData (ids) {
-      const columnMap = {}
-      const columns = []
-      this.nameColumns.forEach((column) => {
-        if (!this.columnHidden(column)) {
-          columns.push(column)
-        }
-        columnMap[column.name] = column
-      })
-      const exportData = JSON.parse(JSON.stringify(this.dataModel))
-      const data = ids
-        ? exportData.filter((d, i) => {
-          return ids.includes(i)
-        })
-        : exportData
+    exportData(ids) {
+      // const columnMap = {}
+      // const columns = []
+      // this.nameColumns.forEach((column) => {
+      //   if (!this.columnHidden(column)) {
+      //     columns.push(column)
+      //   }
+      //   columnMap[column.name] = column
+      // })
+      // const exportData = JSON.parse(JSON.stringify(this.dataModel))
+      // const data = ids
+      //   ? exportData.filter((d, i) => {
+      //     return ids.includes(i)
+      //   })
+      //   : exportData
       // TODO: 需要格式化展示的数据
-      this.convertExportData(data, columnMap).then((data) => {
-        IbpsExport.excel({
-          columns: columns,
-          data: data,
-          nameKey: 'name',
-          title: this.field.label
-        }).then(() => {
-          ActionUtils.success('导出成功')
-        })
-      })
+      // this.convertExportData(data, columnMap).then((data) => {
+      //   IbpsExport.excel({
+      //     columns: columns,
+      //     data: data,
+      //     nameKey: 'name',
+      //     title: this.field.label
+      //   }).then(() => {
+      //     ActionUtils.success('导出成功')
+      //   })
+      // })
     },
     // =====================对话框模式数据处理=====================
 
@@ -849,15 +967,16 @@ export default {
         }
         return
       }
-      const action = button.key === 'custom' ? (button.code || button.code + index) : button.key
+      const action =
+        button.key === 'custom'
+          ? button.code || button.code + index
+          : button.key
       const params = {
         button: button,
         index: index
       }
       if (!callback) {
-        callback = () => {
-
-        }
+        callback = () => {}
       }
       JForm._beforeSubButton(this, action, button.position, params, callback)
     },
@@ -876,9 +995,7 @@ export default {
       }
       params.button = this.getButtonByKey(action)
       if (!callback) {
-        callback = () => {
-
-        }
+        callback = () => {}
       }
       JForm._afterSubButton(this, action, position, params, callback)
     },
@@ -916,21 +1033,27 @@ export default {
 
     // ======表单验证============
     getEl() {
-      if (!this.$refs.formItem) { return }
+      if (!this.$refs.formItem) {
+        return
+      }
       const $validate = []
-      this.$refs.formItem.forEach(el => {
+      this.$refs.formItem.forEach((el) => {
         $validate.push(el)
       })
       return $validate
     },
     getFormValidator() {
-      if (!this.$refs.formItem) { return }
+      if (!this.$refs.formItem) {
+        return
+      }
       const $validate = []
-      this.$refs.formItem.forEach(el => {
+      this.$refs.formItem.forEach((el) => {
         const v = new Promise((resolve, reject) => {
-          el.getFormValidator().validate().then((result) => {
-            resolve(result)
-          })
+          el.getFormValidator()
+            .validate()
+            .then((result) => {
+              resolve(result)
+            })
         })
         $validate.push(v)
       })
@@ -939,67 +1062,77 @@ export default {
   }
 }
 </script>
-<style lang="scss">
-  .ibps-table-wrapper{
-    // padding: 10px 0;
-    // background-color: #f2efef;
-    .btn-pop,.btn-pop-top{
-      position: absolute;
-      z-index: 1000;
-      top: 34px;
-    }
-    .btn-pop{
-      background: #4C4C4C;
-      color:  #FFFFFF;
-      border-radius: 4px;
-      text-align: left;
-      padding-left: 14px;
-      right: 4px;
-      min-width: 120px;
-      .btn-pop-text{
-        padding: 12px 0;
-        border-bottom: 1px solid rgba(229,229,229,0.3);
-      }
-    }
-    .btn-pop-top{
-      border: 6px solid transparent;
-      border-bottom-color: #4C4C4C;
-      top: 22px;
-      right: 18px;
-    }
-    .van-cell,.van-cell__value{
-      overflow: visible;
-    }
-    .table-field{
-      padding:0 ;
-    }
-    .table-cell-icon{
-      display: flex;
-      align-items: center;
-    }
-    .expand {
-      color: #1989fa;
-      cursor: pointer;
+<style lang="scss" scoped>
+.ibps-table-wrapper {
+  // padding: 10px 0;
+  // background-color: #f2efef;
+  .btn-pop,
+  .btn-pop-top {
+    position: absolute;
+    z-index: 1000;
+    top: 34px;
+  }
+  .btn-pop {
+    background: #4c4c4c;
+    color: #ffffff;
+    border-radius: 4px;
+    text-align: left;
+    padding-left: 14px;
+    right: 4px;
+    min-width: 120px;
+    .btn-pop-text {
+      padding: 12px 0;
+      border-bottom: 1px solid rgba(229, 229, 229, 0.3);
     }
-
-    // .van-collapse-item__title {
-    //   padding:0 ;
-    //   background-color: #f8f8f8;
-    //   .table-cell{
-    //     background-color: #f8f8f8;
-    //     // padding-right: 0;
-    //   }
-    //   .van-cell__title{
-    //     font-size: 12px;
-    //     color: #999;
-    //   }
-    //     .van-cell__right-icon{
-    //       margin-top: 8px;
-    //     }
-    // }
-    // .van-collapse-item__content{
-    //   padding:0
-    // }
-
   }
+  .btn-pop-top {
+    border: 6px solid transparent;
+    border-bottom-color: #4c4c4c;
+    top: 22px;
+    right: 18px;
+  }
+  .van-cell,
+  .van-cell__value {
+    overflow: visible;
+  }
+  .table-field {
+    padding: 0;
+  }
+  .table-cell-icon {
+    display: flex;
+    align-items: center;
+  }
+  .expand {
+    color: #1989fa;
+    cursor: pointer;
+  }
+  ::v-deep .van-field {
+    padding-left: 0 !important;
+    padding-right: 0 !important;
+  }
+  ::v-deep .van-cell--required::before {
+    left: -8px !important;
+  }
+  // ::v-deep .van-field__control {
+  //   min-height: 36px;
+  // }
+  // .van-collapse-item__title {
+  //   padding:0 ;
+  //   background-color: #f8f8f8;
+  //   .table-cell{
+  //     background-color: #f8f8f8;
+  //     // padding-right: 0;
+  //   }
+  //   .van-cell__title{
+  //     font-size: 12px;
+  //     color: #999;
+  //   }
+  //     .van-cell__right-icon{
+  //       margin-top: 8px;
+  //     }
+  // }
+  // .van-collapse-item__content{
+  //   padding:0
+  // }
+}
 </style>

+ 67 - 19
src/business/platform/form/dynamic-form/form.vue

@@ -11,9 +11,9 @@
       <ibps-dynamic-form-grid
         v-if="
           field.field_type === 'grid' ||
-            field.field_type === 'tabs' ||
-            field.field_type === 'steps' ||
-            field.field_type === 'collapse'
+          field.field_type === 'tabs' ||
+          field.field_type === 'steps' ||
+          field.field_type === 'collapse'
         "
         :key="field.name + index"
         ref="formItem"
@@ -26,11 +26,12 @@
         :params="formParams"
         :readonly-rights="readonlyRights"
         @change-form-opinion="handleFormOpinion"
+        v-on="$listeners"
       />
       <ibps-dynamic-form-item
         v-else
         ref="formItem"
-        :key="field.name + index"
+        :key="field.name + index + 1"
         :models.sync="models"
         :rights.sync="rights"
         :field="field"
@@ -40,6 +41,7 @@
         :params="formParams"
         :readonly-rights="readonlyRights"
         @change-form-opinion="handleFormOpinion"
+        v-on="$listeners"
       />
     </template>
   </van-form>
@@ -100,7 +102,8 @@ export default {
       border: false,
       init: false,
       tabs: 'tabs_0',
-      steps: 'steps_0'
+      steps: 'steps_0',
+      generlateParams: false
     }
   },
   computed: {
@@ -111,14 +114,27 @@ export default {
       return !!(this.formAttrs && this.formAttrs.colon)
     },
     labelWidth() {
-      if (
-        this.$utils.isNotEmpty(this.formAttrs.labelWidth) &&
-        this.$utils.isNotEmpty(this.formAttrs.labelWidthUnit)
-      ) {
-        return this.formAttrs.labelWidth + this.formAttrs.labelWidthUnit
+      // console.log('this.formAttrs===>', this.formAttrs)
+      if (this.formAttrs.same) {
+        if (
+          this.$utils.isNotEmpty(this.formAttrs.labelWidth) &&
+          this.$utils.isNotEmpty(this.formAttrs.labelWidthUnit)
+        ) {
+          return this.formAttrs.labelWidth + this.formAttrs.labelWidthUnit
+        }
       } else {
-        return '100px'
+        // 优先移动端配置
+        if (
+          this.$utils.isNotEmpty(this.formAttrs.mobileLabelWidth) &&
+          this.$utils.isNotEmpty(this.formAttrs.mobileLabelWidthUnit)
+        ) {
+          return (
+            this.formAttrs.mobileLabelWidth +
+            this.formAttrs.mobileLabelWidthUnit
+          )
+        }
       }
+      return '100px'
     },
     labelPosition() {
       return this.$utils.isNotEmpty(this.formAttrs.mobileLabelPosition)
@@ -170,14 +186,17 @@ export default {
   },
   watch: {
     formDef: {
-      handler(val) {
-        this.initResponseFields()
+      async handler(val) {
+        this.generlateParams = false
+        await this.initResponseFields()
+        this.generlateParams = true
       },
       deep: true,
       immediate: true
     },
     models: {
       handler(val) {
+        // console.log(22222222222222222222222222222222)
         // 延迟验证
         this.$nextTick(() => {
           this.getFormValidator()
@@ -196,7 +215,6 @@ export default {
   },
   mounted() {
     // 初始化脚本
-    console.log(this, 'thisthis')
     this.$nextTick(() => {
       if (this.validateImmediately) {
         this.getFormValidator()
@@ -237,11 +255,12 @@ export default {
             this.$utils.isNotEmpty(fieldOptions.columns)
           ) {
             // 循环遍历所有字段
-            fieldOptions.columns.forEach(item => {
+            fieldOptions.columns.forEach((item) => {
               this.generateModles(item.fields)
             })
           }
         } else if (fieldType === 'table') {
+          console.log('this.value --->', this.value, fieldOptions, fieldName)
           // 子表单
           const data = this.value ? this.value[fieldName] : []
           if (fieldOptions.mode === 'block') {
@@ -349,6 +368,32 @@ export default {
      *  初始化表单权限
      */
     initFormRights(field) {
+      /**
+       * {
+            "mjsbwhbyjlzby": {
+              "buttons": {
+                "add": "s",
+                "remove": "s"
+              },
+              "columns": {
+                "bianZhiShiJian": "h",
+                "shiFouKaiJi": "e",
+                "guanJiShiJian": "e",
+                "parentId": "h",
+                "weiHuZhuangTai": "e",
+                "qianMing": "e",
+                "bianZhiRen": "h",
+                "id": "h",
+                "weiHuXiangMu": "e",
+                "kaiJiShiJian": "e",
+                "bianZhiBuMen": "h",
+                "weiHuRiQi": "e",
+                "yiQiQingLi": "r"
+              },
+              "rights": "e"
+            }
+          }
+       */
       this.rights[field.name] =
         this.getPermissions(this.permissions, field) ||
         FormUtils.getDefaultRigths(field)
@@ -361,9 +406,8 @@ export default {
       const fieldType = field.field_type
       const name = field.name
       let rightsValue = null
-      const isNonInputField = FormOptions.t.NON_INPUT_FIELD_TYPES.includes(
-        fieldType
-      )
+      const isNonInputField =
+        FormOptions.t.NON_INPUT_FIELD_TYPES.includes(fieldType)
       let isSpecial = false
       if (isNonInputField && permissions.fields) {
         // 非输入字段
@@ -375,6 +419,7 @@ export default {
           : null
       } else if (fieldType === 'table' && permissions.tables) {
         // 子表
+        console.log(' permissions.tables===>', permissions.tables)
         isSpecial = true
         rightsValue = permissions.tables[name] ? permissions.tables[name] : null
       } else {
@@ -396,6 +441,7 @@ export default {
     },
     // 初始化需要进行公式计算的字段
     initResponseFormula(item) {
+      // console.log('this.responseFormula--->',item, this.responseFormula)
       FormUtils.setResponseFormula(this.responseFormula, item, this.code)
     },
     // 初始化运行公式计算
@@ -487,6 +533,7 @@ export default {
      */
     getFormData() {
       const data = {}
+      console.log('this.models[key]===>', this.models)
       // 去除文本字段,表单意见字段
       for (var key in this.models) {
         if (
@@ -502,7 +549,8 @@ export default {
      * 设置表单字段数据
      */
     setFieldData(name, value) {
-      this.models[name] = value
+      // this.models[name] = value
+      this.$set(this.models, name, value)
     },
     /**
      * 设置表单权限