Z 1 year ago
parent
commit
b3e5e5ab80

+ 18 - 3
lib/vue-form-making/src/components/Container.vue

@@ -154,6 +154,7 @@
             </div>
 
             <slot name="action">
+
             </slot>
 
             <el-button v-if="upload" type="text" size="default" @click="handleUpload"><i class="fm-iconfont icon-daoru" style="font-size: 16px; font-weight: 600; margin: 5px;" />{{$t('fm.actions.import')}}</el-button>
@@ -163,7 +164,6 @@
             <el-button v-if="generateCode" type="text" size="default"  @click="handleGenerateCode"><i class="fm-iconfont icon-daimakuai" style="font-size: 16px; font-weight: 600; margin: 5px;" />{{$t('fm.actions.code')}}</el-button>
           </el-header>
           <el-main :class="{'widget-empty': widgetForm.list.length == 0}">
-
             <widget-form v-if="!resetJson"  ref="widgetForm" :data="widgetForm" :select.sync="widgetFormSelect" :platform="platform" :form-key="formKey"></widget-form>
           </el-main>
         </el-container>
@@ -696,8 +696,23 @@ export default {
       this.blank = val
     },
     handleField (item) {
-      console.log(item)
-      EventBus.$emit('on-field-add-' + this.formKey, item)
+      if (item.type=='takeLeaveDate'){
+        item.components.forEach((i,index) => {
+          let nameObj = {
+            0:'开始时间',
+            1:'结束时间',
+            2:'天数',
+          }
+          i.name=nameObj[index]
+          setTimeout(()=>{
+            EventBus.$emit('on-field-add-' + this.formKey, i)
+          })
+
+        })
+      }else {
+        EventBus.$emit('on-field-add-' + this.formKey, item)
+      }
+
     },
     handleUndo () {
       if (this.undo) {

+ 30 - 30
lib/vue-form-making/src/components/GenerateElementItem.vue

@@ -246,36 +246,36 @@
         </el-date-picker>
       </template>
     </template>
-    <template v-if="widget.type=='takeLeaveDate'">
-      <template v-if="printRead">
-        {{
-          widget.options.type == 'dates' ?
-            dataModel?.join('、') :
-            typeof dataModel == 'object' ? dataModel.join(' ~ ') : dataModel
-        }}
-      </template>
-      <template v-else>
-        <el-date-picker
-          v-model="dataModel"
-          :type="widget.options.type"
-          :placeholder="widget.options.placeholder"
-          :start-placeholder="widget.options.startPlaceholder"
-          :end-placeholder="widget.options.endPlaceholder"
-          :readonly="widget.options.readonly"
-          :disabled="elementDisabled"
-          :editable="widget.options.editable"
-          :clearable="widget.options.clearable"
-          :value-format="widget.options.timestamp ? 'timestamp' : widget.options.format"
-          :format="widget.options.format"
-          :style="{width: isTable ? '100%' : widget.options.width}"
-          :ref="'fm-'+widget.model"
-          @focus="handleOnFocus"
-          @blur="handleOnBlur"
-          v-bind="{...widget.options.customProps, ...extendProps}"
-        >
-        </el-date-picker>
-      </template>
-    </template>
+<!--    <template v-if="widget.type=='takeLeaveDate'">-->
+<!--      <template v-if="printRead">-->
+<!--        {{-->
+<!--          widget.options.type == 'dates' ?-->
+<!--            dataModel?.join('、') :-->
+<!--            typeof dataModel == 'object' ? dataModel.join(' ~ ') : dataModel-->
+<!--        }}-->
+<!--      </template>-->
+<!--      <template v-else>-->
+<!--        <el-date-picker-->
+<!--          v-model="dataModel"-->
+<!--          :type="widget.options.type"-->
+<!--          :placeholder="widget.options.placeholder"-->
+<!--          :start-placeholder="widget.options.startPlaceholder"-->
+<!--          :end-placeholder="widget.options.endPlaceholder"-->
+<!--          :readonly="widget.options.readonly"-->
+<!--          :disabled="elementDisabled"-->
+<!--          :editable="widget.options.editable"-->
+<!--          :clearable="widget.options.clearable"-->
+<!--          :value-format="widget.options.timestamp ? 'timestamp' : widget.options.format"-->
+<!--          :format="widget.options.format"-->
+<!--          :style="{width: isTable ? '100%' : widget.options.width}"-->
+<!--          :ref="'fm-'+widget.model"-->
+<!--          @focus="handleOnFocus"-->
+<!--          @blur="handleOnBlur"-->
+<!--          v-bind="{...widget.options.customProps, ...extendProps}"-->
+<!--        >-->
+<!--        </el-date-picker>-->
+<!--      </template>-->
+<!--    </template>-->
 
     <template v-if="widget.type =='rate'">
       <template v-if="printRead">

+ 49 - 48
lib/vue-form-making/src/components/WidgetElementItem.vue

@@ -108,54 +108,55 @@
       >
       </el-date-picker>
     </template>
-    <template v-if="element.type == 'takeLeaveDate'">
-      <el-date-picker
-        :key="elementKey"
-        v-model="element.options.defaultValue"
-        :type="element.options.type"
-        :is-range="element.options.isRange"
-        :placeholder="element.options.placeholder"
-        :start-placeholder="element.options.startPlaceholder"
-        :end-placeholder="element.options.endPlaceholder"
-        :readonly="element.options.readonly"
-        :disabled="elementDisabled"
-        :editable="element.options.editable"
-        :clearable="element.options.clearable"
-        :value-format="element.options.timestamp ? 'timestamp' : element.options.format"
-        :format="element.options.format"
-        :style="{width: isTable ? '100%' : element.options.width}"
-        v-bind="{...element.options.customProps, ...extendProps}"
-      >
-      </el-date-picker>
-       <el-date-picker
-         :key="elementKey"
-         v-model="element.options.defaultValue"
-         :type="element.options.type"
-         :is-range="element.options.isRange"
-         :placeholder="element.options.placeholder"
-         :start-placeholder="element.options.startPlaceholder"
-         :end-placeholder="element.options.endPlaceholder"
-         :readonly="element.options.readonly"
-         :disabled="elementDisabled"
-         :editable="element.options.editable"
-         :clearable="element.options.clearable"
-         :value-format="element.options.timestamp ? 'timestamp' : element.options.format"
-         :format="element.options.format"
-         :style="{width: isTable ? '100%' : element.options.width}"
-         v-bind="{...element.options.customProps, ...extendProps}"
-       >
-      </el-date-picker>
-       <el-input type="textarea" :rows="element.options.rows"
-                 v-model="element.options.defaultValue"
-                 :style="{width: isTable ? '100%' : element.options.width}"
-                 :disabled="elementDisabled"
-                 :placeholder="element.options.placeholder"
-                 :maxlength="element.options.maxlength"
-                 :show-word-limit="element.options.showWordLimit"
-                 :autosize="element.options.autosize"
-                 v-bind="{...element.options.customProps, ...extendProps}"
-       ></el-input>
-    </template>
+<!--    <template v-if="element.type == 'takeLeaveDate'">-->
+
+<!--      <el-date-picker-->
+<!--        :key="elementKey"-->
+<!--        v-model="element['components'][0].options.defaultValue"-->
+<!--        :type="element['components'][0].options.type"-->
+<!--        :is-range="element['components'][0].options.isRange"-->
+<!--        :placeholder="element['components'][0].options.placeholder"-->
+<!--        :start-placeholder="element['components'][0].options.startPlaceholder"-->
+<!--        :end-placeholder="element['components'][0].options.endPlaceholder"-->
+<!--        :readonly="element['components'][0].options.readonly"-->
+<!--        :disabled="elementDisabled"-->
+<!--        :editable="element['components'][0].options.editable"-->
+<!--        :clearable="element['components'][0].options.clearable"-->
+<!--        :value-format="element['components'][0].options.timestamp ? 'timestamp' : element['components'][0].options.format"-->
+<!--        :format="element['components'][0].options.format"-->
+<!--        :style="{width: isTable ? '100%' : element['components'][0].options.width}"-->
+<!--        v-bind="{...element['components'][0].options.customProps, ...extendProps}"-->
+<!--      >-->
+<!--      </el-date-picker>-->
+<!--       <el-date-picker-->
+<!--         :key="elementKey"-->
+<!--         v-model="element.options.defaultValue"-->
+<!--         :type="element.options.type"-->
+<!--         :is-range="element.options.isRange"-->
+<!--         :placeholder="element.options.placeholder"-->
+<!--         :start-placeholder="element.options.startPlaceholder"-->
+<!--         :end-placeholder="element.options.endPlaceholder"-->
+<!--         :readonly="element.options.readonly"-->
+<!--         :disabled="elementDisabled"-->
+<!--         :editable="element.options.editable"-->
+<!--         :clearable="element.options.clearable"-->
+<!--         :value-format="element.options.timestamp ? 'timestamp' : element.options.format"-->
+<!--         :format="element.options.format"-->
+<!--         :style="{width: isTable ? '100%' : element.options.width}"-->
+<!--         v-bind="{...element.options.customProps, ...extendProps}"-->
+<!--       >-->
+<!--      </el-date-picker>-->
+<!--       <el-input type="textarea" :rows="element.options.rows"-->
+<!--                 v-model="element.options.defaultValue"-->
+<!--                 :style="{width: isTable ? '100%' : element.options.width}"-->
+<!--                 :disabled="elementDisabled"-->
+<!--                 :placeholder="element.options.placeholder"-->
+<!--                 :maxlength="element.options.maxlength"-->
+<!--                 :show-word-limit="element.options.showWordLimit"-->
+<!--                 :autosize="element.options.autosize"-->
+<!--                 v-bind="{...element.options.customProps, ...extendProps}"-->
+<!--       ></el-input>-->
+<!--    </template>-->
 
     <template v-if="element.type == 'rate'">
       <el-rate v-model="element.options.defaultValue"

+ 58 - 54
lib/vue-form-making/src/components/WidgetForm.vue

@@ -2,9 +2,9 @@
   <div class="widget-form-container"
     :class="`${platform}`"
   >
-    <el-form  
-      :size="formSize" 
-      :label-position="data.config.labelPosition" 
+    <el-form
+      :size="formSize"
+      :label-position="data.config.labelPosition"
       :label-width="data.config.labelWidth + 'px'"
       :class="{
         [data.config && data.config.customClass]:  (data.config && data.config.customClass) ? true : false,
@@ -13,10 +13,10 @@
       :label-suffix="data.config?.labelSuffix ? ' : ' : ' '"
     >
       <div v-if="data.list.length == 0" class="form-empty">{{$t('fm.description.containerEmpty')}}</div>
-     
+
       <el-scrollbar style="overflow: hidden;" wrap-class="widget-form-wrapper">
-        <draggable class="widget-form-draggable" 
-          v-model="data.list" 
+        <draggable class="widget-form-draggable"
+          v-model="data.list"
           v-bind="{group:'people', ghostClass: 'ghost',animation: 200, handle: '.drag-widget'}"
           @add="handleWidgetAdd"
           @update="handleWidgetUpdate"
@@ -27,14 +27,13 @@
           <transition-group name="fade" tag="div" class="widget-form-list" >
 
             <template v-for="(element, index) in data.list" v-if="element && element.key">
-
               <widget-table
                 v-if="element.type === 'table'"
                 :key="element.key"
                 :element="element"
-                :select.sync="selectWidget" 
+                :select.sync="selectWidget"
                 :index="index" :data="data"
-                @select-change="handleSelectChange" 
+                @select-change="handleSelectChange"
                 :platform="platform"
                 :form-key="formKey"
               >
@@ -44,9 +43,9 @@
                 v-else-if="element.type === 'tabs'"
                 :key="element.key"
                 :element="element"
-                :select.sync="selectWidget" 
+                :select.sync="selectWidget"
                 :index="index" :data="data"
-                @select-change="handleSelectChange"  
+                @select-change="handleSelectChange"
                 :platform="platform"
                 :form-key="formKey"
               >
@@ -56,10 +55,10 @@
                 v-else-if="element.type === 'collapse'"
                 :key="element.key"
                 :element="element"
-                :select.sync="selectWidget" 
-                :index="index" 
+                :select.sync="selectWidget"
+                :index="index"
                 :data="data"
-                @select-change="handleSelectChange"  
+                @select-change="handleSelectChange"
                 :platform="platform"
                 :form-key="formKey"
               >
@@ -69,10 +68,10 @@
                 v-else-if="element.type === 'report'"
                 :key="element.key"
                 :element="element"
-                :select.sync="selectWidget" 
+                :select.sync="selectWidget"
                 :index="index" :data="data"
-                @select-change="handleSelectChange" 
-                :platform="platform" 
+                @select-change="handleSelectChange"
+                :platform="platform"
                 :form-key="formKey"
               >
               </widget-report>
@@ -81,10 +80,10 @@
                 v-else-if="element.type === 'inline'"
                 :key="element.key"
                 :element="element"
-                :select.sync="selectWidget" 
+                :select.sync="selectWidget"
                 :index="index" :data="data"
-                @select-change="handleSelectChange" 
-                :platform="platform" 
+                @select-change="handleSelectChange"
+                :platform="platform"
                 :form-key="formKey"
               >
               </widget-inline>
@@ -93,11 +92,11 @@
                 v-else-if="element.type === 'subform'"
                 :key="element.key"
                 :element="element"
-                :select.sync="selectWidget" 
+                :select.sync="selectWidget"
                 :index="index"
                 :data="data"
-                @select-change="handleSelectChange" 
-                :platform="platform" 
+                @select-change="handleSelectChange"
+                :platform="platform"
                 :form-key="formKey"
               >
               </widget-sub-form>
@@ -106,11 +105,11 @@
                 v-else-if="element.type === 'group'"
                 :key="element.key"
                 :element="element"
-                :select.sync="selectWidget" 
+                :select.sync="selectWidget"
                 :index="index"
                 :data="data"
-                @select-change="handleSelectChange" 
-                :platform="platform" 
+                @select-change="handleSelectChange"
+                :platform="platform"
                 :form-key="formKey"
               >
               </widget-group>
@@ -119,11 +118,11 @@
                 v-else-if="element.type === 'card'"
                 :key="element.key"
                 :element="element"
-                :select.sync="selectWidget" 
+                :select.sync="selectWidget"
                 :index="index"
                 :data="data"
-                @select-change="handleSelectChange" 
-                :platform="platform" 
+                @select-change="handleSelectChange"
+                :platform="platform"
                 :form-key="formKey"
               >
               </widget-card>
@@ -132,31 +131,31 @@
                 v-else-if="element.type === 'dialog'"
                 :key="element.key"
                 :element="element"
-                :select.sync="selectWidget" 
+                :select.sync="selectWidget"
                 :index="index"
                 :data="data"
-                @select-change="handleSelectChange" 
-                :platform="platform" 
+                @select-change="handleSelectChange"
+                :platform="platform"
                 :form-key="formKey"
               >
               </widget-dialog>
 
-              <widget-form-item 
-                v-else-if="element.type !== 'grid'" 
-                :key="element.key" 
-                :element="element" 
-                :select.sync="selectWidget" 
+              <widget-form-item
+                v-else-if="element.type !== 'grid'"
+                :key="element.key"
+                :element="element"
+                :select.sync="selectWidget"
                 :index="index" :data="data"
-                @select-change="handleSelectChange" 
-                :form-key="formKey" 
+                @select-change="handleSelectChange"
+                :form-key="formKey"
               >
               </widget-form-item>
 
               <widget-col-item
                 v-else
-                :key="element.key" 
-                :element="element" 
-                :select.sync="selectWidget" 
+                :key="element.key"
+                :element="element"
+                :select.sync="selectWidget"
                 :index="index" :data="data"
                 @select-change="handleSelectChange"
                 :platform="platform"
@@ -165,7 +164,7 @@
               </widget-col-item>
             </template>
           </transition-group>
-              
+
         </draggable>
       </el-scrollbar>
     </el-form>
@@ -268,15 +267,15 @@ export default {
   },
   methods: {
     _addWidget (list, widget, isTable = false) {
-      
-      if (isTable 
-        && (widget.type == 'subform' 
-          || widget.type == 'grid' 
-          || widget.type == 'table' 
-          || widget.type == 'tabs' 
-          || widget.type == 'collapse' 
-          || widget.type == 'divider' 
-          || widget.type == 'report' 
+      console.log(list,'=====');
+      if (isTable
+        && (widget.type == 'subform'
+          || widget.type == 'grid'
+          || widget.type == 'table'
+          || widget.type == 'tabs'
+          || widget.type == 'collapse'
+          || widget.type == 'divider'
+          || widget.type == 'report'
           || widget.type == 'inline'
           || widget.type == 'dialog'
           || widget.type == 'card'
@@ -360,6 +359,11 @@ export default {
                 return 'table'
               }
             }
+            if (item.type === '"takeLeaveDate"') {
+              if ('table' == this._addWidget(item.list, widget, true)) {
+                return 'table'
+              }
+            }
           }
         }
       } else {
@@ -384,12 +388,12 @@ export default {
       this.$nextTick(() => {         EventBus.$emit('on-history-add-' + this.formKey)       })
     },
     handleWidgetAdd (evt) {
-      
+
       const newIndex = evt.newIndex
       const to = evt.to
 
       this.$set(this.data.list, newIndex, _.cloneDeep(this.data.list[newIndex]))
-      
+
       //为拖拽到容器的元素添加唯一 key
       const key = Math.random().toString(36).slice(-8)
       this.$set(this.data.list, newIndex, {

+ 116 - 36
lib/vue-form-making/src/components/componentsConfig.js

@@ -387,42 +387,122 @@ export const basicComponents = [
       onBlur: ''
     }
   },
-  {
-    type: 'takeLeaveDate',
-    icon: 'icon-date',
-    // options: {
-    //   defaultValue: '',
-    //   readonly: false,
-    //   disabled: false,
-    //   editable: false,
-    //   clearable: true,
-    //   placeholder: '',
-    //   startPlaceholder: '',
-    //   endPlaceholder: '',
-    //   type: 'datetime',
-    //   format: 'yyyy-MM-dd HH:mm:ss',
-    //   timestamp: false,
-    //   required: false,
-    //   requiredMessage: '',
-    //   validatorCheck: false,
-    //   validator: '',
-    //   width: '100%',
-    //   customClass: '',
-    //   labelWidth: 80,
-    //   isLabelWidth: false,
-    //   hidden: false,
-    //   dataBind: true,
-    //   customProps: {},
-    //   tip: '',
-    //   extendProps: {}
-    // },
-    // events: {
-    //   onMounted: '',
-    //   onChange: '',
-    //   onFocus: '',
-    //   onBlur: ''
-    // }
-  },
+  // {
+  //   type: 'takeLeaveDate',
+  //   icon: 'icon-date',
+  //   components:[
+  //     {
+  //       type: 'dateTime',
+  //       icon: 'icon-date',
+  //       options: {
+  //         defaultValue: '',
+  //         readonly: false,
+  //         disabled: false,
+  //         editable: false,
+  //         clearable: true,
+  //         placeholder: '',
+  //         startPlaceholder: '',
+  //         endPlaceholder: '',
+  //         type: 'dateTime',
+  //         format: 'yyyy-MM-dd HH:mm:ss',
+  //         timestamp: false,
+  //         required: false,
+  //         requiredMessage: '',
+  //         validatorCheck: false,
+  //         validator: '',
+  //         width: '100%',
+  //         customClass: '',
+  //         labelWidth: 80,
+  //         isLabelWidth: false,
+  //         hidden: false,
+  //         dataBind: true,
+  //         customProps: {},
+  //         tip: '',
+  //         extendProps: {}
+  //       },
+  //       events: {
+  //         onMounted: '',
+  //         onChange: '',
+  //         onFocus: '',
+  //         onBlur: ''
+  //       }
+  //     },
+  //     {
+  //       type: 'dateTime',
+  //       icon: 'icon-date',
+  //       options: {
+  //         defaultValue: '',
+  //         readonly: false,
+  //         disabled: false,
+  //         editable: false,
+  //         clearable: true,
+  //         placeholder: '',
+  //         startPlaceholder: '',
+  //         endPlaceholder: '',
+  //         type: 'dateTime',
+  //         format: 'yyyy-MM-dd HH:mm:ss',
+  //         timestamp: false,
+  //         required: false,
+  //         requiredMessage: '',
+  //         validatorCheck: false,
+  //         validator: '',
+  //         width: '100%',
+  //         customClass: '',
+  //         labelWidth: 80,
+  //         isLabelWidth: false,
+  //         hidden: false,
+  //         dataBind: true,
+  //         customProps: {},
+  //         tip: '',
+  //         extendProps: {}
+  //       },
+  //       events: {
+  //         onMounted: '',
+  //         onChange: '',
+  //         onFocus: '',
+  //         onBlur: ''
+  //       }
+  //     },
+  //     {
+  //       type: 'input',
+  //       icon: 'icon-input',
+  //       options: {
+  //         width: '100%',
+  //         defaultValue: '',
+  //         required: false,
+  //         requiredMessage: '',
+  //         dataType: '',
+  //         dataTypeCheck: false,
+  //         dataTypeMessage: '',
+  //         pattern: '',
+  //         patternCheck: false,
+  //         patternMessage: '',
+  //         validatorCheck: false,
+  //         validator: '',
+  //         placeholder: '',
+  //         customClass: '',
+  //         disabled: false,
+  //         labelWidth: 80,
+  //         isLabelWidth: false,
+  //         hidden: false,
+  //         dataBind: true,
+  //         showPassword: false,
+  //         clearable: false,
+  //         maxlength: '',
+  //         showWordLimit: false,
+  //         customProps: {},
+  //         tip: '',
+  //         extendProps: {}
+  //       },
+  //       events: {
+  //         onMounted: '',
+  //         onChange: '',
+  //         onFocus: '',
+  //         onBlur: ''
+  //       }
+  //     },
+  //   ]
+  // },
   {
     type: 'date',
     icon: 'icon-date',

BIN
public/images/json00.png


+ 11 - 1
src/views/bpm/formConfig/addOrEditDialog.vue

@@ -29,7 +29,8 @@
               style="height: 700px"
               generate-json
               preview
-
+              upload
+              :json-templates="jsonTemplates"
               @ready="handleFormReady"
             >
             </fm-making-form>
@@ -120,6 +121,7 @@ import Parser from "@/components/FormGenerator/components/parser";
 import {EleIconPicker} from 'ele-admin';
 import svgIconPicker from "@/components/svg-icon-picker/index.vue";
 import {getModelPage} from "@/api/bpm/model";
+import json1 from "./json1";
 
 
 export default {
@@ -135,6 +137,14 @@ export default {
     return {
       configFormDialogFlag: false,
       produceTree: [],
+      jsonTemplates:[
+        {
+          title: '日期-开始日期 结束日期 天数',
+          enTitle: 'Typical form',
+          json: json1,
+          url: 'images/json00.png'
+        },
+      ],
       form: {
         name: '',
         dictType: '',

+ 201 - 0
src/views/bpm/formConfig/json1.js

@@ -0,0 +1,201 @@
+export default {
+  "list": [
+    {
+      "type": "date",
+      "icon": "icon-date",
+      "options": {
+        "defaultValue": "",
+        "readonly": false,
+        "disabled": false,
+        "editable": false,
+        "clearable": true,
+        "placeholder": "",
+        "startPlaceholder": "",
+        "endPlaceholder": "",
+        "type": "datetime",
+        "format": "yyyy-MM-dd HH:mm:ss",
+        "timestamp": false,
+        "required": true,
+        "requiredMessage": "请输入开始时间",
+        "validatorCheck": true,
+        "validator": "if(value>this.getValue('date_7d58ae3l')&&this.getValue('date_7d58ae3l')){\ncallback(new Error('开始时间不能晚于结束时间'))\n}else if(!value){\ncallback(new Error('请输入开始时间'))\n} else{\ncallback()\n\n}",
+        "width": "100%",
+        "customClass": "",
+        "labelWidth": 80,
+        "isLabelWidth": false,
+        "hidden": false,
+        "dataBind": true,
+        "customProps": {},
+        "tip": "",
+        "extendProps": {},
+        "remoteFunc": "func_zrblmvzi",
+        "remoteOption": "option_zrblmvzi"
+      },
+      "events": {
+        "onMounted": "",
+        "onChange": "mo9px6jc",
+        "onFocus": "",
+        "onBlur": ""
+      },
+      "name": "开始时间",
+      "key": "zrblmvzi",
+      "model": "date_zrblmvzi",
+      "rules": [
+        {
+          "required": true,
+          "message": "请输入开始时间"
+        },
+        {
+          "func": "if(value>this.getValue('date_7d58ae3l')&&this.getValue('date_7d58ae3l')){\ncallback(new Error('开始时间不能晚于结束时间'))\n}else if(!value){\ncallback(new Error('请输入开始时间'))\n} else{\ncallback()\n\n}"
+        }
+      ]
+    },
+    {
+      "type": "date",
+      "icon": "icon-date",
+      "options": {
+        "defaultValue": "",
+        "readonly": false,
+        "disabled": false,
+        "editable": false,
+        "clearable": true,
+        "placeholder": "",
+        "startPlaceholder": "",
+        "endPlaceholder": "",
+        "type": "datetime",
+        "format": "yyyy-MM-dd HH:mm:ss",
+        "timestamp": false,
+        "required": true,
+        "requiredMessage": "请输入结束时间",
+        "validatorCheck": true,
+        "validator": "if(value<this.getValue('date_zrblmvzi')&&this.getValue('date_zrblmvzi')){\ncallback(new Error('结束时间不能早于开始时间'))\n}else if(!value){\ncallback(new Error('请输入结束时间'))\n} else{\ncallback()\n\n}",
+        "width": "100%",
+        "customClass": "",
+        "labelWidth": 100,
+        "isLabelWidth": true,
+        "hidden": false,
+        "dataBind": true,
+        "customProps": {},
+        "tip": "",
+        "extendProps": {},
+        "remoteFunc": "func_zrblmvzi",
+        "remoteOption": "option_zrblmvzi"
+      },
+      "events": {
+        "onMounted": "",
+        "onChange": "mo9px6jc",
+        "onFocus": "",
+        "onBlur": ""
+      },
+      "name": "结束时间",
+      "key": "7d58ae3l",
+      "model": "date_7d58ae3l",
+      "rules": [
+        {
+          "required": true,
+          "message": "请输入结束时间"
+        },
+        {
+          "func": "if(value<this.getValue('date_zrblmvzi')&&this.getValue('date_zrblmvzi')){\ncallback(new Error('结束时间不能早于开始时间'))\n}else if(!value){\ncallback(new Error('请输入结束时间'))\n} else{\ncallback()\n\n}"
+        }
+      ]
+    },
+    {
+      "type": "input",
+      "icon": "icon-input",
+      "options": {
+        "width": "",
+        "defaultValue": "",
+        "required": false,
+        "requiredMessage": "",
+        "dataType": "",
+        "dataTypeCheck": false,
+        "dataTypeMessage": "",
+        "pattern": "",
+        "patternCheck": false,
+        "patternMessage": "",
+        "validatorCheck": false,
+        "validator": "",
+        "placeholder": "",
+        "customClass": "",
+        "disabled": true,
+        "labelWidth": 80,
+        "isLabelWidth": false,
+        "hidden": false,
+        "dataBind": true,
+        "showPassword": false,
+        "clearable": false,
+        "maxlength": "",
+        "showWordLimit": false,
+        "customProps": {},
+        "tip": "",
+        "extendProps": {},
+        "remoteFunc": "func_cp3ryncd",
+        "remoteOption": "option_cp3ryncd",
+        "hideLabel": false,
+        "labelWrap": false
+      },
+      "events": {
+        "onMounted": "",
+        "onChange": "",
+        "onFocus": "",
+        "onBlur": ""
+      },
+      "name": "时长",
+      "key": "cp3ryncd",
+      "model": "input_cp3ryncd",
+      "rules": []
+    },
+  ],
+  "config": {
+    "labelWidth": 100,
+    "labelPosition": "right",
+    "size": "default",
+    "customClass": "",
+    "ui": "element",
+    "layout": "horizontal",
+    "width": "100%",
+    "hideLabel": false,
+    "hideErrorMessage": false,
+    "eventScript": [
+      {
+        "key": "mounted",
+        "name": "mounted",
+        "func": ""
+      },
+      {
+        "key": "refresh",
+        "name": "refresh",
+        "func": ""
+      },
+      {
+        "key": "onFormChange",
+        "name": "onFormChange",
+        "type": "rule"
+      },
+      {
+        "key": "v9i5mxvq",
+        "name": "onChange_v9i5mxvq",
+        "func": "",
+        "type": "rule",
+        "rules": []
+      },
+      {
+        "key": "mo9px6jc",
+        "name": "onChange_mo9px6jc",
+        "func": "",
+        "type": "rule",
+        "rules": [
+          {
+            "key": "cuhctt4s",
+            "action": "js",
+            "options": {
+              "func": "if( this.getValue(\"date_zrblmvzi\")&& this.getValue(\"date_7d58ae3l\")){\r\n  let time = (new Date(this.getValue(\"date_7d58ae3l\")).getTime()  - new Date(this.getValue(\"date_zrblmvzi\")).getTime()  )/(1000 * 3600)\r\n  let day = (time)/24\r\n  let hours = (time)%24\r\n  let msg = ''\r\n  if(day >= 1){ \r\n   msg = day.toFixed(0)+'天'\r\n  }\r\n  if(hours!=0){\r\n  msg = msg + hours.toFixed(0)+'小时'\r\n  }\r\n this.setData({'input_cp3ryncd':msg})\r\n}"
+            }
+          }
+        ]
+      }
+    ],
+    "labelSuffix": true
+  }
+}