king
2022-10-09 2f54651464414059b224181d713af2980e76d095
2020-10-09
19个文件已修改
4个文件已添加
907 ■■■■■ 已修改文件
src/assets/css/design.scss 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/balcony/index.jsx 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/balcony/options.jsx 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/cardcellcomponent/index.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/data-card/options.jsx 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/prop-card/index.jsx 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/table/edit-table/columns/index.scss 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/table/normal-table/columns/index.scss 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/sysinterface/index.jsx 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/card/balcony/index.jsx 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/card/prop-card/index.jsx 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/interfaces/index.jsx 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/interfaces/index.scss 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/interfaces/interItem/index.jsx 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/interfaces/interItem/index.scss 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/index.jsx 317 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/debugtable/index.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/normalbutton/index.jsx 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/mutilform/index.jsx 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/formconfig.jsx 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/modalform/index.jsx 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/verifycard/customscript/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/utils.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/css/design.scss
@@ -4,6 +4,7 @@
  }
  .ant-modal-body {
    padding: 0;
    min-height: 150px;
    .mk-com-name {
      position: absolute;
src/menu/components/card/balcony/index.jsx
@@ -85,12 +85,31 @@
    return !is(fromJS(this.state), fromJS(nextState))
  }
  componentDidMount () {
    MKEmitter.addListener('mkUpdateInter', this.mkUpdateInter)
  }
  /**
   * @description 组件销毁,清除state更新,清除快捷键设置
   */
  componentWillUnmount () {
    this.setState = () => {
      return
    }
    MKEmitter.removeListener('mkUpdateInter', this.mkUpdateInter)
  }
  mkUpdateInter = (inter, split) => {
    const { card } = this.state
    if (card.wrap.datatype === 'public' && card.wrap.publicId === inter.uuid) {
      let _card = {...card, columns: fromJS(inter.columns).toJS()}
      split.delay = split.delay + 10
      setTimeout(() => {
        this.updateComponent(_card)
      }, split.delay)
    }
  }
@@ -128,6 +147,7 @@
    } else {
      let columns = card.columns.map(c => c.field)
      if (card.wrap.datatype === 'dynamic') {
      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
        card.errors.push({ level: 0, detail: '未设置数据源!'})
      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
@@ -136,6 +156,7 @@
        card.errors.push({ level: 0, detail: '未设置主键!'})
      } else if (!columns.includes(card.setting.primaryKey)) {
        card.errors.push({ level: 0, detail: '主键已失效!'})
        }
      }
      if (card.errors.length === 0) {
@@ -234,7 +255,20 @@
  updateWrap = (res) => {
    delete res.quick
    this.updateComponent({...this.state.card, wrap: res})
    let _card = {...this.state.card, wrap: res}
    if (res.datatype === 'public') {
      let interfaces = window.GLOB.customMenu.interfaces || []
      let d = interfaces.filter(m => m.uuid === res.publicId && m.status === 'true')[0]
      if (d) {
        _card.columns = fromJS(d.columns).toJS()
      }
    }
    this.updateComponent(_card)
  }
  render() {
src/menu/components/card/balcony/options.jsx
@@ -6,10 +6,24 @@
 * @description Wrap表单配置信息
 */
export default function (wrap) {
  let modules = MenuUtils.getLinkModules(fromJS(window.GLOB.customMenu).toJS().components) || []
  let supmodules = MenuUtils.getSupModules(fromJS(window.GLOB.customMenu).toJS().components, '') || []
  let menu = fromJS(window.GLOB.customMenu).toJS()
  let modules = MenuUtils.getLinkModules(menu.components) || []
  let supmodules = MenuUtils.getSupModules(menu.components, '') || []
  let roleList = sessionStorage.getItem('sysRoles')
  let appType = sessionStorage.getItem('appType')
  let interfaces = []
  if (menu.interfaces) {
    menu.interfaces.forEach(item => {
      if (item.status === 'true') {
        interfaces.push({
          value: item.uuid,
          label: item.name
        })
      }
    })
  }
  if (roleList) {
    try {
@@ -51,12 +65,22 @@
      options: [
        {value: 'dynamic', label: '动态'},
        {value: 'static', label: '静态'},
        {value: 'public', label: '公共数据源'},
      ],
      controlFields: [
        {field: 'empty', values: ['dynamic']}
        {field: 'empty', values: ['dynamic']},
        {field: 'publicId', values: ['public']},
      ]
    },
    {
      type: 'select',
      field: 'publicId',
      label: '数据源',
      initval: wrap.publicId || '',
      required: true,
      options: interfaces
    },
    {
      type: 'radio',
      field: 'linkType',
      label: '受控类型',
src/menu/components/card/cardcellcomponent/index.scss
@@ -3,6 +3,9 @@
  .ant-btn {
    padding: 0;
  }
  .card-detail-row {
    min-height: 16px;
  }
  .card-button-cell {
    float: left;
src/menu/components/card/data-card/options.jsx
@@ -9,12 +9,17 @@
  let MenuType = ''
  let menu = fromJS(window.GLOB.customMenu).toJS()
  let laypage = setting && setting.laypage !== 'false'
  let interfaces = (menu.interfaces || []).map(item => {
    return {
  let interfaces = []
  if (subtype === 'propcard' && menu.interfaces) {
    menu.interfaces.forEach(item => {
      if (item.status === 'true') {
        interfaces.push({
      value: item.uuid,
      label: item.name
        })
    }
  })
  }
  if (menu.parentId === 'BillPrintTemp') {
    MenuType = 'billPrint'
src/menu/components/card/prop-card/index.jsx
@@ -107,6 +107,7 @@
  }
  componentDidMount () {
    MKEmitter.addListener('mkUpdateInter', this.mkUpdateInter)
    MKEmitter.addListener('submitComponentStyle', this.updateComponentStyle)
  }
@@ -121,6 +122,7 @@
    this.setState = () => {
      return
    }
    MKEmitter.removeListener('mkUpdateInter', this.mkUpdateInter)
    MKEmitter.removeListener('submitComponentStyle', this.updateComponentStyle)
  }
@@ -139,6 +141,20 @@
    this.setState({card: {...card, subcards: []}}, () => {
      this.updateComponent({...card, subcards: subcards})
    })
  }
  mkUpdateInter = (inter, split) => {
    const { card } = this.state
    if (card.wrap.datatype === 'public' && card.wrap.publicId === inter.uuid) {
      let _card = {...card, columns: fromJS(inter.columns).toJS()}
      split.delay = split.delay + 10
      setTimeout(() => {
        this.updateComponent(_card)
      }, split.delay)
    }
  }
  /**
@@ -208,12 +224,9 @@
        }
      })
    } else {
      // if (card.wrap.datatype === 'dynamic') {
      // }
      let columns = card.columns.map(c => c.field)
      if (card.wrap.datatype === 'dynamic') {
      if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
        card.errors.push({ level: 0, detail: '未设置数据源!'})
      } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
@@ -224,6 +237,7 @@
        card.errors.push({ level: 0, detail: '主键已失效!'})
      } else if (!card.setting.supModule) {
        card.errors.push({ level: 0, detail: '未设置上级组件!'})
        }
      }
      if (card.errors.length === 0) {
@@ -489,7 +503,13 @@
        _card.setting.supModule = ''
      }
    } else if (res.datatype === 'public') {
      // let interfaces = window.GLOB.customMenu.interfaces || []
      let interfaces = window.GLOB.customMenu.interfaces || []
      let d = interfaces.filter(m => m.uuid === res.publicId && m.status === 'true')[0]
      if (d) {
        _card.columns = fromJS(d.columns).toJS()
      }
    }
    if (res.layout === 'flex') {
src/menu/components/table/edit-table/columns/index.scss
@@ -75,12 +75,6 @@
    }
  }
  .model-menu-card-cell-list {
    .card-detail-row {
      min-height: 21px;
    }
  }
  .ant-table-thead {
    th {
      position: relative;
src/menu/components/table/normal-table/columns/index.scss
@@ -65,11 +65,6 @@
      background: #ffffff!important;
    }
  }
  .model-menu-card-cell-list {
    .card-detail-row {
      min-height: 21px;
    }
  }
  .ant-table-thead {
    th {
src/menu/sysinterface/index.jsx
@@ -6,6 +6,7 @@
import Utils from '@/utils/utils.js'
import asyncComponent from '@/utils/asyncComponent'
import MKEmitter from '@/utils/events.js'
import './index.scss'
const DataSource = asyncComponent(() => import('@/menu/datasource'))
@@ -180,8 +181,13 @@
      return record
    })
    this.setState({ interfaces })
    this.props.updateConfig({...config, interfaces})
    setTimeout(() => {
      MKEmitter.emit('mkUpdateInter', record, {delay: 0})
    }, 10)
  }
  addInterface = () => {
src/tabviews/custom/components/card/balcony/index.jsx
@@ -54,9 +54,9 @@
      _sync = _config.setting.sync === 'true'
      if (_sync && data) {
        _data = data[_config.dataName] || {}
        _data = data[_config.dataName] || {$$empty: true}
        if (_data && Array.isArray(_data)) {
          _data = _data[0] || {}
          _data = _data[0] || {$$empty: true}
        }
        _sync = false
      } else if (_sync && initdata) {
@@ -66,10 +66,15 @@
        }
        _sync = false
      }
    } else if (_config.wrap.datatype === 'public' && window.GLOB.CacheData.get(_config.wrap.publicId)) {
      _data = window.GLOB.CacheData.get(_config.wrap.publicId)
      _data = fromJS(_data).toJS()
    }
    if (_data) {
      _data.$$BID = BID || ''
    _data.$$BData = BData || ''
    if (_config.setting.primaryKey) {
      _data.$$uuid = _data[_config.setting.primaryKey] || ''
    }
    if (_config.wrap.position === 'fixed' || _config.wrap.position === 'absolute') {
@@ -130,6 +135,10 @@
    MKEmitter.addListener('queryModuleParam', this.queryModuleParam)
    MKEmitter.addListener('refreshByButtonResult', this.refreshByButtonResult)
    
    if (config.wrap.datatype === 'public') {
      MKEmitter.addListener('mkPublicData', this.mkPublicData)
    }
    if (config.timer && config.wrap.datatype === 'dynamic') {
      this.timer = new TimerTask()
      this.timer.init(config.uuid, config.timer, config.timerRepeats, () => {this.loadData(true)})
@@ -145,6 +154,7 @@
      return
    }
    MKEmitter.removeListener('reloadData', this.reloadData)
    MKEmitter.removeListener('mkPublicData', this.mkPublicData)
    MKEmitter.removeListener('syncBalconyData', this.syncBalconyData)
    MKEmitter.removeListener('resetSelectLine', this.resetParentParam)
    MKEmitter.removeListener('queryModuleParam', this.queryModuleParam)
@@ -157,25 +167,39 @@
   * @description 图表数据更新,刷新内容
   */
  UNSAFE_componentWillReceiveProps (nextProps) {
    const { sync, config, BID } = this.state
    const { sync, config, BID, BData } = this.state
    if (sync && !is(fromJS(this.props.data), fromJS(nextProps.data))) {
      let _data = {$$empty: true}
      if (nextProps.data && nextProps.data[config.dataName]) {
        _data = nextProps.data[config.dataName]
        if (_data && Array.isArray(_data)) {
          _data = _data[0]
          _data = _data[0] || {$$empty: true}
        }
      }
      if (_data) {
        _data.$$BID = BID || ''
      }
      _data.$$BData = BData || ''
      _data.$$uuid = _data[config.setting.primaryKey] || ''
      this.setState({sync: false, data: _data})
    }
  }
  mkPublicData = (publicId, data) => {
    const { config, BID, BData } = this.state
    if (config.wrap.datatype === 'public' && config.wrap.publicId === publicId) {
      let _data = fromJS(data).toJS()
      _data.$$BID = BID || ''
      _data.$$BData = BData || ''
      _data.$$uuid = _data[config.setting.primaryKey] || ''
      this.setState({data: _data})
    }
  }
  /**
   * @description 按钮执行完成后页面刷新
   * @param {*} menuId     // 菜单Id
src/tabviews/custom/components/card/prop-card/index.jsx
@@ -67,6 +67,9 @@
        }
        _sync = false
      }
    } else if (_config.wrap.datatype === 'public' && window.GLOB.CacheData.get(_config.wrap.publicId)) {
      _data = window.GLOB.CacheData.get(_config.wrap.publicId)
      _data = fromJS(_data).toJS()
    }
    _data.$$BID = BID || ''
@@ -126,6 +129,12 @@
        setTimeout(() => {
          this.loadData()
        }, _config.setting.delay || 0)
      } else if (_config.wrap.datatype === 'public') {
        if (_data.$$loaded && selected !== 'false') {
          setTimeout(() => {
            this.checkTopLine()
          }, 200)
        }
      } else if (!_sync && selected !== 'false') {
        setTimeout(() => {
          this.checkTopLine()
@@ -142,6 +151,10 @@
    MKEmitter.addListener('queryModuleParam', this.queryModuleParam)
    MKEmitter.addListener('refreshByButtonResult', this.refreshByButtonResult)
    if (config.wrap.datatype === 'public') {
      MKEmitter.addListener('mkPublicData', this.mkPublicData)
    }
    if (config.timer && config.wrap.datatype === 'dynamic') {
      this.timer = new TimerTask()
      this.timer.init(config.uuid, config.timer, config.timerRepeats, () => {this.loadData(true)})
@@ -157,6 +170,7 @@
      return
    }
    MKEmitter.removeListener('reloadData', this.reloadData)
    MKEmitter.removeListener('mkPublicData', this.mkPublicData)
    MKEmitter.removeListener('resetSelectLine', this.resetParentParam)
    MKEmitter.removeListener('queryModuleParam', this.queryModuleParam)
    MKEmitter.removeListener('refreshByButtonResult', this.refreshByButtonResult)
@@ -197,6 +211,26 @@
    }
  }
  mkPublicData = (publicId, data) => {
    const { config, selected, BID, BData } = this.state
    if (config.wrap.datatype === 'public' && config.wrap.publicId === publicId) {
      let _data = fromJS(data).toJS()
      _data.$$BID = BID || ''
      _data.$$BData = BData || ''
      _data.$$uuid = _data[config.setting.primaryKey] || ''
      this.setState({data: _data}, () => {
        if (selected !== 'false') {
          setTimeout(() => {
            this.checkTopLine()
          }, 200)
        }
      })
    }
  }
  checkTopLine = () => {
    const { config, data, selected } = this.state
src/tabviews/custom/components/interfaces/index.jsx
New file
@@ -0,0 +1,37 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import MkInterItem from './interItem'
// import './index.scss'
class MkInterfaces extends Component {
  static propTpyes = {
    BID: PropTypes.any,
    interfaces: PropTypes.array
  }
  state = {}
  shouldComponentUpdate (nextProps, nextState) { return false }
  /**
   * @description 组件销毁,清除state更新,清除快捷键设置
   */
  componentWillUnmount () {
    this.setState = () => {
      return
    }
  }
  render() {
    const { interfaces, BID } = this.props
    return (
      <>
        {interfaces.map(m => <MkInterItem key={m.uuid} config={m} BID={BID}/>)}
      </>
    )
  }
}
export default MkInterfaces
src/tabviews/custom/components/interfaces/index.scss
src/tabviews/custom/components/interfaces/interItem/index.jsx
New file
@@ -0,0 +1,73 @@
import {Component} from 'react'
import PropTypes from 'prop-types'
import { notification } from 'antd'
import Api from '@/api'
import UtilsDM from '@/utils/utils-datamanage.js'
import MKEmitter from '@/utils/events.js'
import TimerTask from '@/utils/timer-task.js'
// import './index.scss'
class MkInterItem extends Component {
  static propTpyes = {
    BID: PropTypes.any,        // 上级主键值
    config: PropTypes.object,  // 配置信息
  }
  state = {}
  componentDidMount () {
    const { config } = this.props
    if (config.setting.timer) {
      this.timer = new TimerTask()
      this.timer.init(config.uuid, config.setting.timer, config.setting.timerRepeats, () => {this.loadData()})
    }
    setTimeout(() => {
      this.loadData()
    }, config.setting.delay)
  }
  shouldComponentUpdate (nextProps, nextState) { return false }
  /**
   * @description 组件销毁,清除state更新,清除快捷键设置
   */
  componentWillUnmount () {
    this.setState = () => {
      return
    }
    this.timer && this.timer.stop()
  }
  async loadData () {
    const { config, BID } = this.props
    let param = UtilsDM.getQueryDataParams(config.setting, config.columns.map(col => col.field).join(','), [], config.setting.order, 1, 1, BID)
    let result = await Api.genericInterface(param)
    if (result.status) {
      let _data = { $$empty: true }
      if (result.data && result.data[0]) {
        _data = result.data[0]
      }
      _data.$$loaded = true
      MKEmitter.emit('mkPublicData', config.uuid, _data)
    } else {
      this.timer && this.timer.stop()
      notification.error({
        top: 92,
        message: result.message,
        duration: 10
      })
    }
  }
  render() {return null}
}
export default MkInterItem
src/tabviews/custom/components/interfaces/interItem/index.scss
src/tabviews/custom/index.jsx
@@ -4,11 +4,10 @@
import { notification, Spin, Row, Col } from 'antd'
import Api from '@/api'
import options from '@/store/options.js'
import zhCN from '@/locales/zh-CN/main.js'
import enUS from '@/locales/en-US/main.js'
import Utils from '@/utils/utils.js'
import UtilsDM, { getStructuredParams, getStructDefaultParam } from '@/utils/utils-datamanage.js'
import { getStructuredParams, getStructDefaultParam } from '@/utils/utils-datamanage.js'
import asyncComponent from '@/utils/asyncComponent'
import MKEmitter from '@/utils/events.js'
import NotFount from '@/components/404'
@@ -42,6 +41,7 @@
const TimeLine = asyncComponent(() => import('./components/timeline/normal-timeline'))
const Voucher = asyncComponent(() => import('./components/module/voucher'))
const DebugTable = asyncComponent(() => import('@/tabviews/debugtable'))
const MkInterfaces = asyncComponent(() => import('@/tabviews/custom/components/interfaces'))
class CustomPage extends Component {
  static propTpyes = {
@@ -143,35 +143,6 @@
      window.GLOB.CacheData.set(MenuID, param)
      config.components = this.filterComponent(config.components, roleId, window.GLOB.mkActions, balMap, skip, param, MenuID)
      // 获取主搜索条件
      let mainSearch = []
      config.components.forEach(component => {
        if (component.type !== 'search') return
        component.search = component.search.map(item => {
          item.oriInitval = item.initval
          if (['text', 'select', 'link'].includes(item.type) && param.$searchkey === item.field) {
            item.initval = param.$searchval
          }
          return item
        })
        mainSearch = Utils.initMainSearch(component.search)
      })
      let params = []
      let BID = param.$BID || ''
      let inherit = {}
      if (config.cacheUseful === 'true') { // 缓存继承
        inherit.cacheUseful = config.cacheUseful
        inherit.timeUnit = config.timeUnit
        inherit.cacheTime = config.cacheTime
      }
      let userName = sessionStorage.getItem('User_Name') || ''
      let fullName = sessionStorage.getItem('Full_Name') || ''
@@ -201,6 +172,37 @@
        })
      }
      config.interfaces = this.formatInterSetting(config.interfaces, regs)
      config.components = this.filterComponent(config.components, roleId, window.GLOB.mkActions, balMap, skip, param, MenuID, config.interfaces)
      // 获取主搜索条件
      let mainSearch = []
      config.components.forEach(component => {
        if (component.type !== 'search') return
        component.search = component.search.map(item => {
          item.oriInitval = item.initval
          if (['text', 'select', 'link'].includes(item.type) && param.$searchkey === item.field) {
            item.initval = param.$searchval
          }
          return item
        })
        mainSearch = Utils.initMainSearch(component.search)
      })
      let params = []
      let BID = param.$BID || ''
      let inherit = {}
      if (config.cacheUseful === 'true') { // 缓存继承
        inherit.cacheUseful = config.cacheUseful
        inherit.timeUnit = config.timeUnit
        inherit.cacheTime = config.cacheTime
      }
      config.components = this.formatSetting(config.components, params, mainSearch, inherit, regs, balMap)
      if ([...balMap.keys()].length > 0) {
@@ -213,7 +215,7 @@
        config,
        mainSearch
      }, () => {
        if (!params || params.length === 0) {
        if (params.length === 0) {
          setTimeout(() => { // 延时加载状态
            this.setState({
              loadingview: false
@@ -226,8 +228,6 @@
        if (!this.props.Tab) {
          this.setShortcut()
        }
        this.loadData()
      })
    } else {
      this.setState({
@@ -282,176 +282,7 @@
    }
  }
  loadData = () => {
    const { config } = this.state
    if (!config.interfaces || config.interfaces.length === 0) return
    let inters = []
    config.interfaces.forEach(item => {
      if (item.status !== 'true') return
      if (window.GLOB.systemType === 'production' && !item.proInterface) {
        notification.warning({
          top: 92,
          message: `《${item.name}》未设置正式系统地址!`,
          duration: 3
        })
        return
      }
      item.MenuName = config.MenuName || ''
      inters.push(item)
    })
    // if (inters.length > 0) {
    //   this.loadOutResource(inters)
    // }
  }
  loadOutResource = (inters) => {
    let setting = inters.shift()
    let param = UtilsDM.getPrevQueryParams(setting, [], this.state.BID)
    Api.genericInterface(param).then(res => {
      if (res.status) {
        if (res.mk_ex_invoke === 'false' || res.mk_ex_invoke === false) {
          if (inters.length > 0) {
            this.loadOutResource(inters)
          }
        } else {
          this.customOuterRequest(res, setting, inters)
        }
      } else {
        notification.error({
          top: 92,
          message: res.message,
          duration: 10
        })
      }
    })
  }
  customOuterRequest = (result, setting, inters) => {
    let url = ''
    if (window.GLOB.systemType === 'production') {
      url = setting.proInterface
    } else {
      url = setting.interface
    }
    let mkey = result.mk_api_key || ''
    delete result.mk_ex_invoke
    delete result.status
    delete result.message
    delete result.ErrCode
    delete result.ErrMesg
    delete result.mk_api_key
    let param = {}
    Object.keys(result).forEach(key => {
      key = key.replace(/^mk_/ig, '')
      param[key] = result[key]
    })
    Api.directRequest(url, setting.method, param, setting.cross).then(res => {
      if (typeof(res) !== 'object') {
        let error = '未知的返回结果!'
        if (typeof(res) === 'string') {
          error = res.replace(/'/ig, '"')
        }
        let _result = {
          mk_api_key: mkey,
          $ErrCode: 'E',
          $ErrMesg: error
        }
        this.customCallbackRequest(_result, setting, inters)
      } else {
        if (Array.isArray(res)) {
          res = { data: res }
        }
        res.mk_api_key = mkey
        this.customCallbackRequest(res, setting, inters)
      }
    }, (e) => {
      let _result = {
        mk_api_key: mkey,
        $ErrCode: 'E',
        $ErrMesg: e && e.statusText ? e.statusText : ''
      }
      this.customCallbackRequest(_result, setting, inters)
    })
  }
  customCallbackRequest = (result, setting, inters) => {
    let errSql = ''
    if (result.$ErrCode === 'E') {
      errSql = `
        set @ErrorCode='E'
        set @retmsg='${result.$ErrMesg}'
      `
      delete result.$ErrCode
      delete result.$ErrMesg
    }
    let lines = UtilsDM.getCallBackSql(setting, result)
    let param = {}
    if (setting.callbackType === 'script') { // 使用自定义脚本
      let sql = lines.map(item => (`
        ${item.insert}
        ${item.selects.join(` union all
        `)}
      `))
      sql = sql.join('')
      param = UtilsDM.getCallBackQueryParams(setting, sql, errSql, this.state.BID)
    } else {
      param.func = 's_ex_result_back'
      param.s_ex_result = lines.map((item, index) => ({
        MenuID: this.props.MenuID || '',
        MenuName: this.props.MenuName || '',
        TableName: item.table,
        LongText: window.btoa(window.encodeURIComponent(`${item.insert}  ${item.selects.join(` union all `)}`)),
        Sort: index + 1
      }))
      if (window.GLOB.debugger === true || (window.debugger === true && options.sysType !== 'cloud')) {
        let sql = lines.map(item => (`
          ${item.insert}
          ${item.selects.join(` union all
          `)}
        `))
        sql = sql.join('')
        console.info(sql.replace(/\n\s{10}/ig, '\n'))
      }
    }
    Api.genericInterface(param).then(res => {
      if (res.status) {
        if (inters.length > 0) {
          this.loadOutResource(inters)
        }
      } else {
        notification.error({
          top: 92,
          message: res.message,
          duration: 10
        })
      }
    })
  }
  filterComponent = (components, roleId, permAction, balMap, skip, urlparam, pageId) => {
  filterComponent = (components, roleId, permAction, balMap, skip, urlparam, pageId, interfaces) => {
    return components.filter(item => {
      item.$pageId = pageId
      
@@ -537,7 +368,7 @@
        item.subtabs = item.subtabs.map(tab => {
          tab.$pageId = pageId
          tab.components = this.filterComponent(tab.components, roleId, permAction, balMap, skip, urlparam, pageId)
          tab.components = this.filterComponent(tab.components, roleId, permAction, balMap, skip, urlparam, pageId, interfaces)
          return tab
        })
@@ -550,7 +381,7 @@
          return false
        }
        item.components = this.filterComponent(item.components, roleId, permAction, balMap, skip, urlparam, pageId)
        item.components = this.filterComponent(item.components, roleId, permAction, balMap, skip, urlparam, pageId, interfaces)
        return true
      } else if (['pie', 'bar', 'line', 'dashboard', 'scatter', 'chart'].includes(item.type)) {
@@ -566,6 +397,15 @@
          item.wrap.blacklist.filter(v => roleId.indexOf(v) > -1).length > 0
        ) {
          return false
        }
        if (item.wrap.datatype === 'public') {
          let inter = interfaces.filter(int => item.wrap.publicId === int.uuid)[0]
          if (!inter) {
            item.wrap.datatype = 'static'
          } else {
            item.setting = inter.setting
          }
        }
      }
@@ -1000,6 +840,8 @@
        component.components = this.formatSetting(component.components, null, null, inherit, regs, balMap)
        component = {...component, ...inherit}
        return component
      } else if (component.wrap && component.wrap.datatype === 'public') {
        return component
      }
      if (component.setting) {
@@ -1096,6 +938,61 @@
    })
  }
  // 格式化默认设置
  formatInterSetting = (inters, regs) => {
    if (!inters) return []
    let interfaces = inters.filter(m => m.status === 'true')
    let delay = 15
    return interfaces.map(inter => {
      inter.setting.delay = delay
      delay += 15
      if (inter.setting.interType !== 'system') return inter
      let _customScript = ''
      inter.scripts.forEach(script => {
        if (script.status !== 'false') {
          _customScript += `
          ${script.sql}
          `
        }
      })
      delete inter.scripts
      inter.setting.$name = '公共数据源-' + inter.setting.name
      inter.setting.execute = inter.setting.execute !== 'false'
      inter.setting.laypage = true
      if (!inter.setting.execute) {
        inter.setting.dataresource = ''
      }
      if (/\s/.test(inter.setting.dataresource)) {
        inter.setting.dataresource = '(' + inter.setting.dataresource + ') tb'
      }
      if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
        inter.setting.dataresource = inter.setting.dataresource.replace(/\$@/ig, '/*').replace(/@datam@/ig, '\'Y\'')
        inter.setting.dataresource = inter.setting.dataresource.replace(/@\$/ig, '*/')
        _customScript = _customScript.replace(/\$@/ig, '/*').replace(/@datam@/ig, '\'Y\'')
        _customScript = _customScript.replace(/@\$/ig, '*/')
      } else {
        inter.setting.dataresource = inter.setting.dataresource.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
        _customScript = _customScript.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
      }
      regs.forEach(cell => {
        inter.setting.dataresource = inter.setting.dataresource.replace(cell.reg, cell.value)
        _customScript = _customScript.replace(cell.reg, cell.value)
      })
      inter.setting.customScript = _customScript // 整理后自定义脚本
      return inter
    })
  }
  /**
   * @description 主表数据加载
   */ 
@@ -1172,7 +1069,12 @@
    MKEmitter.removeListener('resetActiveMenu', this.resetActiveMenu)
    window.GLOB.CacheData.delete(this.props.MenuID)
    if (this.state.config) {
    this.deleteCache(this.state.config.components)
      this.state.config.interfaces.forEach(m => {
        window.GLOB.CacheData.delete(m.uuid)
      })
    }
  }
  debugChange = () => {
@@ -1370,12 +1272,13 @@
  }
  render() {
    const { loadingview, viewlost, config, loading, shortcuts } = this.state
    const { loadingview, viewlost, config, loading, shortcuts, BID } = this.state
    return (
      <div className={'custom-page-wrap ' + (loadingview || loading ? 'loading' : '')} id={this.state.ContainerId} style={config ? config.style : null}>
        {(loadingview || loading) ? <Spin className="view-spin" size="large" /> : null}
        <Row className="component-wrap">{this.getComponents()}</Row>
        {config && config.interfaces.length > 0 ? <MkInterfaces BID={BID} interfaces={config.interfaces}/> : null}
        {config && window.GLOB.breakpoint ? <DebugTable /> : null}
        {!window.GLOB.mkHS && window.GLOB.systemType !== 'production' ? <PagemsgComponent menu={{MenuName: this.props.MenuName, MenuNo: this.props.MenuNo}} config={config} dict={this.state.dict} /> : null}
        {!window.GLOB.mkHS && config ? <SettingComponent config={config} dict={this.state.dict} shortcuts={shortcuts || []}/> : null}
src/tabviews/debugtable/index.jsx
@@ -71,7 +71,7 @@
    }
  }
  refreshByButtonResult = () => {
  refreshDebugTable = () => {
    const { loading } = this.state
    if (!loading) {
@@ -85,7 +85,7 @@
  }
  componentDidMount() {
    MKEmitter.addListener('refreshByButtonResult', this.refreshByButtonResult)
    MKEmitter.addListener('refreshDebugTable', this.refreshDebugTable)
  }
  shouldComponentUpdate (nextProps, nextState) {
@@ -99,7 +99,7 @@
    this.setState = () => {
      return
    }
    MKEmitter.removeListener('refreshByButtonResult', this.refreshByButtonResult)
    MKEmitter.removeListener('refreshDebugTable', this.refreshDebugTable)
  }
  render() {
@@ -108,7 +108,7 @@
    return (
      <div className="debugtable">
        <RedoOutlined className="mk-debug-reload" onClick={() => this.loadmaindata()}/>
        <Table size="middle" columns={columns} dataSource={data} loading={loading} scroll={{ x: '100%', y: false }}/>
        <Table size="middle" columns={columns} dataSource={data} pagination={false} loading={loading} scroll={{ x: '100%', y: false }}/>
      </div>
    )
  }
src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -376,7 +376,6 @@
        
        let item = {
          type: type,
          readonly: false,
          readin: true,
          writein: true,
          fieldlen: fieldlen,
@@ -806,14 +805,11 @@
  
        if (form.type === 'number' || form.type === 'rate') {
          let val = form.value
          if (typeof(val) !== 'number') {
            val = parseFloat(val)
            if (isNaN(val)) {
              val = 0
            }
          }
          _initFormfields.push(`@${_key}=${val}`)
        } else if (['date', 'datemonth', 'datetime'].includes(form.type)) {
        } else if (['date', 'datemonth'].includes(form.type)) {
          _initFormfields.push(`@${_key}='${form.value || '1949-10-01'}'`)
        } else {
          _initFormfields.push(`@${_key}='${form.value}'`)
@@ -848,7 +844,7 @@
    }
  
    // 添加数据中字段,表单值优先(按钮不选行或多行拼接时跳过)
    if (data && btn.Ot !== 'notRequired' && btn.Ot !== 'requiredOnce') {
    if (data && btn.Ot !== 'notRequired' && btn.Ot !== 'requiredOnce' && columns && columns.length > 0) {
      datavars = {...data, ...datavars}
  
      const setField = (col) => {
@@ -890,7 +886,6 @@
        }
      }
  
      if (columns && columns.length > 0) {
        columns.forEach(col => {
          if (col.type === 'colspan' || col.type === 'old_colspan') {
            col.subcols.forEach(cell => {
@@ -900,7 +895,6 @@
            setField(col)
          }
        })
      }
    }
  
    // 变量声明
@@ -1891,6 +1885,10 @@
      MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execSuccess, btn, id, this.state.selines)
    }
    
    if (window.GLOB.breakpoint) {
      MKEmitter.emit('refreshDebugTable')
    }
    btn.syncComponentId && MKEmitter.emit('reloadData', btn.syncComponentId)
    if (tabId) {
@@ -2279,6 +2277,10 @@
      let data = this.props.selectedData && this.props.selectedData[0] ? this.props.selectedData[0] : null
      this.setState({check: data && data[btn.field] === btn.openVal})
    }
    if (window.GLOB.breakpoint) {
      MKEmitter.emit('refreshDebugTable')
    }
  }
  handleModelConfig = (config) => {
@@ -2415,73 +2417,86 @@
    btnconfig.fields.forEach(item => {
      if (!item.field) return
      let _readin = item.readin !== 'false'
      let _initval = item.initval
      let _item = {
        key: item.field,
        readin: item.readin !== 'false' && item.readin !== 'top',
        fieldlen: item.fieldlength || 50,
        writein: item.writein !== 'false',
        type: item.type
      }
      if (item.type === 'linkMain' || item.type === 'funcvar') {
      let _initval = item.initval
      let _readin = item.readin !== 'false'
      let _format = item.precision || 'day' // 时间格式化
      if (item.type === 'funcvar') {
        _initval = ''
        _readin = false
        _item.readin = false
      } else if (item.type === 'linkMain') {
        _readin = false
        _item.readin = false
      } else if (item.type === 'date') {
        if (_format !== 'day') {
          _format = 'YYYY-MM-DD HH:mm:ss'
        } else {
          _format = 'YYYY-MM-DD'
        }
      } else if (item.type === 'datetime') {
        _item.type = 'date'
        _format = 'YYYY-MM-DD HH:mm:ss'
      }
      let key = item.field.toLowerCase()
      if (item.type === 'linkMain' && BData.hasOwnProperty(key)) {
      if (_item.type === 'linkMain' && BData.hasOwnProperty(key)) {
        _initval = BData[key]
      } else if (_readin && _data.hasOwnProperty(key)) {
        _initval = _data[key]
      } else if (item.type === 'date' && _initval) {
        _initval = moment().subtract(_initval, 'days').format('YYYY-MM-DD')
      } else if (item.type === 'datemonth' && _initval) {
      } else if (_item.type === 'date' && _initval) {
        _initval = moment().subtract(_initval, 'days').format(_format)
      } else if (_item.type === 'datemonth' && _initval) {
        _initval = moment().subtract(_initval, 'month').format('YYYY-MM')
      } else if (item.type === 'datetime' && _initval) {
        _initval = moment().subtract(_initval, 'days').format('YYYY-MM-DD HH:mm:ss')
      }
      if (_initval === undefined) {
        _initval = ''
      _item.value = _initval === undefined ? '' : _initval
      if (_item.type === 'number' || item.declare === 'decimal') {
        _item.type = 'number'
        _item.fieldlen = item.decimal || 0
      } else if (['text', 'textarea', 'linkMain'].includes(_item.type)) {
        _item.value = _item.value + ''
        _item.value = _item.value.replace(/\t*|\v*/g, '')       // 去除制表符
        if (item.interception !== 'false') {                    // 去除首尾空格
          _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
      }
      let _fieldlen = item.fieldlength || 50
      if (item.type === 'textarea' || item.type === 'fileupload' || item.type === 'multiselect') {
        _fieldlen = item.fieldlength || 512
      } else if (item.type === 'number') {
        _fieldlen = item.decimal ? item.decimal : 0
      } else if (item.type === 'text' && /@appkey@|@SessionUid@|@bid@/ig.test(_initval)) { // 特殊字段替换
        _initval = _initval.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey).replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || '')).replace(/^(\s*)@bid@(\s*)$/ig, (BID || ''))
        if (_item.type === 'text' && /@appkey@|@SessionUid@|@bid@/ig.test(_item.value)) { // 特殊字段替换
          _item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey).replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || '')).replace(/^(\s*)@bid@(\s*)$/ig, (BID || ''))
      }
      let _type = item.type
      if (['date', 'datemonth', 'datetime'].includes(_type) && item.declareType === 'nvarchar(50)') {
        _type = 'text'
      } else if (item.type === 'rate') {
        item.rateCount = item.rateCount || 5
        let allowHalf = item.allowHalf === 'true'
        if (allowHalf) {
          _initval = parseFloat(_initval)
          if (_initval % 0.5 !== 0) {
            _initval = parseInt(_initval)
          }
        if (_item.type === 'text' && item.lenControl && item.lenControl !== 'limit') {
          if (item.lenControl === 'left') {
            _item.value = _item.value.substr(0, item.fieldlength)
        } else {
          _initval = parseInt(_initval)
            _item.value = _item.value.slice(-item.fieldlength)
        }
        }
      } else if (_item.type.indexOf('date') > -1) {
        if (item.declareType === 'nvarchar(50)') {
          _item.type = 'text'
        }
      } else if (_item.type === 'rate') {
        let count = item.rateCount || 5
        _item.value = parseInt(_item.value)
        if (isNaN(_initval) || _initval < 0) {
          _initval = 0
        } else if (_initval > item.rateCount) {
          _initval = item.rateCount
        if (isNaN(_item.value) || _item.value < 0) {
          _item.value = 0
        } else if (_item.value > count) {
          _item.value = count
        }
      }
      result.push({
        key: item.field,
        readonly: item.readonly === 'true',
        readin: item.readin !== 'false' && item.readin !== 'top',
        fieldlen: _fieldlen,
        writein: item.writein !== 'false',
        type: _type,
        value: _initval
      })
      result.push(_item)
    })
    if (btnconfig.setting.display === 'exec') {
src/tabviews/zshare/mutilform/index.jsx
@@ -133,6 +133,9 @@
        readin = false
        item.readin = false
        item.hidden = true
      } else if (item.type === 'linkMain') {
        readin = false
        item.readin = false
      } else if (item.type === 'number') {
        item.decimal = item.decimal || 0
        item.fieldlength = item.decimal
@@ -163,23 +166,16 @@
      if (readin && data.hasOwnProperty(key)) {
        newval = data[key]
      }
      if (item.type === 'linkMain') {
        newval = BData[key] || '$empty'
      } else if (item.type === 'date') { // 时间搜索
        let format = 'YYYY-MM-DD'
      if (item.type === 'linkMain' && BData.hasOwnProperty(key)) {
        newval = BData[key]
      } else if (item.type === 'date') { // 时间表单,提交值为天或秒
        let _format = 'YYYY-MM-DD HH:mm:ss'
        if (item.precision === 'day') {
          _format = 'YYYY-MM-DD'
        } else if (item.precision === 'hour') {
          format = 'YYYY-MM-DD HH'
        } else if (item.precision === 'minute') {
          format = 'YYYY-MM-DD HH:mm'
        } else if (item.precision === 'second') {
          format = 'YYYY-MM-DD HH:mm:ss'
        }
        if (newval !== '$empty') {
          newval = moment(newval, format).format(_format)
          newval = moment(newval, 'YYYY-MM-DD HH:mm:ss').format(_format)
          newval = newval === 'Invalid date' ? '$empty' : newval
        }
        if (newval === '$empty' && item.initval) {
@@ -193,18 +189,6 @@
        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) {
      //     if (item.initval === '0') {
      //       newval = moment().format('YYYY-MM-DD HH:mm:ss')
      //     } else {
      //       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)) {
@@ -221,7 +205,11 @@
        item.initval = ''
      }
      if (['select', 'link', 'radio', 'checkbox', 'checkcard', 'multiselect', 'cascader'].includes(item.type) && item.resourceType === '1') {
      if (item.type === 'number') {
        if (isNaN(item.initval)) {
          item.initval = 0
        }
      } else if (['select', 'link', 'radio', 'checkbox', 'checkcard', 'multiselect', 'cascader'].includes(item.type) && item.resourceType === '1') {
        deForms.push(item)
      } else if (item.type === 'rate') {
        item.rateCount = item.rateCount || 5
@@ -244,9 +232,7 @@
      }
      if (item.type === 'text') {
        if (typeof(item.initval) === 'number') {
          item.initval = item.initval + ''
        }
        let _rules = [{
          pattern: /^[^']*$/ig,
          message: '不可使用英文状态的单引号!'
@@ -274,37 +260,32 @@
          if (item.regular === 'number') {
            _rules.push({
              pattern: /^[0-9.-]*$/,
              message: formRule.input.numbermsg
              message: item.regularText || formRule.input.numbermsg
            })
          } else if (item.regular === 'letter') {
            _rules.push({
              pattern: /^[a-zA-Z]*$/,
              message: formRule.input.lettermsg
              message: item.regularText || formRule.input.lettermsg
            })
          } else if (item.regular === 'letter_number') {
            _rules.push({
              pattern: /^[a-zA-Z0-9]*$/,
              message: '请输入数字或字母'
              message: item.regularText || '请输入数字或字母'
            })
          } else if (item.regular === 'letter&number') {
            _rules.push({
              pattern: /^[a-zA-Z0-9@_.]*$/,
              message: '请输入数字、字母以及@_.'
              message: item.regularText || '请输入数字、字母以及@_.'
            })
          } 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}$/,
              message: '请正确输入手机号'
              message: item.regularText || '请正确输入手机号'
            })
          } else if (item.regular === 'email') {
            _rules.push({
              pattern: /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/,
              message: '请正确输入邮箱地址'
            })
          } else if (item.regular === 'funcname') {
            _rules.push({
              pattern: /^[\u4E00-\u9FA50-9a-zA-Z_]*$/,
              message: formRule.input.funcname
              message: item.regularText || '请正确输入邮箱地址'
            })
          }
        }
@@ -962,7 +943,6 @@
    
          let _item = {
            type: item.type,
            readonly: item.readonly,
            readin: item.readin,
            writein: item.writein,
            fieldlen: item.fieldlength,
@@ -973,7 +953,11 @@
    
          if (item.type === 'funcvar') {
            _item.value = ''
          } else if (_item.value && (item.type === 'text' || item.type === 'textarea' || item.type === 'linkMain') && typeof(_item.value) === 'string') {
          } else if (item.declare === 'decimal') {
            _item.type = 'number'
            _item.fieldlen = item.decimal || 0
          } else if (['text', 'textarea', 'linkMain'].includes(item.type)) {
            _item.value = _item.value + ''
            _item.value = _item.value.replace(/\t*|\v*/g, '')       // 去除制表符
    
            if (item.interception !== 'false') {           // 去除首尾空格
@@ -982,15 +966,6 @@
            if (item.type === 'text' && /@appkey@|@SessionUid@|@bid@/ig.test(_item.value)) { // 特殊字段替换
              _item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey).replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || '')).replace(/^(\s*)@bid@(\s*)$/ig, (this.props.BID || ''))
            }
          } else if (item.type.indexOf('date') > -1) {
            if (item.declareType === 'nvarchar(50)') {
              _item.type = 'text'
            }
          } else if (item.declare === 'decimal' && ['select', 'link', 'radio', 'checkcard'].includes(item.type)) {
            _item.type = 'number'
            _item.fieldlen = item.decimal || 0
          }
          if (item.type === 'text' && item.lenControl && item.lenControl !== 'limit') {
            if (item.lenControl === 'left') {
              _item.value = _item.value.substr(0, item.fieldlength)
@@ -998,6 +973,11 @@
              _item.value = _item.value.slice(-item.fieldlength)
            }
          }
          } else if (item.type.indexOf('date') > -1) {
            if (item.declareType === 'nvarchar(50)') {
              _item.type = 'text'
            }
          }
    
          search.push(_item)
        })
src/templates/zshare/formconfig.jsx
@@ -3571,6 +3571,24 @@
      required: false
    },
    {
      type: 'radio',
      key: 'lenControl',
      label: '长度控制',
      initVal: card.lenControl || 'limit',
      tooltip: '在设置字段长度后,对长度的控制方式。',
      required: false,
      options: [{
        value: 'limit',
        text: '限制输入'
      }, {
        value: 'left',
        text: '左截'
      }, {
        value: 'right',
        text: '右截'
      }]
    },
    {
      type: 'number',
      key: 'span',
      min: 1,
@@ -3602,24 +3620,6 @@
      }, {
        value: 6,
        text: 6
      }]
    },
    {
      type: 'radio',
      key: 'lenControl',
      label: '长度控制',
      initVal: card.lenControl || 'limit',
      tooltip: '在设置字段长度后,对长度的控制方式。',
      required: false,
      options: [{
        value: 'limit',
        text: '限制输入'
      }, {
        value: 'left',
        text: '左截'
      }, {
        value: 'right',
        text: '右截'
      }]
    },
    {
@@ -3687,6 +3687,15 @@
    },
    {
      type: 'text',
      key: 'regularText',
      label: '正则提示',
      initVal: card.regularText || '',
      tooltip: '正则验证时的提示信息。',
      required: false,
      readonly: false
    },
    {
      type: 'text',
      key: 'tooltip',
      label: '悬浮提示',
      tooltip: '鼠标悬浮于提示文字上方时,显示提示信息。',
@@ -3722,7 +3731,7 @@
    {
      type: 'text',
      key: 'placeholder',
      label: '提示信息',
      label: '输入提示',
      tooltip: '字段预期值的提示信息。',
      initVal: card.placeholder || '',
      required: false
src/templates/zshare/modalform/index.jsx
@@ -41,7 +41,7 @@
  formula: ['label', 'type', 'marginTop', 'marginBottom', 'splitline', 'span', 'labelwidth', 'formula', 'eval', 'postfix'],
  brafteditor: ['required', 'hidelabel', 'hidden', 'readin', 'fieldlength', 'readonly', 'span', 'labelwidth', 'tooltip', 'extra', 'encryption', 'marginTop', 'marginBottom'],
  funcvar: ['span', 'labelwidth', 'splitline', 'marginTop', 'marginBottom'],
  linkMain: ['readonly', 'required', 'hidden', 'fieldlength', 'span', 'labelwidth', 'tooltip', 'interception', 'extra', 'marginTop', 'marginBottom']
  linkMain: ['readonly', 'required', 'hidden','declare', 'span', 'labelwidth', 'tooltip', 'interception', 'extra', 'marginTop', 'marginBottom']
}
class MainSearch extends Component {
@@ -140,6 +140,9 @@
      if (this.record.enter === 'tab' || this.record.enter === 'sub') {
        shows.push('tabField')
      }
      if (this.record.regular !== '') {
        shows.push('regularText')
      }
    } else if (type === 'number') {
      reTypes.initval = 'number'
      reRequired.initval = true
@@ -149,6 +152,12 @@
      if (sessionStorage.getItem('appType') === 'mob') { // 移动端右侧扩展信息
        shows.push('placeholder')
      }
    } else if (type === 'linkMain') {
      if (this.record.declare === 'nvarchar') {
        shows.push('fieldlength')
      } else if (this.record.declare === 'decimal') {
        shows.push('decimal')
      }
    } else if (['multiselect', 'select', 'link', 'radio', 'checkbox'].includes(type)) {
      if (this.record.resourceType === '0') {        // 自定义资源
        shows.push('options')
src/templates/zshare/verifycard/customscript/index.jsx
@@ -325,7 +325,7 @@
          </Col>
          <Col span={24} className="sql">
            <Form.Item label={
              <Tooltip placement="topLeft" overlayStyle={{width: '320px', maxWidth: '320px'}} title={<><div>{'调试替换符 /*$breakpoint_begin_xxxx@ 、@breakpoint_end_xxxx$*/,在控制台中输入 window.debug = \'xxxx\' 会启用对应的调试语句,快捷键 ctrl+c 或在控制台中输入 window.debug = false 关闭调试。'}</div><div style={{height: '5px'}}></div><div>{'数据检查替换符 $check@ -> \'\'、 @check$ -> \'\',ErrorCode等于C时 $check@ -> /*、 @check$ -> */。注:1、需使用系统接口 2、行设置为“选择多行”时无效。'}</div></>}>
              <Tooltip placement="topLeft" overlayStyle={{width: '320px', maxWidth: '320px'}} title={<><div>{'调试替换符 /*$breakpoint_begin_xxxx@ 、@breakpoint_end_xxxx$*/,在控制台中输入 window.debug = \'xxxx\' 会启用对应的调试语句,快捷键 ctrl+c 或在控制台中输入 window.debug = false 关闭调试。注:调试时字符 $breakpoint_proc@ 将被替换。'}</div><div style={{height: '5px'}}></div><div>{'数据检查替换符 $check@ -> \'\'、 @check$ -> \'\',ErrorCode等于C时 $check@ -> /*、 @check$ -> */。注:1、需使用系统接口 2、行设置为“选择多行”时无效。'}</div></>}>
                <QuestionCircleOutlined className="mk-form-tip" />
                sql
              </Tooltip>
src/utils/utils.js
@@ -158,7 +158,7 @@
    let error = ''
    
    sql = sql.replace(/sys\.fn_sqlvarbasetostr\(HashBytes\('MD5'/ig, '') // 跳过MD5加密
    sql = sql.replace(/sys\.fn_/ig, '') // 跳过sys.fn_验证
    chars.forEach(char => {
      if (!error && char.reg.test(sql)) {
@@ -1434,14 +1434,11 @@
      if (form.type === 'number' || form.type === 'rate') {
        let val = form.value
        if (typeof(val) !== 'number') {
          val = parseFloat(val)
          if (isNaN(val)) {
            val = 0
          }
        }
        _initFormfields.push(`@${_key}=${val}`)
      } else if (['date', 'datemonth', 'datetime'].includes(form.type)) {
      } else if (['date', 'datemonth'].includes(form.type)) {
        _initFormfields.push(`@${_key}='${form.value || '1949-10-01'}'`)
      } else {
        _initFormfields.push(`@${_key}='${form.value}'`)
@@ -1476,7 +1473,7 @@
  }
  // 添加数据中字段,表单值优先(按钮不选行或多行拼接时跳过)
  if (data && btn.Ot !== 'notRequired' && btn.Ot !== 'requiredOnce') {
  if (data && btn.Ot !== 'notRequired' && btn.Ot !== 'requiredOnce' && columns && columns.length > 0) {
    datavars = {...data, ...datavars}
    const setField = (col) => {
@@ -1518,7 +1515,6 @@
      }
    }
    if (columns && columns.length > 0) {
      columns.forEach(col => {
        if (col.type === 'colspan' || col.type === 'old_colspan') {
          col.subcols.forEach(cell => {
@@ -1528,7 +1524,6 @@
          setField(col)
        }
      })
    }
  }
  // 变量声明
@@ -2078,7 +2073,7 @@
      end = /@breakpoint_end_[0-9a-z_]+\$\*\//ig
    }
    
    _sql = _sql.replace(start, '').replace(end, '')
    _sql = _sql.replace(start, '').replace(end, '').replace(/\$breakpoint_proc@/ig, window.GLOB.breakpoint)
    _sql += `
      z_debug_end: select @ErrorCode='E',@retmsg='debug_end' goto aaa`
  }