From 432b788acf901b0720184b8ee8bc81a2e6fa47e0 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期二, 28 九月 2021 18:22:02 +0800
Subject: [PATCH] 2021-09-28

---
 src/tabviews/zshare/mutilform/index.jsx | 1638 ++++++++++++++++++----------------------------------------
 1 files changed, 514 insertions(+), 1,124 deletions(-)

diff --git a/src/tabviews/zshare/mutilform/index.jsx b/src/tabviews/zshare/mutilform/index.jsx
index ba0cddb..184bddf 100644
--- a/src/tabviews/zshare/mutilform/index.jsx
+++ b/src/tabviews/zshare/mutilform/index.jsx
@@ -1,7 +1,7 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { fromJS } from 'immutable'
-import { Form, Row, Col, Input, InputNumber, Select, DatePicker, notification, Checkbox, Radio, Tooltip, Icon } from 'antd'
+import { Form, Row, Col, notification, Tooltip, Icon } from 'antd'
 import moment from 'moment'
 
 import Api from '@/api'
@@ -9,16 +9,21 @@
 import { formRule } from '@/utils/option.js'
 import Utils from '@/utils/utils.js'
 import asyncComponent from '@/utils/asyncComponent'
+import MKEmitter from '@/utils/events.js'
+import MKInput from './mkInput'
+import MKNumberInput from './mkNumberInput'
+import MKSelect from './mkSelect'
 import './index.scss'
 
-const { MonthPicker } = DatePicker
-const { TextArea } = Input
-
-const CheckCard = asyncComponent(() => import('./checkCard'))
-const CustomSwitch = asyncComponent(() => import('./customSwitch'))
-const FileUpload = asyncComponent(() => import('../fileupload'))
-const ColorSketch = asyncComponent(() => import('@/mob/colorsketch'))
-const Editor = asyncComponent(() => import('@/components/editor'))
+const MKCheckCard = asyncComponent(() => import('./mkCheckCard'))
+const MKSwitch = asyncComponent(() => import('./mkSwitch'))
+const MKCheckbox = asyncComponent(() => import('./mkCheckbox'))
+const MKRadio = asyncComponent(() => import('./mkRadio'))
+const MKDatePicker = asyncComponent(() => import('./mkDatePicker'))
+const MKTextArea = asyncComponent(() => import('./mkTextArea'))
+const MKFileUpload = asyncComponent(() => import('../fileupload'))
+const MKColor = asyncComponent(() => import('./mkColor'))
+const MKEditor = asyncComponent(() => import('@/components/editor'))
 
 class MainSearch extends Component {
   static propTpyes = {
@@ -32,196 +37,25 @@
   }
 
   state = {
-    cols: 2,         // 鏄剧ず涓哄灏戝垪
-    datatype: null,  // 鏁版嵁绫诲瀷
-    readtype: null,  // 鏄惁鍙
-    readin: null,    // 琛屾暟鎹槸鍚﹀啓鍏�
-    writein: null,   // 鎵ц鏃舵槸鍚﹀~鍏ラ粯璁ql
-    fieldlen: null,  // 瀛楁闀垮害
     formlist: [],    // 琛ㄥ崟椤�
-    encrypts: [],    // 鍔犲瘑瀛楁
-    intercepts: [],  // 鎴彇瀛楁
-    record: {}       // 璁板綍涓嬫媺琛ㄥ崟鍏宠仈瀛楁锛岀敤浜庢暟鎹啓鍏�
   }
 
-  UNSAFE_componentWillMount () {
-    let cols = 2
-    if (this.props.action.setting && this.props.action.setting.cols) {
-      cols = parseInt(this.props.action.setting.cols)
-      if (cols > 4 || cols < 1) {
-        cols = 2
-      }
-    }
-
-    this.setState({
-      cols: cols
-    })
-  }
+  record = {}
 
   componentDidMount () {
-    const { data, BData } = this.props
-    let action = fromJS(this.props.action).toJS()
-    
-    let datatype = {}
-    let readtype = {}
-    let readin = {}
-    let writein = {}
-    let fieldlen = {}
-    let formlist = []
-    let encrypts = []
-    let intercepts = []
-    let _inputfields = []
-
-    if (action.groups.length > 0) {
-      action.groups.forEach(group => {
-        if (group.sublist.length === 0) return
-
-        if (!group.default) {
-          formlist.push({
-            type: 'title',
-            label: group.label,
-            uuid: group.uuid
-          })
-        }
-
-        formlist.push(...group.sublist)
-      })
-    } else {
-      formlist = action.fields
-    }
+    const { data, BData, action } = this.props
 
     let linkFields = {} // 鍏宠仈鑿滃崟
-    let supItemVal = {} // 涓婄骇鑿滃崟鍒濆鍊�
+    let controlFields = {} // 鎺у埗琛ㄥ崟
     let deForms = []    // 闇�瑕佸姩鎬佽幏鍙栦笅鎷夎彍鍗曠殑琛ㄥ崟
 
-    formlist.forEach(item => {
-      if (item.type === 'text' || item.type === 'number') {              // 鐢ㄤ簬杩囨护涓嬫媺鑿滃崟鍏宠仈琛ㄥ崟
-        _inputfields.push(item.field)
-      } else if (item.type === 'textarea') {
-        _inputfields.push(item.field)
-        if (item.encryption === 'true') {                                // 鍔犲瘑瀛楁
-          encrypts.push(item.field)
-        }
-      } else if (item.type === 'link') {
-        linkFields[item.linkField] = linkFields[item.linkField] || []
-        linkFields[item.linkField].push(item.field)
-      }
-      if (item.interception === 'true') {                                // 瀛楃鎴彇瀛楁
-        intercepts.push(item.field)
-      }
-    })
+    let record = {}
+    let formlist = fromJS(action.fields).toJS()
+    let fieldMap = new Map()
+    let check = action.setting.formType === 'check'
 
-    formlist = formlist.map(item => {
-      if (item.type === 'title') return item
-
-      // 鏁版嵁鑷姩濉厖
-      let _readin = item.readin !== 'false'
-      if (item.type === 'linkMain' || item.type === 'funcvar') {
-        _readin = false
-      }
-
-      let _fieldlen = item.fieldlength || 50
-      if (item.type === 'textarea' || item.type === 'fileupload' || item.type === 'multiselect' || item.type === 'brafteditor') {
-        _fieldlen = item.fieldlength || 512
-      } else if (item.type === 'number') {
-        _fieldlen = item.decimal ? item.decimal : 0
-        item.initval = item.initval || 0
-      }
-
-      datatype[item.field] = item.type
-      readtype[item.field] = item.readonly === 'true'
-      readin[item.field] = _readin
-      writein[item.field] = item.writein !== 'false'
-      fieldlen[item.field] = _fieldlen
-
-      if (item.setAll === 'true' && (item.type === 'select' || item.type === 'link' || item.type === 'radio')) { // 娣诲姞绌哄��
-        item.options.unshift({
-          key: Utils.getuuid(),
-          Value: '',
-          Text: item.emptyText || '绌�',
-          ParentID: ''
-        })
-      }
-
-      item.oriOptions = item.options ? fromJS(item.options).toJS() : null // 淇濆瓨鍒濆鍒楄〃锛岀敤浜庤仈鍔ㄨ彍鍗曟帶鍒�
-
-      // 涓嬬骇琛ㄥ崟鎺у埗-瀛楁鍐欏叆
-      if ((item.type === 'select' || item.type === 'radio') && item.linkSubField && item.linkSubField.length > 0) {
-        item.linkSubField = item.linkSubField.filter(_item => _inputfields.includes(_item))
-      }
-      if (item.linkSubField && item.linkSubField.length === 0) {
-        item.linkSubField = null
-      }
-
-      let newval = ''
-
-      if (item.type === 'linkMain') {
-        newval = BData && BData[item.field] ? BData[item.field] : ''
-      } else if (_readin && !/^date/.test(item.type) && this.props.data && this.props.data.hasOwnProperty(item.field)) {
-        newval = this.props.data[item.field]
-      } else if (item.type === 'date') { // 鏃堕棿鎼滅储
-        if (_readin && this.props.data && this.props.data.hasOwnProperty(item.field)) {
-          newval = this.props.data[item.field]
-        }
-        if (newval) {
-          newval = moment(newval, 'YYYY-MM-DD')
-          newval = newval.format('YYYY-MM-DD') === 'Invalid date' ? '' : newval
-        }
-        if (!newval && item.initval) {
-          newval = moment().subtract(item.initval, 'days')
-        } else if (!newval) {
-          newval = null
-        }
-      } else if (item.type === 'datemonth') {
-        if (_readin && this.props.data && this.props.data.hasOwnProperty(item.field)) {
-          newval = this.props.data[item.field]
-        }
-        if (newval) {
-          newval = moment(newval, 'YYYY-MM')
-          newval = newval.format('YYYY-MM') === 'Invalid date' ? '' : newval
-        }
-        if (!newval && item.initval) {
-          newval = moment().subtract(item.initval, 'month')
-        } else if (!newval) {
-          newval = null
-        }
-      } else if (item.type === 'datetime') {
-        if (_readin && this.props.data && this.props.data.hasOwnProperty(item.field)) {
-          newval = this.props.data[item.field]
-        }
-        if (newval) {
-          newval = moment(newval, 'YYYY-MM-DD HH:mm:ss')
-          newval = newval.format('YYYY-MM-DD HH:mm:ss') === 'Invalid date' ? '' : newval
-        }
-        if (!newval && item.initval) {
-          newval = moment(moment().subtract(item.initval, 'days').format('YYYY-MM-DD') + ' 00:00:00', 'YYYY-MM-DD HH:mm:ss')
-        } else if (!newval) {
-          newval = null
-        }
-      }
-
-      // 鍔犲瘑瀛楁锛岃В瀵嗗鐞�
-      if (item.type === 'textarea' && item.encryption === 'true' && newval !== '') {
-        try {
-          newval = window.decodeURIComponent(window.atob(newval))
-        } catch (e) {
-          console.warn(e)
-        }
-      } else if (item.type === 'switch' && newval !== '') { // 寮�鍏冲彧鎺ユ敹鍥哄畾鍊�
-        if (newval !== item.closeVal && newval !== item.openVal) {
-          newval = ''
-        } else if (newval === item.openVal) {
-          newval = true
-        } else {
-          newval = false
-        }
-      }
-
-      // 璇诲彇琛ㄦ牸鏁版嵁鎴栬鏈夋椂闂寸殑鍒濆鍊�
-      item.initval = newval !== '' ? newval : item.initval
-
-      // 涓嬫媺琛ㄥ崟锛屽瓨鍦ㄤ笂绾ц彍鍗曟椂锛岀敓鎴愭樉绀哄�煎垪琛紝浼樺厛浠ユ暟瀛楀垽鏂�
-      if (item.supvalue) {
+    formlist = formlist.filter(item => {
+      if (item.supField && item.supvalue) { // 澶氬眰琛ㄥ崟鎺у埗
         let supvals = []
         item.supvalue.split(',').forEach(val => {
           supvals.push(val)
@@ -229,83 +63,316 @@
             supvals.push(+val)
           }
         })
-        item.supvalue = supvals
+        controlFields[item.supField] = controlFields[item.supField] || []
+        controlFields[item.supField].push({field: item.field, values: supvals})
+      }
+      if (item.type === 'link') {
+        linkFields[item.linkField] = linkFields[item.linkField] || []
+        linkFields[item.linkField].push({field: item.field, uuid: item.uuid})
+      }
+
+      if (item.type === 'split' || item.type === 'hint') return true
+
+      if (!item.field || !['text', 'number', 'switch', 'select', 'link', 'linkMain', 'funcvar', 'date', 'datemonth', 'datetime', 'radio', 'checkbox', 'checkcard', 'fileupload', 'textarea', 'multiselect', 'brafteditor', 'color'].includes(item.type)) return false
+
+      // 鏁版嵁鑷姩濉厖
+      let readin = item.readin !== 'false'
+      item.readin = item.readin !== 'false' && item.readin !== 'top'
+      item.readonly = check || item.readonly === 'true'
+      item.writein = item.writein !== 'false'
+      item.hidden = item.hidden === 'true'
+      item.fieldlength = item.fieldlength || 50
+
+      if (item.type === 'funcvar') {
+        readin = false
+        item.readin = false
+        item.hidden = true
+      } else if (item.type === 'number') {
+        item.decimal = item.decimal || 0
+        item.fieldlength = item.decimal
+        item.initval = item.initval || 0
+      }
+
+      if (['select', 'link', 'radio', 'checkbox', 'checkcard', 'multiselect'].includes(item.type)) {
+        item.options = item.options || []
+        item.options = item.options.map(cell => {
+          cell.value = cell.Value
+          cell.label = cell.Text
+          return cell
+        })
+        if (item.setAll === 'true' && ['select', 'link', 'radio'].includes(item.type)) { // 娣诲姞绌哄��
+          item.options.unshift({
+            key: Utils.getuuid(),
+            value: '',
+            label: item.emptyText || '绌�',
+            ParentID: ''
+          })
+        }
+        item.oriOptions = fromJS(item.options).toJS()
+      }
+
+      let newval = '$empty'
+
+      if (readin && data && data.hasOwnProperty(item.field)) {
+        newval = data[item.field]
+      }
+      if (item.type === 'linkMain') {
+        newval = BData && BData[item.field] ? BData[item.field] : '$empty'
+      } else if (item.type === 'date') { // 鏃堕棿鎼滅储
+        if (newval !== '$empty') {
+          newval = moment(newval, 'YYYY-MM-DD').format('YYYY-MM-DD')
+          newval = newval === 'Invalid date' ? '$empty' : newval
+        }
+        if (newval === '$empty' && item.initval) {
+          newval = moment().subtract(item.initval, 'days').format('YYYY-MM-DD')
+        }
+      } else if (item.type === 'datemonth') {
+        if (newval !== '$empty') {
+          newval = moment(newval, 'YYYY-MM').format('YYYY-MM')
+          newval = newval === 'Invalid date' ? '$empty' : newval
+        }
+        if (newval === '$empty' && item.initval) {
+          newval = moment().subtract(item.initval, 'month').format('YYYY-MM')
+        }
+      } else if (item.type === 'datetime') {
+        if (newval !== '$empty') {
+          newval = moment(newval, 'YYYY-MM-DD HH:mm:ss').format('YYYY-MM-DD HH:mm:ss')
+          newval = newval === 'Invalid date' ? '$empty' : newval
+        }
+        if (newval === '$empty' && item.initval) {
+          newval = moment().subtract(item.initval, 'days').format('YYYY-MM-DD') + ' 00:00:00'
+        }
+      } else if (item.type === 'switch') { // 寮�鍏冲彧鎺ユ敹鍥哄畾鍊�
+        if (newval !== '$empty' && (newval === item.closeVal || newval === item.openVal)) {
+
+        } else if (item.initval === true) {
+          newval = item.openVal
+        } else {
+          newval = item.closeVal
+        }
+      }
+
+      if (newval !== '$empty') {
+        item.initval = newval
+      } else if (item.initval === undefined) {
+        item.initval = ''
+      }
+
+      if (['select', 'link', 'radio', 'checkbox', 'checkcard', 'multiselect'].includes(item.type) && item.resourceType === '1') {
+        deForms.push(item)
+      }
+
+      if (item.type === 'text') {
+        if (typeof(item.initval) === 'number') {
+          item.initval = item.initval + ''
+        }
+        let _rules = [{
+          pattern: /^[^']*$/ig,
+          message: formRule.input.quotemsg
+        }, {
+          required: item.required === 'true',
+          message: item.label + '涓嶅彲涓虹┖!'
+        }, {
+          max: item.fieldlength,
+          message: formRule.input.formMessage.replace('@max', item.fieldlength)
+        }]
+
+        if (item.regular) {
+          if (item.regular === 'number') {
+            _rules.push({
+              pattern: /^[0-9.-]*$/ig,
+              message: formRule.input.numbermsg
+            })
+          } else if (item.regular === 'letter') {
+            _rules.push({
+              pattern: /^[a-zA-Z]*$/ig,
+              message: formRule.input.lettermsg
+            })
+          } else if (item.regular === 'letter&number') {
+            _rules.push({
+              pattern: /^[a-zA-Z0-9]*$/ig,
+              message: formRule.input.letternummsg
+            })
+          } else if (item.regular === 'phone') {
+            _rules.push({
+              pattern: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/ig,
+              message: '璇锋纭緭鍏ユ墜鏈哄彿'
+            })
+          } else if (item.regular === 'funcname') {
+            _rules.push({
+              pattern: /^[\u4E00-\u9FA50-9a-zA-Z_]*$/ig,
+              message: formRule.input.funcname
+            })
+          }
+        }
+        
+        item.rules = _rules
+      } else if (item.type === 'number') {
+        item.rules = [{
+          required: true,
+          message: item.label + '涓嶅彲涓虹┖!'
+        }, {
+          validator: (rule, value, callback) => this.handleConfirmPassword(rule, value, callback, item)
+        }]
+      } else if (item.type === 'textarea') {
+        let _rules = [
+          {
+            required: item.required === 'true',
+            message: item.label + '涓嶅彲涓虹┖!'
+          },
+          {
+            max: item.fieldlength,
+            message: formRule.input.formMessage.replace('@max', item.fieldlength)
+          }
+        ]
+        if (item.encryption !== 'true') {
+          _rules.push({
+            pattern: /^[^']*$/ig,
+            message: formRule.input.quotemsg
+          })
+        }
+        item.rules = _rules
+      } else if (item.type === 'brafteditor') {
+        item.rules = [
+          {
+            required: item.required === 'true',
+            message: item.label + '涓嶅彲涓虹┖!'
+          },
+          {
+            max: item.fieldlength,
+            message: formRule.input.formMessage.replace('@max', item.fieldlength)
+          }
+        ]
+      } else if (item.type === 'linkMain') {
+        item.rules = [
+          {
+            required: item.required === 'true',
+            message: item.label + '涓嶅彲涓虹┖!'
+          }
+        ]
+      } else {
+        item.rules = [
+          {
+            required: item.required === 'true',
+            message: '璇烽�夋嫨' + item.label + '!'
+          }
+        ]
+      }
+
+      fieldMap.set(item.field, item)
+
+      return true
+    })
+
+    Object.keys(controlFields).forEach(key => {
+      if (!fieldMap.has(key)) return
+
+      let supItem = fieldMap.get(key)
+      let fields = []
+      
+      controlFields[key].forEach(item => {
+        if (!fieldMap.has(item.field)) return
+
+        let cell = fieldMap.get(item.field)
+
+        if (cell.hidden) return
+
+        if (supItem.hidden || !item.values.includes(supItem.initval)) {
+          cell.hidden = true
+          fieldMap.set(item.field, cell)
+        }
+
+        fields.push(item)
+      })
+
+      supItem.controlFields = fields
+      
+      fieldMap.set(key, supItem)
+    })
+
+    formlist = formlist.map(cell => {
+      if (cell.labelwidth) {
+        cell.labelCol = {style: {width: cell.labelwidth + '%'}}
+        cell.wrapperCol = {style: {width: (100 - cell.labelwidth) + '%'}}
+      }
+      if (!cell.field || !fieldMap.has(cell.field)) return cell
+      let item = fieldMap.get(cell.field)
+
+      if (item.type === 'link') {
+        item.supInitVal = ''
+
+        if (fieldMap.has(item.linkField)) {
+          item.supInitVal = fieldMap.get(item.linkField).initval || ''
+        } else if (data && data.hasOwnProperty(item.linkField)) {
+          item.supInitVal = data[item.linkField]
+        }
+        
+        item.options = item.oriOptions.filter(option => option.ParentID === item.supInitVal || option.value === '')
+      }
+
+      if (['select', 'link', 'radio'].includes(item.type) && item.resourceType !== '1') { // 閫変腑绗竴椤�
+        if (typeof(item.initval) === 'string' && item.initval.indexOf('$first') > -1) {
+          item.initval = item.options[0] ? item.options[0].value : ''
+        }
+      }
+
+      if (typeof(item.initval) === 'string' && item.initval.indexOf('$first') > -1) {
+        record[item.field] = ''
+      } else {
+        record[item.field] = item.initval
       }
 
       if (linkFields[item.field]) {
         item.linkFields = linkFields[item.field]
       }
-      supItemVal[item.field] = item.initval
 
-      if (['select', 'link', 'multiselect', 'radio', 'checkbox', 'checkcard'].includes(item.type) && item.resourceType === '1') {
-        deForms.push(item)
-      }
-
-      return item
-    })
-
-    formlist = formlist.map(item => {
-      if (item.type === 'link') {
-        item.supInitVal = ''
-
-        if (supItemVal[item.linkField]) {
-          item.supInitVal = supItemVal[item.linkField]
-        } else if (data && data.hasOwnProperty(item.linkField)) {
-          item.supInitVal = data[item.linkField]
-        }
-        
-        item.options = item.oriOptions.filter(option => option.ParentID === item.supInitVal || option.Value === '')
-      }
-      return item
-    })
-
-    this.setState({
-      readtype: readtype,
-      datatype: datatype,
-      readin: readin,
-      writein: writein,
-      fieldlen: fieldlen,
-      encrypts: encrypts,
-      intercepts: intercepts,
-      formlist: formlist
-    }, () => {
-      if (action.setting && action.setting.focus) {
-        this.selectInput(action.setting.focus, 'init')
-      }
-      // 鐢ㄦ潵鏇存柊state锛岄槻姝㈠彈鎺ц〃鍗曞垵濮嬫椂涓嶆樉绀�
-      this.setState({
-        loaded: true
-      })
-      this.improveActionForm(deForms)
-    })
-  }
-
-  selectInput = (selectId, type) => {
-    try {
-      let _form = document.getElementById('main-form-box')
-      let _inputs = _form.getElementsByTagName('input')
-      _inputs = [..._inputs]
-      _inputs.forEach(input => {
-        if (!input || input.id !== selectId) return
-
-        if (input.className === 'ant-select-search__field' && type !== 'init') {
-          let div = input.parentNode
-          while (div && div.parentNode) {
-            div = div.parentNode
-            if (div.id === selectId) {
-              div && div.click && div.click()
-              div = null
-            }
+      // 涓嬬骇琛ㄥ崟鎺у埗-瀛楁鍐欏叆
+      if ((['select', 'radio', 'link'].includes(item.type) || (item.type === 'checkcard' && item.multiple !== 'true')) && item.linkSubField) {
+        item.subFields = []
+        item.linkSubField.forEach(m => {
+          let n = fieldMap.get(m)
+          if (n && ['text', 'number', 'textarea'].includes(n.type)) {
+            item.subFields.push({
+              uuid: n.uuid,
+              field: m
+            })
           }
-        } else if (input.select) {
-          input.select()
-        } else if (input.focus) {
-          input.focus()
+        })
+
+        if (item.subFields.length === 0) {
+          item.subFields = null
         }
-      })
-    } catch {
-      console.warn('focus error锛�')
-    }
+        item.linkSubField = null
+      }
+
+      if (item.enter === 'tab' || item.enter === 'sub') {
+        if (fieldMap.has(item.tabField)) {
+          item.tabUuid = fieldMap.get(item.tabField).uuid
+        } else {
+          item.tabUuid = item.uuid
+        }
+      }
+      
+      return item
+    })
+
+    this.record = record
+
+    this.setState({ formlist }, () => {
+      if (action.setting && action.setting.focus && fieldMap.has(action.setting.focus)) {
+        setTimeout(() => {
+          MKEmitter.emit('mkFC', 'focus', fieldMap.get(action.setting.focus).uuid)
+        }, 500)
+      }
+
+      if (deForms.length > 0) {
+        if (this.props.menuType !== 'HS' && options.sysType === 'local' && window.GLOB.systemType !== 'production') {
+          this.improveSimpleActionForm(deForms)
+        } else {
+          this.improveActionForm(deForms)
+        }
+      }
+    })
   }
 
   /**
@@ -313,14 +380,6 @@
    */
   improveActionForm = (deForms) => {
     const { BID, menuType } = this.props
-    const { formlist } = this.state
-
-    if (deForms.length === 0) {
-      return
-    } else if (menuType !== 'HS' && options.sysType === 'local' && !window.GLOB.systemType) {
-      this.improveSimpleActionForm(deForms)
-      return
-    }
 
     let deffers = []
     let mainItems = []  // 浜戠鎴栧崟鐐规暟鎹�
@@ -334,7 +393,7 @@
       }
     })
     
-    if (menuType !== 'HS' && window.GLOB.systemType !== 'production') {
+    if (menuType !== 'HS' && options.sysType !== 'local') {
       localItems = [...localItems, ...mainItems]
       mainItems = []
     }
@@ -345,11 +404,8 @@
       LText: localItems.join(' union all '),
       obj_name: '',
       arr_field: '',
-      table_type: 'Y'
-    }
-
-    if (BID) {
-      param.BID = BID
+      table_type: 'Y',
+      BID: BID || ''
     }
 
     if (param.LText) {
@@ -383,11 +439,8 @@
       LText: mainItems.join(' union all '),
       obj_name: '',
       arr_field: '',
-      table_type: 'Y'
-    }
-
-    if (BID) {
-      mainparam.BID = BID
+      table_type: 'Y',
+      BID: BID || ''
     }
 
     if (mainparam.LText) {
@@ -430,48 +483,7 @@
       delete result.message
       delete result.status
 
-      let _formlist = formlist.map(item => {
-        if (['select', 'link', 'multiselect', 'radio', 'checkbox', 'checkcard'].includes(item.type) && result[item.field] && result[item.field].length > 0) {
-          let options = []
-          result[item.field].forEach(cell => {
-            let _cell = { key: Utils.getuuid() }
-
-            if (item.type !== 'checkcard') {
-              _cell.Value = cell[item.valueField]
-              _cell.Text = cell[item.valueText]
-              if ((!_cell.Value && _cell.Value !== 0) || (!_cell.Text && _cell.Text !== 0)) return
-            } else {
-              _cell.$value = cell[item.valueField]
-              _cell = {..._cell, ...cell}
-              if (!_cell.$value && _cell.$value !== 0) return
-            }
-    
-            if (item.type === 'link') {
-              _cell.ParentID = cell[item.linkField] === undefined ? '' : cell[item.linkField]
-            } else if (item.linkSubField) {
-              item.linkSubField.forEach(_field => {
-                _cell[_field] = (cell[_field] || cell[_field] === 0) ? cell[_field] : ''
-              })
-            }
-    
-            options.push(_cell)
-          })
-
-          item.oriOptions = [...item.oriOptions, ...options]
-        }
-        return item
-      })
-
-      this.setState({
-        formlist: _formlist.map(item => {
-          if (item.type === 'link') {
-            item.options = item.oriOptions.filter(option => option.ParentID === item.supInitVal || option.Value === '')
-          } else if (['select', 'multiselect', 'radio', 'checkbox', 'checkcard'].includes(item.type)) {
-            item.options = item.oriOptions
-          }
-          return item
-        })
-      })
+      this.resetFormList(result)
     })
   }
 
@@ -479,18 +491,13 @@
    * @description 娴嬭瘯绯荤粺鑾峰彇涓嬫媺琛ㄥ崟閫夐」淇℃伅
    */
   improveSimpleActionForm = (deForms) => {
-    const { formlist } = this.state
-
     let deffers = deForms.map(form => {
       let param = {
         func: 'sPC_Get_SelectedList',
         LText: form.data_sql,
         obj_name: form.field,
-        arr_field: form.arr_field
-      }
-  
-      if (this.props.BID) {
-        param.BID = this.props.BID
+        arr_field: form.arr_field,
+        BID: this.props.BID || ''
       }
   
       param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
@@ -523,150 +530,61 @@
       delete result.message
       delete result.status
 
-      let _formlist = formlist.map(item => {
-        if (['select', 'link', 'multiselect', 'radio', 'checkbox', 'checkcard'].includes(item.type) && result[item.field] && result[item.field].length > 0) {
-          let options = []
-          result[item.field].forEach(cell => {
-            let _cell = { key: Utils.getuuid() }
-
-            if (item.type !== 'checkcard') {
-              _cell.Value = cell[item.valueField]
-              _cell.Text = cell[item.valueText]
-              if ((!_cell.Value && _cell.Value !== 0) || (!_cell.Text && _cell.Text !== 0)) return
-            } else {
-              _cell.$value = cell[item.valueField]
-              _cell = {..._cell, ...cell}
-              if (!_cell.$value && _cell.$value !== 0) return
-            }
-    
-            if (item.type === 'link') {
-              _cell.ParentID = cell[item.linkField] === undefined ? '' : cell[item.linkField]
-            } else if (item.linkSubField) {
-              item.linkSubField.forEach(_field => {
-                _cell[_field] = (cell[_field] || cell[_field] === 0) ? cell[_field] : ''
-              })
-            }
-    
-            options.push(_cell)
-          })
-
-          item.oriOptions = [...item.oriOptions, ...options]
-        }
-        return item
-      })
-
-      this.setState({
-        formlist: _formlist.map(item => {
-          if (item.type === 'link') {
-            item.options = item.oriOptions.filter(option => option.ParentID === item.supInitVal || option.Value === '')
-          } else if (['select', 'multiselect', 'radio', 'checkbox', 'checkcard'].includes(item.type)) {
-            item.options = item.oriOptions
-          }
-          return item
-        })
-      })
+      this.resetFormList(result)
     })
   }
 
-  resetform = (formlist, supfields, index, fieldsvalue) => {
-    index++
-    let subfields = []
+  resetFormList = (result) => {
+    let _formlist = fromJS(this.state.formlist).toJS().map(item => {
+      if (['select', 'link', 'radio', 'checkbox', 'checkcard', 'multiselect'].includes(item.type) && result[item.field] && result[item.field].length > 0) {
+        let options = []
+        result[item.field].forEach(cell => {
+          let _cell = { key: Utils.getuuid() }
 
-    supfields.forEach(supfield => {
-      formlist = formlist.map(item => {
-        if (item.type === 'link' && item.linkField === supfield.field) {
-          
-          item.options = item.oriOptions.filter(option => option.ParentID === supfield.initval || option.Value === '')
-          item.initval = item.options[0] ? item.options[0].Value : ''
-
-          if (this.props.form.getFieldValue(item.field) !== undefined) {
-            fieldsvalue[item.field] = item.initval
+          if (item.type !== 'checkcard') {
+            _cell.value = cell[item.valueField]
+            _cell.label = cell[item.valueText]
+            if (!_cell.label && _cell.label !== 0) return
+          } else {
+            _cell.$value = cell[item.cardValField]
+            _cell = {..._cell, ...cell}
           }
   
-          subfields.push(item)
+          if (item.type === 'link') {
+            _cell.ParentID = cell[item.linkField] === undefined ? '' : cell[item.linkField]
+          }
+          if (item.subFields) {
+            item.subFields.forEach(m => {
+              _cell[m.field] = cell[m.field] === undefined ? '' : cell[m.field]
+            })
+          }
+
+          if (item.disableField && cell[item.disableField] && /^true$/ig.test(cell[item.disableField])) {
+            _cell.$disabled = true
+          }
+  
+          options.push(_cell)
+        })
+
+        item.oriOptions = [...item.oriOptions, ...options]
+
+        if (item.type === 'link') {
+          item.options = item.oriOptions.filter(option => option.ParentID === item.supInitVal || option.value === '')
+        } else if (['select', 'radio', 'checkbox', 'checkcard', 'multiselect'].includes(item.type)) {
+          item.options = item.oriOptions
         }
-        return item
-      })
-    })
-
-    if (subfields.length === 0 || index > 6) {
-      return {formlist: formlist, fieldsvalue: fieldsvalue}
-    } else {
-      return this.resetform(formlist, subfields, index, fieldsvalue)
-    }
-  }
-
-  selectChange = (_field, value) => {
-    const { record } = this.state
-    let formlist = fromJS(this.state.formlist).toJS()
-    let subfields = []
-    let fieldsvalue = {}
-    let _record = {}
-
-    formlist = formlist.map(item => {
-      if (item.type === 'link' && item.linkField === _field.field) {
-        item.options = item.oriOptions.filter(option => option.ParentID === value || option.Value === '')
-        item.initval = item.options[0] ? item.options[0].Value : ''
-
-        if (this.props.form.getFieldValue(item.field) !== undefined) {
-          fieldsvalue[item.field] = item.initval
-        }
-
-        subfields.push(item)
       }
+
+      if (['select', 'link', 'radio'].includes(item.type) && typeof(item.initval) === 'string' && item.initval.indexOf('$first') > -1) { // 閫変腑绗竴椤�
+        item.initval = item.options[0] ? item.options[0].value : ''
+        this.record[item.field] = item.initval
+      }
+      
       return item
     })
-    
-    // 琛ㄥ崟鍒囨崲鏃讹紝鏇存柊鍏宠仈瀛楁
-    if (_field.linkSubField) {
-      let _data = _field.options.filter(op => op.Value === value)[0]
 
-      if (_data) {
-        _field.linkSubField.forEach(subfield => {
-          if (this.props.form.getFieldValue(subfield) !== undefined) {
-            fieldsvalue[subfield] = (_data[subfield] || _data[subfield] === 0) ? _data[subfield] : ''
-          } else {
-            _record[subfield] = (_data[subfield] || _data[subfield] === 0) ? _data[subfield] : ''
-          }
-        })
-      }
-    }
-
-    if (subfields.length === 0) {
-      if (Object.keys(fieldsvalue).length > 0) {
-        this.props.form.setFieldsValue(fieldsvalue)
-      }
-      if (Object.keys(_record).length > 0) {
-        this.setState({
-          record: {...record, ..._record}
-        })
-      }
-    } else {
-      let result = this.resetform(formlist, subfields, 0, fieldsvalue)
-
-      if (Object.keys(result.fieldsvalue).length > 0) {
-        this.props.form.setFieldsValue(fieldsvalue)
-      }
-
-      let _param = {
-        formlist: result.formlist
-      }
-
-      if (Object.keys(_record).length > 0) {
-        _param.record = {...record, ..._record}
-      }
-
-      this.setState(_param)
-    }
-
-    this.setState({}, () => {
-      if (!_field.enter || _field.enter === 'false') return
-
-      if (_field.enter === 'tab') {
-        this.selectInput(_field.tabField)
-      } else if (_field.enter === 'sub') {
-        this.handleSubmit()
-      }
+    this.setState({
+      formlist: _formlist
     })
   }
 
@@ -683,533 +601,121 @@
     callback()
   }
 
-  handleChange = (e, item) => {
-    let val = e.target.value
+  recordChange = (values, item) => {
+    this.record = {...this.record, ...values}
 
-    if (item.enter === 'false') return
-    if (!val || !/\n/ig.test(val)) return
-    if (item.enter === 'tab') {
-      this.selectInput(item.tabField)
-    } else {
-      this.handleSubmit(e)
-      this.selectInput(item.tabField || item.field)
-    }
-  }
+    if (item && item.controlFields) {
+      let map = new Map()
+      this.state.formlist.forEach(cell => {
+        if (!cell.field) return
+        map.set(cell.field, cell)
+      })
 
-  handleInputSubmit = (e, item) => {
-    if (item.enter === 'false') return
-    if (item.enter === 'tab') {
-      this.selectInput(item.tabField)
-    } else {
-      this.handleSubmit(e)
-      this.selectInput(item.tabField || item.field)
+      let reset = (current) => {
+        let val = this.record[current.field]
+
+        current.controlFields.forEach(cell => {
+          let m = map.get(cell.field)
+          m.hidden = current.hidden || !cell.values.includes(val)
+
+          if (m.hidden) {
+            m.initval = this.record[m.field]
+          }
+
+          map.set(cell.field, m)
+
+          if (m.controlFields) {
+            reset(m)
+          }
+        })
+      }
+
+      reset(item)
+
+      this.setState({
+        formlist: this.state.formlist.map(cell => {
+          if (cell.field) {
+            return map.get(cell.field)
+          }
+          return cell
+        })
+      })
     }
   }
 
   getFields() {
     const { getFieldDecorator } = this.props.form
-    const { cols, formlist } = this.state
+    const { formlist } = this.state
 
     const fields = []
-    let filtration = {}
 
     formlist.forEach((item, index) => {
-      if ((!item.field && item.type !== 'title' && item.type !== 'hint') || item.hidden === 'true' || item.type === 'funcvar') return
-      if (item.supField) { // 澶氬眰琛ㄥ崟鎺у埗
-        let _supVal = this.props.form.getFieldValue(item.supField)
+      if (item.hidden) return
 
-        if (_supVal === undefined && filtration[item.supField]) {
-          _supVal = filtration[item.supField]
-        }
-
-        if (item.supvalue.includes(_supVal)) {
-          let _subVal = this.props.form.getFieldValue(item.field)
-          filtration[item.field] = _subVal === undefined ? item.initval : _subVal
-        } else {
-          return
-        }
-      }
-
-      let _colspan = 24 / cols
-      if (item.entireLine === 'true') {
-        _colspan = 24
-      }
-
-      if (item.type === 'title') {
+      if (item.type === 'split') {
         fields.push(
           <Col span={24} key={index}>
-            <p>{item.label}</p>
+            <p className="mk-form-split-line">{item.label}</p>
           </Col>
         )
       } else if (item.type === 'hint') {
         fields.push(
-          <Col span={24} key={index}>
-            <Form.Item colon={!!item.label} label={item.label || ' '} className="hint">
+          <Col span={item.span || 24} key={index}>
+            <Form.Item className="hint" colon={!!item.label} label={item.label} labelCol={item.labelCol} wrapperCol={item.wrapperCol}>
               <div className="message">{item.message}</div>
             </Form.Item>
           </Col>
         )
-      } else if (item.type === 'text') {
-        let _max = item.fieldlength || 50
-        let _rules = [{
-          pattern: /^[^']*$/ig,
-          message: formRule.input.quotemsg
-        }]
-
-        if (item.regular) {
-          if (item.regular === 'number') {
-            _rules = [{
-              pattern: /^[0-9.-]*$/ig,
-              message: formRule.input.numbermsg
-            }]
-          } else if (item.regular === 'letter') {
-            _rules = [{
-              pattern: /^[a-zA-Z]*$/ig,
-              message: formRule.input.lettermsg
-            }]
-          } else if (item.regular === 'letter&number') {
-            _rules = [{
-              pattern: /^[a-zA-Z0-9]*$/ig,
-              message: formRule.input.letternummsg
-            }]
-          } else if (item.regular === 'funcname') {
-            _rules = [{
-              pattern: /^[\u4E00-\u9FA50-9a-zA-Z_]*$/ig,
-              message: formRule.input.funcname
-            }]
-          }
+      } else {
+        let content = null
+        let className = ''
+        let label = item.tooltip ? <Tooltip placement="topLeft" title={item.tooltip}><Icon type="question-circle" />{item.label}</Tooltip> : item.label
+      
+        if (item.type === 'text' || item.type === 'linkMain') {
+          content = (<MKInput config={item} onChange={(val, defer) => !defer && this.recordChange({[item.field]: val})} onSubmit={this.props.inputSubmit} />)
+        } else if (item.type === 'number') {
+          content = (<MKNumberInput config={item} onChange={(val, defer) => !defer && this.recordChange({[item.field]: val})} onSubmit={this.props.inputSubmit} />)
+        } else if (item.type === 'select' || item.type === 'link' || item.type === 'multiselect') {
+          content = (<MKSelect config={item} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)} onSubmit={this.props.inputSubmit} />)
+        } else if (item.type === 'color') {
+          content = (<MKColor config={item} onChange={(val) => this.recordChange({[item.field]: val})}/>)
+        } else if (item.type === 'checkcard') {
+          className = 'checkcard'
+          content = (<MKCheckCard config={item} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)}/>)
+        } else if (item.type === 'switch') {
+          content = (<MKSwitch config={item} onChange={(val) => this.recordChange({[item.field]: val})}/>)
+        } else if (item.type === 'checkbox') {
+          content = (<MKCheckbox config={item} onChange={(val) => this.recordChange({[item.field]: val})}/>)
+        } else if (item.type === 'radio') {
+          content = (<MKRadio config={item} onChange={(val) => this.recordChange({[item.field]: val}, item)}/>)
+        } else if (item.type === 'date' || item.type === 'datemonth' || item.type === 'datetime') {
+          content = (<MKDatePicker config={item} onChange={(val) => this.recordChange({[item.field]: val})} />)
+        } else if (item.type === 'fileupload') {
+          className = item.readonly ? 'readonly' : ''
+          className += item.fileType === 'picture-card' ? ' file-upload' : ''
+          content = (<MKFileUpload config={item} onChange={(val) => this.recordChange({[item.field]: val})} />)
+        } else if (item.type === 'textarea') {
+          content = (<MKTextArea config={item} onChange={(val, defer) => !defer && this.recordChange({[item.field]: val})}/>)
+        } else if (item.type === 'brafteditor') {
+          content = (<MKEditor config={item} onChange={(val) => this.recordChange({[item.field]: val})}/>)
+          label = item.hidelabel !== 'true' ? label : ''
         }
 
-        fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: item.initval + '',
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.input'] + item.label + '!'
-                  },
-                  {
-                    max: _max,
-                    message: formRule.input.formMessage.replace('@max', _max)
-                  },
-                  ..._rules
-                ]
-              })(<Input placeholder="" autoComplete="off" disabled={item.readonly === 'true'} onChange={(e) => this.handleChange(e, item)} onPressEnter={(e) => this.handleInputSubmit(e, item)} />)}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'number') { // 鏁板瓧
-        let precision = (item.decimal || item.decimal === 0) ? item.decimal : null
+        if (!content) return
 
         fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
+          <Col span={item.span || 24} key={index}>
+            <Form.Item
+              label={label}
+              className={className}
+              extra={item.extra || null}
+              labelCol={item.labelCol}
+              wrapperCol={item.wrapperCol}
+            >
               {getFieldDecorator(item.field, {
                 initialValue: item.initval,
-                rules: [
-                  {
-                    required: true,
-                    message: this.props.dict['form.required.input'] + item.label + '!'
-                  },
-                  {
-                    validator: (rule, value, callback) => this.handleConfirmPassword(rule, value, callback, item)
-                  }
-                ]
-              })(
-                precision === null ?
-                <InputNumber disabled={item.readonly === 'true'} onPressEnter={(e) => this.handleInputSubmit(e, item)} /> :
-                <InputNumber precision={precision} disabled={item.readonly === 'true'} onPressEnter={(e) => this.handleInputSubmit(e, item)} />
-                )}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'color') { // 棰滆壊閫夋嫨
-        fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: item.initval || 'transparent',
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.select'] + item.label + '!'
-                  }
-                ]
-              })(
-                <ColorSketch />
-              )}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'checkcard') { // 澶氶�夋
-        fields.push(
-          <Col span={24} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            } className="checkcard">
-              {getFieldDecorator(item.field, {
-                initialValue: item.initval,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.select'] + item.label + '!'
-                  }
-                ]
-              })(<CheckCard card={item} />)}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'switch') { // 澶氶�夋
-        fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: item.initval,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.select'] + item.label + '!'
-                  }
-                ]
-              })(<CustomSwitch Item={item} />)}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'checkbox') { // 澶氶�夋
-        let _initval = item.initval ? item.initval.split(',').filter(Boolean) : []
-        
-        fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: _initval,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.select'] + item.label + '!'
-                  }
-                ]
-              })(
-                <Checkbox.Group disabled={item.readonly === 'true'}>
-                  {item.options.map(option => <Checkbox key={option.key} title={option.Text} value={option.Value}>{option.Text}</Checkbox>)}
-                </Checkbox.Group>
-              )}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'radio') { // 鍗曢�夋
-        fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: item.initval,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.select'] + item.label + '!'
-                  }
-                ]
-              })(
-                <Radio.Group disabled={item.readonly === 'true'} onChange={(e) => {this.selectChange(item, e.target.value)}}>
-                  {item.options.map(option => <Radio key={option.key} value={option.Value}>{option.Text}</Radio>)}
-                </Radio.Group>
-              )}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'select' || item.type === 'link') { // 涓嬫媺鎼滅储
-        fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: item.initval,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.select'] + item.label + '!'
-                  }
-                ]
-              })(
-                <Select
-                  showSearch
-                  allowClear={true}
-                  filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
-                  onSelect={(value) => {this.selectChange(item, value)}}
-                  disabled={item.readonly === 'true'}
-                >
-                  {item.options.map(option =>
-                    <Select.Option id={option.key} title={option.Text} key={option.key} value={option.Value}>{option.Text}</Select.Option>
-                  )}
-                </Select>
-              )}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'multiselect') { // 澶氶��
-        let _initval = item.initval ? item.initval.split(',').filter(Boolean) : []
-        fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: _initval,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.select'] + item.label + '!'
-                  }
-                ]
-              })(
-                <Select
-                  showSearch
-                  mode="multiple"
-                  filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
-                  disabled={item.readonly === 'true'}
-                >
-                  {item.options.map(option =>
-                    <Select.Option id={option.key} title={option.Text} key={option.key} value={option.Value}>{option.Text}</Select.Option>
-                  )}
-                </Select>
-              )}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'date') { // 鏃堕棿鎼滅储
-        fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: item.initval,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.select'] + item.label + '!'
-                  }
-                ]
-              })(
-                <DatePicker disabled={item.readonly === 'true'} />
-              )}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'datemonth') {
-        fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: item.initval,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.select'] + item.label + '!'
-                  }
-                ]
-              })(
-                <MonthPicker disabled={item.readonly === 'true'} />
-              )}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'datetime') {
-        fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: item.initval,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.select'] + item.label + '!'
-                  }
-                ]
-              })(
-                <DatePicker showTime disabled={item.readonly === 'true'} />
-              )}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'fileupload') {
-        let filelist = this.props.data ? this.props.data[item.field] : item.initval
-        if (filelist && this.state.readin[item.field]) {
-          try {
-            filelist = filelist.split(',').map((url, index) => {
-              return {
-                uid: `${index}`,
-                name: url.slice(url.lastIndexOf('/') + 1),
-                status: 'done',
-                url: url,
-                origin: true
-              }
-            })
-          } catch {
-            filelist = []
-          }
-        } else {
-          filelist = []
-        }
-
-        fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: filelist,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.select'] + item.label + '!'
-                  }
-                ]
-              })(
-                <FileUpload accept={item.suffix} maxFile={item.maxfile} fileType={item.fileType || 'text'} />
-              )}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'linkMain') {
-        fields.push(
-          <Col span={_colspan} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: item.initval,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.input'] + item.label + '!'
-                  }
-                ]
-              })(<Input placeholder="" autoComplete="off" disabled={item.readonly === 'true'} />)}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'funcvar') {
-        // 鍑芥暟鍙橀噺瀛楁锛岄粯璁や笉鏄剧ず
-      } else if (item.type === 'textarea') {
-        let _max = item.fieldlength || 512
-        let _rules = []
-        if (item.encryption !== 'true') {
-          _rules = [{
-            pattern: /^[^']*$/ig,
-            message: formRule.input.quotemsg
-          }]
-        }
-        fields.push(
-          <Col span={24} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: item.initval,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.input'] + item.label + '!'
-                  },
-                  {
-                    max: _max,
-                    message: formRule.input.formMessage.replace('@max', _max)
-                  },
-                  ..._rules
-                ]
-              })(<TextArea autoSize={{ minRows: 2, maxRows: item.maxRows || 6 }} disabled={item.readonly === 'true'} />)}
-            </Form.Item>
-          </Col>
-        )
-      } else if (item.type === 'brafteditor') {
-        let _max = item.fieldlength || 512
-
-        fields.push(
-          <Col span={24} key={index}>
-            <Form.Item label={item.tooltip ?
-              <Tooltip placement="topLeft" title={item.tooltip}>
-                <Icon type="question-circle" />
-                {item.label}
-              </Tooltip> : item.label
-            }>
-              {getFieldDecorator(item.field, {
-                initialValue: item.initval || null,
-                rules: [
-                  {
-                    required: item.required === 'true',
-                    message: this.props.dict['form.required.input'] + item.label + '!'
-                  },
-                  {
-                    max: _max,
-                    message: formRule.input.formMessage.replace('@max', _max)
-                  }
-                ]
-              })(<Editor />)}
+                rules: item.rules
+              })(content)}
             </Form.Item>
           </Col>
         )
@@ -1220,186 +726,70 @@
   }
 
   handleConfirm = () => {
-    const { record, intercepts, writein } = this.state
-    let _encrypts = fromJS(this.state.encrypts).toJS()
-    let _format = {
-      date: 'YYYY-MM-DD',
-      datemonth: 'YYYY-MM',
-      datetime: 'YYYY-MM-DD HH:mm:ss'
-    }
+    const { formlist } = this.state
 
     // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
     return new Promise((resolve, reject) => {
       this.props.form.validateFieldsAndScroll((err, values) => {
-        if (!err) {
-          let search = []
-          // 闅愯棌琛ㄥ崟
-          this.state.formlist.forEach(item => {
-            if (!item.field) return
-
-            let _item = null
-            if (item.type === 'funcvar') {
-              _item = {
-                type: 'funcvar',
-                readonly: 'true',
-                readin: false,
-                writein: writein[item.field],
-                fieldlen: this.state.fieldlen[item.field],
-                key: item.field,
-                value: ''
-              }
-            } else if (item.hidden === 'true') {
-              let _val = item.initval
-              if (record.hasOwnProperty(item.field)) {
-                _val = record[item.field]
-                _encrypts = _encrypts.filter(_field => _field !== item.field) // 闅愯棌瀛楁锛屼笉鍙備笌鍔犲瘑澶勭悊
-              }
-              
-              _item = {
-                type: this.state.datatype[item.field],
-                readonly: this.state.readtype[item.field],
-                readin: this.state.readin[item.field],
-                writein: writein[item.field],
-                fieldlen: this.state.fieldlen[item.field],
-                key: item.field,
-                value: _val
-              }
-            } else if (item.supField && !item.supvalue.includes(this.props.form.getFieldValue(item.supField))) {
-              _item = {
-                type: this.state.datatype[item.field],
-                readonly: this.state.readtype[item.field],
-                readin: this.state.readin[item.field],
-                writein: writein[item.field],
-                fieldlen: this.state.fieldlen[item.field],
-                key: item.field,
-                value: item.initval
-              }
-            }
-
-            if (!_item) return
-
-            if (item.type === 'date' || item.type === 'datemonth' || item.type === 'datetime') {
-              if (_item.value && _item.value.format) {
-                _item.value = _item.value.format(_format[item.type])
-              } else if (!_item.value) {
-                _item.value = ''
-              }
-            }
-
-            search.push(_item)
-          })
-
-          Object.keys(values).forEach(key => {
-            if (values[key] === undefined) { // 琛ㄥ崟寮傚父锛燂紵锛�
-              if (search.filter(s => s.key === key).length === 0) {
-                search.push({
-                  type: this.state.datatype[key],
-                  readonly: this.state.readtype[key],
-                  readin: this.state.readin[key],
-                  writein: writein[key],
-                  fieldlen: this.state.fieldlen[key],
-                  key: key,
-                  value: ''
-                })
-              }
-              return
-            }
-
-            let _value = ''
-            if (this.state.datatype[key] === 'datetime') {
-              _value = values[key] ? moment(values[key]).format('YYYY-MM-DD HH:mm:ss') : ''
-            } else if (this.state.datatype[key] === 'datemonth') {
-              _value = values[key] ? moment(values[key]).format('YYYY-MM') : ''
-            } else if (this.state.datatype[key] === 'date') {
-              _value = values[key] ? moment(values[key]).format('YYYY-MM-DD') : ''
-            } else if (this.state.datatype[key] === 'number') {
-              _value = values[key]
-
-            } else if (this.state.datatype[key] === 'multiselect' || this.state.datatype[key] === 'checkbox') {
-              _value = values[key] ? values[key].join(',') : ''
-
-            } else if (this.state.datatype[key] === 'fileupload') {
-              let vals = []
-
-              if (values[key] && values[key].length > 0) {
-                values[key].forEach(_val => {
-                  if (_val.origin && _val.url) {
-                    vals.push(_val.url)
-                  } else if (!_val.origin && _val.status === 'done' && _val.response) {
-                    vals.push(Utils.getrealurl(_val.response))
-                  }
-                })
-              }
-
-              _value = vals.join(',')
-            } else if (this.state.datatype[key] === 'text' || this.state.datatype[key] === 'textarea') {
-              _value = values[key].replace(/\t*|\v*/g, '') // 鍘婚櫎鍒惰〃绗�
-
-              if (intercepts.includes(key)) {              // 鍘婚櫎棣栧熬绌烘牸
-                _value = _value.replace(/(^\s*|\s*$)/g, '')
-              }
-            } else {
-              _value = values[key]
-              
-            }
-
-            search.push({
-              type: this.state.datatype[key],
-              readonly: this.state.readtype[key],
-              readin: this.state.readin[key],
-              writein: writein[key],
-              fieldlen: this.state.fieldlen[key],
-              key: key,
-              value: _value
-            })
-          })
-
-          // 鍚湁鍔犲瘑瀛楁鏃讹紝瀵硅〃鍗曞�艰繘琛屽姞瀵�
-          if (_encrypts && _encrypts.length > 0) {
-            search = search.map(item => {
-              let _value = item.value
-              if (_encrypts.includes(item.key)) {
-                try {
-                  _value = window.btoa(window.encodeURIComponent(_value))
-                } catch (e) {
-                  console.warn(e)
-                }
-              }
-              item.value = _value
-
-              return item
-            })
-          }
-
-          resolve(search)
-        } else {
+        if (err) {
           reject(err)
+          return
         }
+        let search = []
+        let record = {...this.record, ...values}
+
+        formlist.forEach(item => {
+          if (!item.field) return
+    
+          let _item = {
+            type: item.type,
+            readonly: item.readonly,
+            readin: item.readin,
+            writein: item.writein,
+            fieldlen: item.fieldlength,
+            key: item.field
+          }
+    
+          _item.value = record[item.field] !== undefined ? record[item.field] : ''
+    
+          if (item.type === 'funcvar') {
+            _item.value = ''
+          } else if (_item.value && (item.type === 'text' || item.type === 'textarea' || item.type === 'linkMain')) {
+            _item.value = _item.value.replace(/\t*|\v*/g, '')       // 鍘婚櫎鍒惰〃绗�
+    
+            if (item.interception === 'true') {           // 鍘婚櫎棣栧熬绌烘牸
+              _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
+            }
+            if (item.type === 'text' && typeof(_item.value) === 'string') { // 鐗规畩瀛楁鏇挎崲
+              _item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey)
+              _item.value = _item.value.replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || ''))
+              _item.value = _item.value.replace(/^(\s*)@bid@(\s*)$/ig, (this.props.BID || ''))
+            }
+          } else if (item.type.indexOf('date') > -1) {
+            if (item.declareType === 'nvarchar(50)') {
+              _item.type = 'text'
+            }
+          }
+    
+          search.push(_item)
+        })
+
+        resolve(search)
       })
     })
   }
 
-  handleSubmit = (e) => {
-    e && e.preventDefault()
-    this.props.inputSubmit()
-  }
-
   render() {
-    const { cols } = this.state
-    const formItemLayout = {
-      labelCol: {
-        xs: { span: 24 },
-        sm: { span: 8 }
-      },
-      wrapperCol: {
-        xs: { span: 24 },
-        sm: { span: 16 }
-      }
+    const { action } = this.props
+
+    let _align = 'left_right'
+    if (action.setting && action.setting.align) {
+      _align = action.setting.align
     }
 
     return (
-      <Form {...formItemLayout} className="ant-advanced-search-form main-form-field" id="main-form-box">
-        <Row className={'cols' + cols} gutter={24}>{this.getFields()}</Row>
+      <Form className={'main-form-field ' + _align}>
+        <Row gutter={24}>{this.getFields()}</Row>
       </Form>
     )
   }

--
Gitblit v1.8.0