king
2021-06-28 3c26f581cd77bed95cc56464f8424993f3c6b13a
2021-06-28
21个文件已修改
389 ■■■■■ 已修改文件
src/api/index.js 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/mkIcon/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/mkIcon/index.scss 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/form/formaction/formconfig.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/search/main-search/dragsearch/card.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/search/main-search/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/search/main-search/index.scss 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/search/main-search/wrapsetting/settingform/index.jsx 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/share/actioncomponent/actionform/index.jsx 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/share/actioncomponent/formconfig.jsx 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/calendar/index.jsx 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/index.jsx 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/group/normal-group/index.jsx 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/share/tabtransfer/index.jsx 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/index.jsx 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtable/index.jsx 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtabtable/index.jsx 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/modalconfig/settingform/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/formconfig.jsx 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/option.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mobdesign/index.scss 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/index.js
@@ -227,8 +227,6 @@
      login_id_address: ipAddress
    }
    // Type: 'S' 时
    let shaObj = new jsSHA('SHA-1', 'TEXT')
    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
    let sys_datetime = sessionStorage.getItem('sys_datetime')
@@ -238,12 +236,22 @@
      param.timestamp = moment(sys_datetime, 'YYYY-MM-DD HH:mm:ss').add(seconds, 'seconds').format('YYYY-MM-DD HH:mm:ss')
    }
    
    // Type: 'S' 时
    let shaObj = new jsSHA('SHA-1', 'TEXT')
    shaObj.update(password)
    param.Password = shaObj.getHash('HEX').toUpperCase()
    param.Password = md5(username + param.Password + param.timestamp)
    // Type: 'mk_' 时
    // param.Type = '公钥'
    // let shaObj = new jsSHA('SHA-1', 'TEXT')
    // shaObj.update(password)
    // param.Password = shaObj.getHash('HEX').toUpperCase()
    // param.Password = md5('私钥' + username + param.Password + param.timestamp)
    // Type: 'X' 时
    // param.Password = Utils.formatOptions(password)
    param.appkey = window.GLOB.appkey || ''
    let url = '/webapi/dologon'
src/components/mkIcon/index.jsx
@@ -14,7 +14,7 @@
  state = {
    selectIcon: '',
    allowClear: false,
    icons: [...minkeIconSystem.normal, ...minkeIconSystem.trademark, ...minkeIconSystem.data, ...minkeIconSystem.edit, ...minkeIconSystem.hint, ...minkeIconSystem.direction],
    icons: [...minkeIconSystem.direction, ...minkeIconSystem.edit, ...minkeIconSystem.normal, ...minkeIconSystem.trademark, ...minkeIconSystem.data, ...minkeIconSystem.hint],
    visible: false
  }
src/components/mkIcon/index.scss
@@ -19,8 +19,8 @@
    background: #efefef;
    border-radius: 50%;
    color: #757575;
    padding: 2px;
    font-size: 13px;
    padding: 3px;
    font-size: 10px;
    opacity: 0;
    transition: opacity 0.3s;
  }
src/menu/components/form/formaction/formconfig.jsx
@@ -10,7 +10,7 @@
 */
export function getActionForm (card, functip, tableName, usefulFields, modules) {
  const isApp = sessionStorage.getItem('appType') === 'pc'
  const appType = sessionStorage.getItem('appType')
  let _type = '提交'
  if (card.type === 'prev') {
    _type = '上一步'
@@ -19,7 +19,7 @@
  }
  let menulist = []
  if (isApp) {
  if (appType === 'pc' || appType === 'mob') {
    menulist = sessionStorage.getItem('appMenus')
    if (menulist) {
      try {
@@ -242,7 +242,7 @@
      readonly: false
    },
    {
      type: isApp ? 'select' : 'cascader',
      type: (appType === 'pc' || appType === 'mob') ? 'select' : 'cascader',
      key: 'linkmenu',
      label: '打开菜单',
      tooltip: '执行成功后需要打开的菜单。',
@@ -256,7 +256,7 @@
      label: '打开方式',
      initVal: card.open || 'blank',
      required: false,
      forbid: !isApp,
      forbid: appType !== 'pc',
      options: [{
        value: 'blank',
        text: '新窗口'
src/menu/components/search/main-search/dragsearch/card.jsx
@@ -10,6 +10,7 @@
const { MonthPicker, WeekPicker, RangePicker } = DatePicker
const { Search } = Input
const CheckCard = asyncComponent(() => import('@/templates/modalconfig/checkCard'))
const appType = sessionStorage.getItem('appType')
const Card = ({ id, card, showField, moveCard, copyCard, findCard, editCard, delCard }) => {
  const originalIndex = findCard(id).index
@@ -67,6 +68,10 @@
    }
  } else if (card.type === 'multiselect' || card.type === 'select' || card.type === 'link') {
    formItem = (<Select value={_defaultValue}></Select>)
  } else if (card.type === 'date' && appType === 'mob') {
    formItem = (<div className="mob-list-item">{card.initval ? moment().subtract(card.initval, 'days').format('YYYY-MM-DD') : '请选择'}<Icon type="right" /></div>)
  } else if (card.type === 'datemonth' && appType === 'mob') {
    formItem = (<div className="mob-list-item">{card.initval ? moment().subtract(card.initval, 'month').format('YYYY-MM') : '请选择'}<Icon type="right" /></div>)
  } else if (card.type === 'date') {
    formItem = (<Input style={{marginTop: '4px'}} placeholder={card.labelShow === 'false' ? card.label : ''} value={card.initval} />)
  } else if (card.type === 'dateweek') {
@@ -94,7 +99,7 @@
        <Icon className="close" title="delete" type="close" onClick={() => delCard(id)} />
      </div>
    } trigger="hover">
      <div className={'page-card ' + card.labelShow} style={{ opacity: opacity}}>
      <div className={'page-card ' + card.labelShow + ' ' + card.type} style={{ opacity: opacity}}>
        <div ref={node => drag(drop(node))}>
          <Form.Item
            labelCol={{xs: { span: 24 }, sm: { span: 8 }}}
src/menu/components/search/main-search/index.jsx
@@ -55,7 +55,7 @@
        width: 24,
        name: card.name,
        subtype: card.subtype,
        wrap: { name: card.name, width: 24, show: 'true', float: 'left' },
        wrap: { name: card.name, width: 24, show: this.state.appType === 'mob' ? 'false' : 'true', float: 'left' },
        style: {
          marginLeft: '8px', marginRight: '8px', marginTop: '8px', marginBottom: '8px'
        },
src/menu/components/search/main-search/index.scss
@@ -93,6 +93,15 @@
  .check-card-edit-box {
    margin-top: 5px!important;
  }
  .mob-list-item {
    text-align: right;
    line-height: 40px;
    white-space: nowrap;
    padding-right: 5px;
    i {
      margin-left: 5px;
    }
  }
}
.main-search-edit-list:not(.right) {
  .pre-action {
src/menu/components/search/main-search/wrapsetting/settingform/index.jsx
@@ -12,7 +12,8 @@
  }
  state = {
    roleList: []
    roleList: [],
    appType: sessionStorage.getItem('appType')
  }
  UNSAFE_componentWillMount () {
@@ -54,7 +55,7 @@
  render() {
    const { wrap } = this.props
    const { getFieldDecorator } = this.props.form
    const { roleList } = this.state
    const { roleList, appType } = this.state
    const formItemLayout = {
      labelCol: {
@@ -107,7 +108,7 @@
                })(<InputNumber min={1} max={24} precision={0} onPressEnter={this.handleSubmit}/>)}
              </Form.Item>
            </Col>
            <Col span={12}>
            {appType !== 'mob' ? <Col span={12}>
              <Form.Item label={
                <Tooltip placement="topLeft" title="高级搜索弹窗的宽度,注:当宽度值小于100时表示占窗口的百分比,大于100时表示宽度的绝对值。">
                  <Icon type="question-circle" />
@@ -118,7 +119,7 @@
                  initialValue: wrap.advanceWidth || 1000
                })(<InputNumber min={10} max={3000} precision={0}/>)}
              </Form.Item>
            </Col>
            </Col> : null}
            <Col span={12}>
              <Form.Item label={
                <Tooltip placement="topLeft" title="右对齐时,隐藏搜索按钮。">
src/menu/components/share/actioncomponent/actionform/index.jsx
@@ -2,15 +2,17 @@
import PropTypes from 'prop-types'
import { fromJS } from 'immutable'
import { Form, Row, Col, Input, Select, Icon, Radio, notification, Tooltip, InputNumber, Cascader } from 'antd'
import { btnIcons, btnCustomClasses, formRule } from '@/utils/option.js'
import { btnCustomClasses, formRule } from '@/utils/option.js'
import asyncComponent from '@/utils/asyncComponent'
import './index.scss'
const { TextArea } = Input
const MkIcon = asyncComponent(() => import('@/components/mkIcon'))
const actionTypeOptions = {
  pop: ['label', 'OpenType', 'intertype', 'Ot', 'show', 'icon', 'class', 'execSuccess', 'execError', 'resetPageIndex', 'syncComponent', 'width'],
  prompt: ['label', 'OpenType', 'intertype', 'Ot', 'show', 'icon', 'class', 'execSuccess', 'execError', 'resetPageIndex', 'syncComponent', 'width'],
  exec: ['label', 'OpenType', 'intertype', 'Ot', 'show', 'icon', 'class', 'execSuccess', 'execError', 'resetPageIndex', 'syncComponent', 'width'],
  pop: ['label', 'OpenType', 'intertype', 'Ot', 'show', 'icon', 'class', 'execSuccess', 'execError', 'resetPageIndex', 'syncComponent', 'width', 'openmenu', 'open'],
  prompt: ['label', 'OpenType', 'intertype', 'Ot', 'show', 'icon', 'class', 'execSuccess', 'execError', 'resetPageIndex', 'syncComponent', 'width', 'openmenu', 'open'],
  exec: ['label', 'OpenType', 'intertype', 'Ot', 'show', 'icon', 'class', 'execSuccess', 'execError', 'resetPageIndex', 'syncComponent', 'width', 'openmenu', 'open'],
  excelIn: ['label', 'Ot', 'OpenType', 'intertype', 'show', 'icon', 'class', 'sheet', 'execSuccess', 'execError', 'resetPageIndex', 'syncComponent', 'width'],
  excelOut: ['label', 'OpenType', 'intertype', 'show', 'icon', 'class', 'execSuccess', 'execError', 'syncComponent', 'resetPageIndex', 'pagination', 'search', 'width'],
  popview: ['label', 'Ot', 'OpenType', 'show', 'icon', 'class', 'popClose', 'resetPageIndex', 'width'],
@@ -110,8 +112,6 @@
        } else if (item.key === 'intertype') {
          let iscustom = ['pop', 'prompt', 'exec'].includes(_opentype)
          item.options = this.state.interTypeOptions.filter(op => (iscustom || op.value !== 'custom'))
        } else if (item.key === 'icon') {
          item.options = btnIcons
        } else if (item.key === 'Ot') {
          if (type === 'card') {
            item.options = this.state.requireOptions.filter(op => ['notRequired', 'requiredSgl'].includes(op.value))
@@ -549,7 +549,7 @@
                >
                  {item.options.map((option, index) =>
                    <Select.Option id={index} key={option.value || option.field} value={option.value || option.field}>
                      {item.key === 'icon' && option.value ? <Icon type={option.value} /> : ''} {option.text || option.label}
                      {option.text || option.label}
                    </Select.Option>
                  )}
                </Select>
@@ -622,6 +622,24 @@
            </Form.Item>
          </Col>
        )
      } else if (item.type === 'icon') { // 多选
        fields.push(
          <Col span={12} key={index}>
            <Form.Item label={item.label}>
              {getFieldDecorator(item.key, {
                initialValue: item.initVal,
                rules: [
                  {
                    required: !!item.required,
                    message: this.props.dict['form.required.select'] + item.label + '!'
                  }
                ]
              })(
                <MkIcon allowClear/>
              )}
            </Form.Item>
          </Col>
        )
      } else if (item.type === 'mcascader') {
        fields.push(
          <Col span={12} key={index}>
src/menu/components/share/actioncomponent/formconfig.jsx
@@ -12,6 +12,7 @@
 * @param {*} type           按钮类型,用于区分可选的打开方式
 */
export function getActionForm (card, functip, config, usefulFields, type, menulist = [], modules = []) {
  let appType = sessionStorage.getItem('appType')
  let setting = config.setting || {}
  let columns = config.columns || []
  let appMenus = []
@@ -51,7 +52,7 @@
    { value: 'pay', text: Formdict['model.pay'] },
    { value: 'custom', text: Formdict['header.form.custom'] }
  ]
  const isApp = ['pc', 'mob'].includes(sessionStorage.getItem('appType'))
  const isApp = ['pc', 'mob'].includes(appType)
  let funTypes = [
    { value: 'changeuser', text: Formdict['header.form.func.changeuser'] },
@@ -195,26 +196,12 @@
      options: pageTemps
    },
    {
      type: 'radio',
      key: 'open',
      label: '链接方式',
      initVal: card.open || 'blank',
      required: true,
      forbid: sessionStorage.getItem('appType') !== 'pc',
      options: [{
        value: 'blank',
        text: '新窗口'
      }, {
        value: 'self',
        text: '当前窗口'
      }]
    },
    {
      type: 'select',
      key: 'linkmenu',
      label: '关联菜单',
      initVal: card.linkmenu || '',
      required: true,
      forbid: !isApp,
      options: appMenus
    },
    // {
@@ -439,10 +426,10 @@
        text: '图标'
      }, {
        value: 'button',
        text: '按钮'
        text: '图标+文字'
      }, {
        value: 'link',
        text: '链接'
        text: '文字+图标'
      }]
    },
    {
@@ -451,7 +438,7 @@
      label: "滑动显示",
      initVal: card.swipe || 'false',
      required: false,
      forbid: (type !== 'datacard' || sessionStorage.getItem('appType') !== 'mob'),
      forbid: (type !== 'datacard' || appType !== 'mob'),
      options: [{
        value: 'false',
        text: '否'
@@ -464,7 +451,7 @@
      }]
    },
    {
      type: 'select',
      type: 'icon',
      key: 'icon',
      label: Formdict['model.icon'],
      initVal: card.icon,
@@ -476,6 +463,7 @@
      key: 'class',
      label: Formdict['model.form.color'],
      initVal: card.class,
      tooltip: '此颜色为按钮初始化颜色,可在样式调整中修改。',
      required: false,
      options: []
    },
@@ -543,7 +531,6 @@
      tooltip: '禁用控制字段,可根据数据控制按钮是否禁用。',
      initVal: card.controlField || '',
      required: false,
      // forbid: card.$type !== 'tableButton',
      options: [{label: '无', field: ''}, ...columns]
    },
    {
@@ -552,8 +539,32 @@
      label: '控制值',
      tooltip: '当选择控制字段,且字段值与控制值相等时,按钮会禁用,多个值用逗号分隔。',
      initVal: card.controlVal || '',
      // forbid: card.$type !== 'tableButton',
      required: false
    },
    {
      type: 'select',
      key: 'openmenu',
      label: '打开菜单',
      tooltip: '执行成功后需要打开的菜单。',
      initVal: card.openmenu,
      forbid: appType !== 'pc' && appType !== 'mob',
      required: false,
      options: [{value: '', text: '无'}, ...appMenus]
    },
    {
      type: 'radio',
      key: 'open',
      label: '打开方式',
      initVal: card.open || 'blank',
      required: true,
      forbid: appType !== 'pc',
      options: [{
        value: 'blank',
        text: '新窗口'
      }, {
        value: 'self',
        text: '当前窗口'
      }]
    }
  ]
src/tabviews/calendar/index.jsx
@@ -48,6 +48,7 @@
    visible: false,       // 标签页控制
    triggerTime: '',      // 点击时间
    calendarYear: moment().format('YYYY'), // 日历年份
    hasReqFields: false
  }
  /**
@@ -122,15 +123,18 @@
      config.search = Utils.initSearchVal(config.search)
      // 字段透视
      if (param && param.$searchkey) {
        config.search = config.search.map(item => {
          if (['text', 'select', 'link'].includes(item.type) && param.$searchkey === item.field) {
            item.initval = param.$searchval
          }
          return item
        })
      }
      let hasReqFields = false
      config.search = config.search.map(item => {
        if (['text', 'select', 'link'].includes(item.type) && param.$searchkey === item.field) {
          item.initval = param.$searchval
        }
        if (item.required) {
          hasReqFields = true
        }
        return item
      })
      // 数据源
      if (config.setting.interType === 'inner' && !config.setting.innerFunc) {
@@ -196,6 +200,7 @@
      }
      this.setState({
        hasReqFields,
        BID: param && param.$BID ? param.$BID : '',
        loadingview: false,
        config: config,
@@ -226,12 +231,15 @@
   * @description 主表数据加载
   */ 
  async loadmaindata () {
    const { setting, search, BID } = this.state
    const { setting, search, BID, hasReqFields } = this.state
    let param = ''
    let requireFields = search.filter(item => item.required && item.value === '')
    if (requireFields.length > 0) {
      return
    if (hasReqFields) {
      let requireFields = search.filter(item => item.required && item.value === '')
      if (requireFields.length > 0) {
        return
      }
    }
    this.setState({
src/tabviews/commontable/index.jsx
@@ -441,11 +441,6 @@
  loadData = () => {
    const { setting, search, BIDs, loadCustomApi, hasReqFields } = this.state
    let requireFields = []
    if (hasReqFields) {
      requireFields = search.filter(item => item.required && item.value === '')
    }
    this.setState({
      selectedData: [],
@@ -456,12 +451,18 @@
      }
    })
    if (requireFields.length > 0) {
      this.setState({
        loading: false
      })
      return
    } else if (window.GLOB.systemType === 'production' && setting.interType === 'custom' && !setting.proInterface) {
    if (hasReqFields) {
      let requireFields = search.filter(item => item.required && item.value === '')
      if (requireFields.length > 0) {
        this.setState({
          loading: false
        })
        return
      }
    }
    if (window.GLOB.systemType === 'production' && setting.interType === 'custom' && !setting.proInterface) {
      notification.warning({
        top: 92,
        message: '未设置正式系统地址!',
src/tabviews/custom/components/group/normal-group/index.jsx
@@ -48,7 +48,6 @@
    // 获取主搜索条件
    let _mainSearch = mainSearch ? fromJS(mainSearch).toJS() : []
    let isEmpty = _mainSearch.filter(item => item.required && (!item.value || item.value.length === 0)).length > 0
    let params = []
    config.components.forEach(item => {
      if (item.type === 'tabs') return
@@ -57,31 +56,24 @@
      if (!item.format) return
      if (item.dataName && (!item.pageable || (item.pageable && !item.setting.laypage)) && item.setting.onload === 'true' && item.setting.sync === 'true') {
        if (isEmpty && item.setting.useMSearch) {
        let searchlist = []
        if (item.search && item.search.length > 0) {
          searchlist = Utils.initMainSearch(item.search)
        }
        if (item.setting.useMSearch) {
          let keys = searchlist.map(item => item.key)
          _mainSearch.forEach(item => {
            if (!keys.includes(item.key)) {
              searchlist.push(item)
            }
          })
        }
        if (searchlist.filter(cell => cell.required && cell.value === '').length > 0) {
          item.setting.sync = 'false'
          item.setting.onload = 'false'
        } else {
          let searchlist = []
          if (item.search && item.search.length > 0) {
            searchlist = Utils.initMainSearch(item.search)
          }
          let _empty = searchlist.filter(cell => cell.required && (!cell.value || cell.value.length === 0)).length > 0
          if (_empty) {
            item.setting.sync = 'false'
            item.setting.onload = 'false'
          } else {
            if (item.setting.useMSearch) {
              let keys = searchlist.map(item => item.key)
              _mainSearch.forEach(item => {
                if (!keys.includes(item.key)) {
                  searchlist.push(item)
                }
              })
            }
            params.push(this.getDefaultParam(item, searchlist))
          }
          params.push(this.getDefaultParam(item, searchlist))
        }
      } else {
        item.setting.sync = 'false'
src/tabviews/custom/components/share/tabtransfer/index.jsx
@@ -62,8 +62,6 @@
      _mainSearch = fromJS(mainSearch).toJS()
    }
    let isEmpty = _mainSearch.filter(item => item.required && (!item.value || item.value.length === 0)).length > 0
    let params = []
    config.components.forEach(item => {
      if (item.type === 'tabs' || item.type === 'group') return
@@ -72,31 +70,24 @@
      if (!item.format) return
      if (item.dataName && (!item.pageable || (item.pageable && !item.setting.laypage)) && item.setting.onload === 'true' && item.setting.sync === 'true') {
        if (isEmpty && item.setting.useMSearch) {
        let searchlist = []
        if (item.search && item.search.length > 0) {
          searchlist = Utils.initMainSearch(item.search)
        }
        if (item.setting.useMSearch) {
          let keys = searchlist.map(item => item.key)
          _mainSearch.forEach(item => {
            if (!keys.includes(item.key)) {
              searchlist.push(item)
            }
          })
        }
        if (searchlist.filter(cell => cell.required && cell.value === '').length > 0) {
          item.setting.sync = 'false'
          item.setting.onload = 'false'
        } else {
          let searchlist = []
          if (item.search && item.search.length > 0) {
            searchlist = Utils.initMainSearch(item.search)
          }
          let _empty = searchlist.filter(cell => cell.required && (!cell.value || cell.value.length === 0)).length > 0
          if (_empty) {
            item.setting.sync = 'false'
            item.setting.onload = 'false'
          } else {
            if (item.setting.useMSearch) {
              let keys = searchlist.map(item => item.key)
              _mainSearch.forEach(item => {
                if (!keys.includes(item.key)) {
                  searchlist.push(item)
                }
              })
            }
            params.push(this.getDefaultParam(item, searchlist))
          }
          params.push(this.getDefaultParam(item, searchlist))
        }
      } else {
        item.setting.sync = 'false'
@@ -312,7 +303,7 @@
      } else if (item.type === 'search') {
        return (
          <Col span={item.width} key={item.uuid}>
            <MainSearch config={item} mainSearch={mainSearch} menuType={menuType} refreshdata={this.resetSearch} />
            <MainSearch config={item} menuType={menuType} refreshdata={this.resetSearch} />
          </Col>
        )
      } else if (item.type === 'tabs') {
src/tabviews/custom/index.jsx
@@ -191,9 +191,7 @@
        })
      }
      let isEmpty = mainSearch.filter(item => item.required && (!item.value || item.value.length === 0)).length > 0
      config.components = this.formatSetting(config.components, params, mainSearch, inherit, regs, isEmpty)
      config.components = this.formatSetting(config.components, params, mainSearch, inherit, regs)
      this.setState({
        BID: BID,
@@ -715,7 +713,7 @@
  }
  // 格式化默认设置
  formatSetting = (components, params, mainSearch, inherit, regs, isEmpty) => {
  formatSetting = (components, params, mainSearch, inherit, regs) => {
    return components.map(component => {
      if (component.type === 'tabs') {
        component.subtabs = component.subtabs.map(tab => {
@@ -790,31 +788,24 @@
      // dataName 系统生成的数据源名称
      // pageable 是否分页,组件属性,不分页的组件才可以统一查询
      if (component.floor === 1 && component.dataName && (!component.pageable || (component.pageable && !component.setting.laypage)) && component.setting.onload === 'true' && component.setting.sync === 'true') {
        if (isEmpty && component.setting.useMSearch) {
        let searchlist = []
        if (component.search && component.search.length > 0) {
          searchlist = Utils.initMainSearch(component.search)
        }
        if (component.setting.useMSearch) {
          let keys = searchlist.map(item => item.key)
          mainSearch.forEach(item => {
            if (!keys.includes(item.key)) {
              searchlist.push(item)
            }
          })
        }
        if (searchlist.filter(item => item.required && item.value === '').length > 0) {
          component.setting.sync = 'false'
          component.setting.onload = 'false'
        } else {
          let searchlist = []
          if (component.search && component.search.length > 0) {
            searchlist = Utils.initMainSearch(component.search)
          }
          let _empty = searchlist.filter(item => item.required && (!item.value || item.value.length === 0)).length > 0
          if (_empty) {
            component.setting.sync = 'false'
            component.setting.onload = 'false'
          } else {
            if (component.setting.useMSearch) {
              let keys = searchlist.map(item => item.key)
              mainSearch.forEach(item => {
                if (!keys.includes(item.key)) {
                  searchlist.push(item)
                }
              })
            }
            params.push(this.getDefaultParam(component, searchlist))
          }
          params.push(this.getDefaultParam(component, searchlist))
        }
      } else if (component.floor === 1) {
        component.setting.sync = 'false'
@@ -1083,7 +1074,7 @@
      } else if (item.type === 'search') {
        return (
          <Col span={item.width} key={item.uuid}>
            <MainSearch config={item} data={data} BID={_bid} mainSearch={mainSearch} menuType={menuType} refreshdata={this.resetSearch} />
            <MainSearch config={item} BID={BID} menuType={menuType} refreshdata={this.resetSearch} />
          </Col>
        )
      } else if (item.type === 'tabs') {
src/tabviews/subtable/index.jsx
@@ -361,17 +361,17 @@
      searches = [...mainSearch, ...searches]
    }
    let requireFields = []
    if (hasReqFields) {
      requireFields = searches.filter(item => item.required && item.value === '')
      let requireFields = searches.filter(item => item.required && item.value === '')
      if (requireFields.length > 0) {
        this.setState({
          loading: false
        })
        return
      }
    }
    
    if (requireFields.length > 0) {
      this.setState({
        loading: false
      })
      return
    } else if (this.props.Tab.supMenu && !BID) { // 主表ID不存在时,不查询子表
    if (this.props.Tab.supMenu && !BID) { // 主表ID不存在时,不查询子表
      this.setState({
        data: [],
        selectedData: [],
src/tabviews/subtabtable/index.jsx
@@ -333,18 +333,17 @@
      searches = [...mainSearch, ...searches]
    }
    let requireFields = []
    if (hasReqFields) {
      requireFields = searches.filter(item => item.required && item.value === '')
      let requireFields = searches.filter(item => item.required && item.value === '')
      if (requireFields.length > 0) {
        this.setState({
          loading: false
        })
        return
      }
    }
    if (requireFields.length > 0) {
      this.setState({
        loading: false
      })
      return
    } else if (window.GLOB.systemType === 'production' && setting.interType === 'custom' && !setting.proInterface) {
    if (window.GLOB.systemType === 'production' && setting.interType === 'custom' && !setting.proInterface) {
      notification.warning({
        top: 92,
        message: '未设置正式系统地址!',
src/templates/modalconfig/settingform/index.jsx
@@ -91,7 +91,7 @@
            <Form.Item label="宽度(%)">
              {getFieldDecorator('width', {
                initialValue: config.setting.width
              })(<InputNumber min={10} max={90} precision={0} />)}
              })(<InputNumber min={10} max={90} precision={0} onPressEnter={this.handleSubmit}/>)}
            </Form.Item>
          </Col>
          <Col span={12}>
src/templates/zshare/formconfig.jsx
@@ -696,6 +696,7 @@
      key: 'advanced',
      label: '高级搜索',
      initVal: card.advanced || 'false',
      forbid: sessionStorage.getItem('appType') === 'mob',
      options: [{
        value: 'true',
        text: Formdict['model.true']
src/utils/option.js
@@ -694,8 +694,11 @@
    'play-circle',
    'login',
    'logout',
    'search',
    'fullscreen',
    'fullscreen-exit'
    'fullscreen-exit',
    'download',
    'upload'
  ],
  hint: [
    'question',
@@ -808,9 +811,8 @@
    'woman',
    'team',
    'poweroff',
    'search',
    'shopping-cart',
    'link'
    'link',
  ]
}
src/views/mobdesign/index.scss
@@ -125,6 +125,25 @@
    background-size: 100% 100%;
    padding: 25px 13px 40px;
    border-radius: 30px;
    .main-search-edit-list {
      .page-card > div > .ant-form-item {
        display: flex;
        >.ant-form-item-label {
          width: 70px;
        }
        >.ant-form-item-control-wrapper {
          flex: 1;
        }
        .ant-form-item-label > label::after {
          content: ' ';
        }
      }
      .page-card.date .ant-form-item, .page-card.datemonth .ant-form-item {
        // box-shadow: 0px 1px 1px #f0f0f0;
        border-bottom: 1px solid #f0f0f0;
      }
    }
  }
  .menu-control {
    position: fixed;
@@ -181,10 +200,7 @@
    background: #959595;
    padding: 50px 0px 0px;
    overflow-y: auto;
    .menu-shell-inner {
      min-height: 100vh;
      margin: 0 auto;
    }
  }
  .menu-body.saving {
    .anticon-tool {