king
2022-11-29 b0c7a660750a8b29e7f8b3a648296d56c50fd2ca
Merge branch 'develop'
33个文件已修改
4个文件已添加
778 ■■■■ 已修改文件
src/assets/mobimg/share.jpg 补丁 | 查看 | 原始文档 | blame | 历史
src/components/mk-icon/index.jsx 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/mkIcon/index.jsx 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/mkIcon/index.scss 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/form/formaction/index.jsx 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/share/actioncomponent/dragaction/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/verifycard/index.jsx 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/verifycard/utils.jsx 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/components/menubar/normal-menubar/index.scss 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/components/sharecode/index.jsx 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/components/sharecode/index.scss 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/components/sharecode/options.jsx 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/mobshell/card.jsx 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/mobshell/index.jsx 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/modulesource/option.jsx 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/calendar/index.jsx 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/form/simple-form/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/form/step-form/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/form/tab-form/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/table/normal-table/index.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/formtab/index.jsx 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtable/index.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtabtable/index.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/treepage/index.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/excelInbutton/index.jsx 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/normalbutton/index.jsx 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/mutilform/index.jsx 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/verifycard/customform/index.jsx 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/verifycard/customscript/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/verifycard/index.jsx 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/billprint/index.jsx 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/billprint/index.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/design/header/editfirstmenu/index.jsx 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/design/index.jsx 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/design/sidemenu/editsecmenu/index.jsx 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/design/sidemenu/editthdmenu/index.jsx 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/mobimg/share.jpg
src/components/mk-icon/index.jsx
@@ -464,11 +464,15 @@
  render() {
    const { type, ...resProps } = this.props
    if (!type || !MkIcons[type]) return null
    return (
      MkIcons[type](resProps)
    )
    if (!type) {
      return null
    } else if (MkIcons[type]) {
      return (
        MkIcons[type](resProps)
      )
    } else {
      return <span className={'anticon ' + (resProps.className || '')} style={resProps.style || null} dangerouslySetInnerHTML={{ __html: type }}></span>
    }
  }
}
export default MkIcon
src/components/mkIcon/index.jsx
@@ -1,13 +1,15 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Modal, Row, Col, Button } from 'antd'
import { CloseCircleFilled } from '@ant-design/icons'
import { Modal, Row, Col, Button, Tabs, notification } from 'antd'
import { CloseCircleFilled, RedoOutlined } from '@ant-design/icons'
import Api from '@/api'
import { minkeIconSystem } from '@/utils/option.js'
import MkIcon from '@/components/mk-icon'
import './index.scss'
const { TabPane } = Tabs
// ['direction', 'edit', 'normal', 'data', 'hint']
class MkEditIcon extends Component {
@@ -19,6 +21,7 @@
    selectIcon: '',
    allowClear: false,
    icons: [],
    cusicons: [],
    visible: false
  }
@@ -42,6 +45,16 @@
    this.setState({selectIcon: val, allowClear: this.props.allowClear === true, icons})
  }
  componentDidMount() {
    if (!window.GLOB.designView) {
      if (sessionStorage.getItem('systemIcons')) {
        this.setState({cusicons: JSON.parse(sessionStorage.getItem('systemIcons'))})
      } else {
        this.getIcons()
      }
    }
  }
  shouldComponentUpdate (nextProps, nextState) {
    return !is(fromJS(this.state), fromJS(nextState))
  }
@@ -51,8 +64,33 @@
    this.props.onChange(val)
  }
  getIcons = () => {
    Api.getSystemConfig({ func: 's_get_icons' }).then(res => {
      if (!res.status) {
        notification.warning({
          top: 92,
          message: res.message,
          duration: 5
        })
        sessionStorage.setItem('systemIcons', JSON.stringify([]))
        return
      } else if (!res.data) {
        return
      }
      let icons = res.data.map(item => {
        item.icon_svg = window.decodeURIComponent(window.atob(item.icon_svg))
        return item
      })
      sessionStorage.setItem('systemIcons', JSON.stringify(icons))
      this.setState({cusicons: icons})
    })
  }
  render() {
    const { selectIcon, visible, icons, allowClear } = this.state
    const { selectIcon, visible, icons, allowClear, cusicons } = this.state
    return (
      <div className="mk-icon-box">
@@ -60,8 +98,8 @@
        <MkIcon className="trigger" onClick={() => this.setState({visible: true})} type="swap"/>
        {allowClear && selectIcon ? <CloseCircleFilled className="close" onClick={() => this.checkIcon('')}/> : null}
        <Modal
          wrapClassName="popview-modal mk-icon-wrap"
          title={'图标选择'}
          wrapClassName="mk-pop-modal mk-icon-wrap"
          // title={'图标选择'}
          visible={visible}
          width={800}
          maskClosable={false}
@@ -71,11 +109,27 @@
          ]}
          destroyOnClose
        >
          <Row>
            {icons.map(icon => <Col className={icon === selectIcon ? 'active' : ''} key={icon} span={4}>
              <MkIcon onClick={() => this.checkIcon(icon)} type={icon} />
            </Col>)}
          </Row>
          <Tabs className={cusicons.length > 0 ? 'dubble-tabs' : ''}>
            <TabPane tab="系统" key="setting">
              <Row>
                {icons.map(icon => <Col className={icon === selectIcon ? 'active' : ''} key={icon} span={4}>
                  <MkIcon onClick={() => this.checkIcon(icon)} type={icon} />
                </Col>)}
              </Row>
            </TabPane>
            <TabPane tab={
              <span className="tab-control">
                <RedoOutlined onClick={(e) => {this.getIcons()}}/>
                自定义
              </span>
            } key="scripts">
              <Row>
                {cusicons.map(icon => <Col key={icon.id} span={4} onClick={() => this.checkIcon(icon.icon_svg)}>
                  <MkIcon type={icon.icon_svg} />
                </Col>)}
              </Row>
            </TabPane>
          </Tabs>
        </Modal>
      </div>
    )
src/components/mkIcon/index.scss
@@ -49,9 +49,6 @@
  clear: both;
}
.mk-icon-wrap {
  .ant-modal {
    top: 50px!important;
  }
  .ant-col {
    text-align: center;
    line-height: 55px;
@@ -65,4 +62,39 @@
      color: #1890ff;
    }
  }
  .tab-control {
    position: relative;
    .anticon-redo {
      display: none;
      position: absolute;
      left: -20px;
      top: 0px;
    }
  }
  .ant-tabs-tab-active.ant-tabs-tab {
    .tab-control {
      .anticon-redo {
        display: inline-block;
      }
    }
  }
  .ant-tabs-nav .ant-tabs-tab {
    padding: 12px 20px;
  }
  .ant-tabs-top.dubble-tabs {
    .ant-tabs-bar {
      padding-top: 10px!important;
    }
  }
  .ant-tabs-top:not(.dubble-tabs) {
    .ant-tabs-top-bar {
      border-bottom: 0px;
      .ant-tabs-nav-container {
        display: none;
      }
    }
    .ant-tabs-content {
      max-height: calc(100vh - 180px)!important;
    }
  }
}
src/menu/components/form/formaction/index.jsx
@@ -63,6 +63,8 @@
      group.subButton.style = style
    } else if (card.type === 'next') {
      group.nextButton.style = style
    } else if (card.type === 'close') {
      group.closeButton.style = style
    }
    this.props.updateconfig(group)
src/menu/components/share/actioncomponent/dragaction/index.jsx
@@ -114,7 +114,7 @@
        newcard.focus = true
        newcard.label = 'button'
        newcard.verify = null
        newcard.show = 'link'
        newcard.show = 'button'
        newcard.Ot = 'requiredSgl'
        newcard.OpenType = item.value
        newcard.class = 'primary'
src/menu/datasource/verifycard/index.jsx
@@ -595,6 +595,11 @@
      return
    }
    if (change && columns.length === 0) {
      reject()
      return
    }
    if ((setting.interType === 'system' && setting.execute !== 'false') || _scripts.length > 0) {
      let timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      let r = SettingUtils.getDebugSql(setting, _scripts, columns, searches, defaultSearch, timestamp)
src/menu/datasource/verifycard/utils.jsx
@@ -22,6 +22,10 @@
      })
    }
    if (!arr_field) {
      arr_field = '*'
    }
    if (setting.interType === 'system' && setting.execute !== 'false') {
      _dataresource = setting.dataresource || ''
    }
@@ -161,7 +165,7 @@
    let sumSql = ''
    if (arr_field && _dataresource && /\/\*\$sum@/ig.test(_dataresource)) {
    if (_dataresource && /\/\*\$sum@/ig.test(_dataresource)) {
      let _sql = _dataresource.replace(/\/\*\$sum@|@sum\$\*\//ig, '')
      _sql = `/*system_query*/${_sql} ${_search}`
      if (_customScript) {
@@ -180,7 +184,7 @@
    }
    // 数据源处理, 存在显示列时 
    if (arr_field && _dataresource) {
    if (_dataresource) {
      if (/\s/.test(_dataresource)) {
        _dataresource = '(' + _dataresource + ') tb'
      }
@@ -234,7 +238,7 @@
      sumSql = sumSql.replace(/\n/g, ' ')
    }
    sql = sql.replace(/\n/g, ' ')
    return { error, sql, sumSql, errors: errors.join(';') }
  }
}
src/mob/components/menubar/normal-menubar/index.scss
@@ -89,6 +89,13 @@
      }
    }
  }
  .grid-layout {
    >.ant-col {
      display: inline-block;
      float: none;
      vertical-align: top;
    }
  }
}
.menu-menubar-edit-box::after {
  display: block;
src/mob/components/sharecode/index.jsx
New file
@@ -0,0 +1,129 @@
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Popover } from 'antd'
import { ToolOutlined, EditOutlined, FontColorsOutlined, DeleteOutlined } from '@ant-design/icons'
import { resetStyle } from '@/utils/utils-custom.js'
import asyncIconComponent from '@/utils/asyncIconComponent'
import getWrapForm from './options'
import MKEmitter from '@/utils/events.js'
import ShareImg from '@/assets/mobimg/share.jpg'
import './index.scss'
const NormalForm = asyncIconComponent(() => import('@/components/normalform'))
class ShareComponent extends Component {
  static propTpyes = {
    card: PropTypes.object,
    updateConfig: PropTypes.func,
    deletecomponent: PropTypes.func
  }
  state = {}
  /**
   * @description 搜索条件初始化
   */
  UNSAFE_componentWillMount () {
    const { card } = this.props
    if (card.isNew) {
      let _card = {
        uuid: card.uuid,
        type: card.type,
        width: 24,
        name: card.name,
        subtype: card.subtype,
        wrap: { name: card.name, width: 24 },
        style: {marginLeft: '8px', marginRight: '8px', marginTop: '8px', marginBottom: '8px', paddingLeft: '20px', paddingRight: '20px', paddingTop: '20px', paddingBottom: '20px'}
      }
      this.setState({
        card: _card
      })
      this.props.updateConfig(_card)
    } else {
      this.setState({
        card: fromJS(card).toJS()
      })
    }
  }
  /**
   * @description 组件销毁,清除state更新
   */
  componentWillUnmount () {
    this.setState = () => {
      return
    }
  }
  shouldComponentUpdate (nextProps, nextState) {
    return !is(fromJS(this.state), fromJS(nextState))
  }
  getStyle = (style) => {
    let _card = {...this.state.card, style}
    this.setState({
      card: _card
    })
    this.props.updateConfig(_card)
  }
  changeStyle = () => {
    const { card } = this.state
    MKEmitter.emit('changeStyle', ['border', 'padding', 'margin', 'shadow', 'clear'], card.style, this.getStyle)
  }
  /**
   * @description 卡片行外层信息更新(数据源,样式等)
   */
  updateComponent = (component) => {
    this.setState({
      card: component
    })
    component.width = component.wrap.width
    component.name = component.wrap.name
    this.props.updateConfig(component)
  }
  getWrapForms = () => {
    const { wrap } = this.state.card
    return getWrapForm(wrap)
  }
  updateWrap = (res) => {
    this.updateComponent({...this.state.card, wrap: res})
  }
  render() {
    const { card } = this.state
    let _style = resetStyle(card.style)
    return (
      <div className="share-wrap" id={card.uuid} style={_style}>
        <div className="share-image" style={{backgroundImage: `url('${ShareImg}')`}}></div>
        <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
          <div className="mk-popover-control">
            <NormalForm title="设置" width={800} update={this.updateWrap} getForms={this.getWrapForms}>
              <EditOutlined style={{color: '#1890ff'}} title="编辑"/>
            </NormalForm>
            <FontColorsOutlined className="style" title="调整样式" onClick={this.changeStyle}/>
            <DeleteOutlined className="close" onClick={() => this.props.deletecomponent(card.uuid)} />
          </div>
        } trigger="hover">
          <ToolOutlined />
        </Popover>
        <div className="component-name"><div className="center">{card.name}</div></div>
      </div>
    )
  }
}
export default ShareComponent
src/mob/components/sharecode/index.scss
New file
@@ -0,0 +1,35 @@
.share-wrap {
  min-height: 84px;
  position: relative;
  background: #ffffff;
  overflow: hidden;
  >.anticon-tool {
    position: absolute;
    z-index: 3;
    font-size: 16px;
    right: 1px;
    top: 1px;
    cursor: pointer;
    padding: 5px;
    background: rgba(255, 255, 255, 0.55);
  }
  .share-image {
    background: #ffffff;
    overflow: hidden;
    background-repeat: no-repeat;
    background-size: cover;
    background-position: center;
    padding-top: 100%;
  }
}
.share-wrap::after {
  display: block;
  content: ' ';
  clear: both;
}
.share-wrap:hover {
  z-index: 1;
  box-shadow: 0px 0px 4px #1890ff;
}
src/mob/components/sharecode/options.jsx
New file
@@ -0,0 +1,58 @@
/**
 * @description Wrap表单配置信息
 */
export default function (wrap) {
  let menulist = sessionStorage.getItem('appMenus')
  if (menulist) {
    try {
      menulist = JSON.parse(menulist)
    } catch (e) {
      menulist = []
    }
  } else {
    menulist = []
  }
  const wrapForm = [
    {
      type: 'text',
      field: 'name',
      label: '组件名称',
      initval: wrap.name || '',
      tooltip: '用于组件间的区分。',
      required: true
    },
    {
      type: 'number',
      field: 'width',
      label: '宽度',
      initval: wrap.width || 24,
      tooltip: '栅格布局,每行等分为24列。',
      min: 1,
      max: 24,
      precision: 0,
      required: true
    },
    {
      type: 'select',
      field: 'linkMenuId',
      label: '关联菜单',
      initval: wrap.linkMenuId || '',
      tooltip: '可自定义分享菜单,空值时为当前页面。',
      required: false,
      options: menulist
    },
    {
      type: 'color',
      field: 'color',
      label: '颜色',
      initval: wrap.color || '#000000',
      tooltip: '小程序中无效。',
      isHex: true,
      required: true
    },
  ]
  return wrapForm
}
src/mob/mobshell/card.jsx
@@ -30,6 +30,7 @@
const Balcony = asyncComponent(() => import('@/menu/components/card/balcony'))
const Timeline = asyncComponent(() => import('@/menu/components/timeline/normal-timeline'))
const OfficialAccount = asyncComponent(() => import('@/mob/components/official'))
const ShareCode = asyncComponent(() => import('@/mob/components/sharecode'))
const Iframe = asyncComponent(() => import('@/menu/components/iframe'))
const Card = ({ id, card, moveCard, findCard, delCard, updateConfig }) => {
@@ -142,6 +143,8 @@
      return (<OfficialAccount card={card} updateConfig={updateConfig} deletecomponent={delCard}/>)
    } else if (card.type === 'iframe') {
      return (<Iframe card={card} updateConfig={updateConfig} deletecomponent={delCard}/>)
    } else if (card.type === 'sharecode') {
      return (<ShareCode card={card} updateConfig={updateConfig} deletecomponent={delCard}/>)
    }
  }
src/mob/mobshell/index.jsx
@@ -142,6 +142,7 @@
        balcony: '浮动卡',
        timeline: '时间轴',
        officialAccount: '关注公众号',
        sharecode: '分享码',
        login: '登录'
      }
      let i = 1
src/mob/modulesource/option.jsx
@@ -28,6 +28,7 @@
import timeline from '@/assets/mobimg/timeline.png'
import officialAccount from '@/assets/mobimg/guanzhu.jpg'
import Iframe from '@/assets/img/newpage.jpg'
import Share from '@/assets/mobimg/share.jpg'
// 组件配置信息
export const menuOptions = [
@@ -62,5 +63,6 @@
  { type: 'menu', url: group, component: 'group', subtype: 'normalgroup', title: '分组', width: 24 },
  { type: 'menu', url: Login, component: 'login', subtype: 'normallogin', title: '注册/登录', width: 24 },
  { type: 'menu', url: officialAccount, component: 'officialAccount', subtype: 'officialAccount', title: '关注公众号(小程序中)', width: 24, adapter: 'mini' },
  { type: 'menu', url: Share, component: 'sharecode', subtype: 'sharecode', title: '分享码', width: 24 },
  { type: 'menu', url: Iframe, component: 'iframe', subtype: 'iframe', title: 'iframe', width: 24 }
]
src/tabviews/calendar/index.jsx
@@ -104,11 +104,6 @@
      }
      // 权限过滤
      if (!window.GLOB.mkHS) {
        if (config.tab && !window.GLOB.mkActions[config.tab.linkTab]) {
          config.tab = null
        }
      }
      if (config.tab) {
        config.tab.uuid = Utils.getuuid()
      }
src/tabviews/custom/components/form/simple-form/index.jsx
@@ -288,8 +288,6 @@
  render() {
    const { config, loading, BID, BData, data, group, dict } = this.state
    if (config.setting.supModule && !BID) return null
    return (
      <div className="custom-simple-form-box" id={'anchor' + config.uuid} style={{...config.style}}>
        {loading ?
@@ -305,6 +303,7 @@
          dict={dict}
          data={data}
          action={group}
          unload={config.setting.supModule && !BID}
          inputSubmit={() => this.mkFormSubmit(group.uuid)}
          wrappedComponentRef={(inst) => this.formRef = inst}
        /> : null}
src/tabviews/custom/components/form/step-form/index.jsx
@@ -380,8 +380,6 @@
  render() {
    const { config, loading, BID, BData, data, group, dict, step } = this.state
    if (config.setting.supModule && !BID) return null
    return (
      <div className="custom-normal-form-box" id={'anchor' + config.uuid} style={{...config.style}}>
        {loading ?
@@ -406,6 +404,7 @@
          dict={dict}
          data={data}
          action={group}
          unload={config.setting.supModule && !BID}
          inputSubmit={() => this.mkFormSubmit(group.uuid)}
          wrappedComponentRef={(inst) => this.formRef = inst}
        /> : null}
src/tabviews/custom/components/form/tab-form/index.jsx
@@ -300,8 +300,6 @@
  render() {
    const { config, loading, BID, BData, data, group, dict } = this.state
    if (config.setting.supModule && !BID) return null
    return (
      <div className="custom-tab-form-box" id={'anchor' + config.uuid} style={{...config.style}}>
        {loading ?
@@ -323,6 +321,7 @@
          dict={dict}
          data={data}
          action={group}
          unload={config.setting.supModule && !BID}
          inputSubmit={() => this.mkFormSubmit(group.uuid)}
          wrappedComponentRef={(inst) => this.formRef = inst}
        /> : null}
src/tabviews/custom/components/table/normal-table/index.jsx
@@ -714,7 +714,7 @@
              BData={BData}
              columns={config.columns}
              selectedData={selectedData}
            /> : <div style={{height: '25px'}}></div>}
            /> : <div className="mk-action-space" style={{height: '25px'}}></div>}
            <div className="main-table-box">
              <MainTable
                setting={setting}
@@ -743,7 +743,7 @@
            BData={BData}
            columns={config.columns}
            selectedData={selectedData}
          /> : <div style={{height: '15px'}}></div>}
          /> : <div className="mk-action-space" style={{height: '25px'}}></div>}
          <div className={'main-table-box ' + (!actions || actions.length === 0 ? 'no-action' : '')}>
            <MainTable
              setting={setting}
src/tabviews/formtab/index.jsx
@@ -102,28 +102,15 @@
        config.tabgroups = _tabgroups
      }
      if (!window.GLOB.mkHS) {
        config.action = config.action.filter(item => window.GLOB.mkActions[item.uuid])
        config.tabgroups.forEach(group => {
          group.sublist = group.sublist.filter(tab => {
            if (tab.supMenu === 'mainTable') {
              tab.supMenu = MenuID
            }
            tab.ContainerId = this.state.ContainerId
            return window.GLOB.mkActions[tab.linkTab]
          })
      config.tabgroups.forEach(group => {
        group.sublist = group.sublist.map(tab => {
          if (tab.supMenu === 'mainTable') {
            tab.supMenu = MenuID
          }
          tab.ContainerId = this.state.ContainerId
          return tab
        })
      } else {
        config.tabgroups.forEach(group => {
          group.sublist = group.sublist.filter(tab => {
            if (tab.supMenu === 'mainTable') {
              tab.supMenu = MenuID
            }
            tab.ContainerId = this.state.ContainerId
            return true
          })
        })
      }
      })
      // 按钮类型兼容
      config.action = config.action.map(item => {
src/tabviews/subtable/index.jsx
@@ -134,11 +134,7 @@
      config = updateSubTable(config)
      // 权限过滤
      if (!window.GLOB.mkHS) {
        config.action = config.action.filter(item => item.hidden !== 'true' && window.GLOB.mkActions[item.uuid])
      } else {
        config.action = config.action.filter(item => item.hidden !== 'true')
      }
      config.action = config.action.filter(item => item.hidden !== 'true')
      config.search = Utils.initSearchVal(config.search)
src/tabviews/subtabtable/index.jsx
@@ -127,11 +127,7 @@
      }
      // 权限过滤
      if (!window.GLOB.mkHS) {
        config.action = config.action.filter(item => item.hidden !== 'true' && window.GLOB.mkActions[item.uuid])
      } else {
        config.action = config.action.filter(item => item.hidden !== 'true')
      }
      config.action = config.action.filter(item => item.hidden !== 'true')
      config.search = Utils.initSearchVal(config.search)
src/tabviews/treepage/index.jsx
@@ -115,7 +115,7 @@
      // 权限过滤
      config.tabgroups.forEach(group => {
        group.sublist = group.sublist.filter(tab => {
        group.sublist = group.sublist.map(tab => {
          if (tab.supMenu === 'mainTable' || (!tab.supMenu && tab.level === 0)) {
            tab.isTreeNode = true
          }
@@ -124,8 +124,8 @@
          }
          tab.ContainerId = this.state.ContainerId
          return window.GLOB.mkActions[tab.linkTab]}
        )
          return tab
        })
      })
      let _tabgroups = []
src/tabviews/zshare/actionList/excelInbutton/index.jsx
@@ -14,6 +14,8 @@
import MkIcon from '@/components/mk-icon'
// import './index.scss'
const { confirm } = Modal
class ExcelInButton extends Component {
  static propTpyes = {
    BID: PropTypes.string,            // 主表ID
@@ -337,29 +339,86 @@
      
      param.excel_in_type = 'true'
      param.LText1 = Utils.formatOptions(result.insert)
      param.LText2 = Utils.formatOptions(result.bottom)
      param.LText = Utils.formatOptions(result.sql)
      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      param.LText2 = result.bottom
      param.LText = result.sql
      let unCheckParam = null
      if (/\$check@|@check\$/ig.test(param.LText2) || /\$check@|@check\$/ig.test(param.LText)) {
        unCheckParam = fromJS(param).toJS()
        param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
        param.LText2 = param.LText2.replace(/\$check@|@check\$/ig, '')
      }
      param.LText2 = Utils.formatOptions(param.LText2)
      param.LText = Utils.formatOptions(param.LText)
      param.secretkey = Utils.encrypt(param.LText, param.timestamp)
      if (window.GLOB.mkHS && param.timestamp) { // 云端验证
        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
      }
      param.menuname = btn.logLabel
      if (window.GLOB.probation) {
        param.s_debug_type = 'Y'
      }
      Api.genericInterface(param).then((res) => {
        if (res.status) {
          this.execSuccess(res)
        } else {
          this.execError(res)
      if (unCheckParam) {
        unCheckParam.LText = unCheckParam.LText.replace(/\$check@/ig, '/*').replace(/@check\$/ig, '*/')
        unCheckParam.LText = Utils.formatOptions(unCheckParam.LText)
        unCheckParam.LText2 = unCheckParam.LText2.replace(/\$check@/ig, '/*').replace(/@check\$/ig, '*/')
        unCheckParam.LText2 = Utils.formatOptions(unCheckParam.LText2)
        unCheckParam.secretkey = Utils.encrypt(unCheckParam.LText, unCheckParam.timestamp)
        unCheckParam.menuname = btn.logLabel
        if (window.GLOB.probation) {
          unCheckParam.s_debug_type = 'Y'
        }
      }, () => {
        this.execError({})
      })
        Api.genericInterface(param).then(res => {
          if (res.status) {
            this.execSuccess(res)
          } else if (res.ErrCode === 'C') {
            const _this = this
            confirm({
              title: '继续执行?',
              content: res.message,
              onOk() {
                return new Promise(resolve => {
                  Api.genericInterface(unCheckParam).then(result => {
                    if (result.status) {
                      _this.execSuccess(result)
                    } else {
                      _this.execError(result)
                    }
                    resolve()
                  })
                })
              },
              onCancel() {
                _this.execError(res)
              }
            })
          } else {
            this.execError(res)
          }
        }, () => {
          this.execError({})
        })
      } else {
        Api.genericInterface(param).then((res) => {
          if (res.status) {
            this.execSuccess(res)
          } else {
            this.execError(res)
          }
        }, () => {
          this.execError({})
        })
      }
    } else if (btn.intertype === 'inner' && btn.innerFunc) { // 自定义存储过程
      param.func = btn.innerFunc
src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -42,7 +42,6 @@
    loadingTotal: '',
    disabled: false,
    hidden: false,
    checkParam: null,
    autoMatic: false,
    check: false
  }
@@ -402,7 +401,6 @@
      let param = { // 系统存储过程
        func: 'sPC_TableData_InUpDe'
      }
      let check_param = null
      if (this.props.BID) {
        param.BID = this.props.BID
@@ -442,11 +440,9 @@
        param.secretkey = Utils.encrypt('', param.timestamp)
        if (/\$check@|@check\$/ig.test(param.LText)) {
          check_param = fromJS(param).toJS()
          check_param.LText = check_param.LText.replace(/\$check@/ig, '/*')
          check_param.LText = check_param.LText.replace(/@check\$/ig, '*/')
          check_param.LText = Utils.formatOptions(check_param.LText)
          if (btn.intertype === 'system') {
            param.$unCheckParam = fromJS(param).toJS()
          }
          param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
        }
@@ -487,11 +483,9 @@
          param.secretkey = Utils.encrypt('', param.timestamp)
          if (/\$check@|@check\$/ig.test(param.LText)) {
            check_param = fromJS(param).toJS()
            check_param.LText = check_param.LText.replace(/\$check@/ig, '/*')
            check_param.LText = check_param.LText.replace(/@check\$/ig, '*/')
            check_param.LText = Utils.formatOptions(check_param.LText)
            if (btn.intertype === 'system') {
              param.$unCheckParam = fromJS(param).toJS()
            }
            param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
          }
@@ -522,11 +516,9 @@
          param.secretkey = Utils.encrypt('', param.timestamp)
          if (/\$check@|@check\$/ig.test(param.LText)) {
            check_param = fromJS(param).toJS()
            check_param.LText = check_param.LText.replace(/\$check@/ig, '/*')
            check_param.LText = check_param.LText.replace(/@check\$/ig, '*/')
            check_param.LText = Utils.formatOptions(check_param.LText)
            if (btn.intertype === 'system') {
              param.$unCheckParam = fromJS(param).toJS()
            }
            param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
          }
@@ -536,9 +528,6 @@
      if (window.GLOB.mkHS) { // 函数 sPC_TableData_InUpDe 云端验证
        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
        if (check_param) {
          check_param.open_key = Utils.encryptOpenKey(check_param.secretkey, check_param.timestamp)
        }
      }
      param.menuname = btn.logLabel
@@ -547,13 +536,18 @@
        param.s_debug_type = 'Y'
      }
      if (check_param) {
        check_param.menuname = btn.logLabel
        this.setState({checkParam: check_param})
      }
      if (window.GLOB.breakpoint) {
        param.func = 'sPC_TableData_InUpDe_debug'
      }
      if (param.$unCheckParam) {
        param.$unCheckParam.LText = param.$unCheckParam.LText.replace(/\$check@/ig, '/*').replace(/@check\$/ig, '*/')
        param.$unCheckParam.LText = Utils.formatOptions(param.$unCheckParam.LText)
        param.$unCheckParam.menuname = btn.logLabel
        if (window.GLOB.probation) {
          param.$unCheckParam.s_debug_type = 'Y'
        }
      }
      _params.push(param)
@@ -589,11 +583,18 @@
          } else {
            param.LText = param.LText.replace(/@\$|\$@/ig, '')
          }
          param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
          param.exec_type = 'y' // 后台解码
          param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
          param.secretkey = Utils.encrypt('', param.timestamp)
          if (/\$check@|@check\$/ig.test(param.LText)) {
            if (btn.intertype === 'system') {
              param.$unCheckParam = fromJS(param).toJS()
            }
            param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
          }
          param.LText = Utils.formatOptions(param.LText)
        } else if (btn.OpenType === 'pop') { // 表单
          if (index !== 0) {
@@ -629,11 +630,18 @@
            } else {
              param.LText = param.LText.replace(/@\$|\$@/ig, '')
            }
            param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
            param.exec_type = 'y' // 后台解码
            param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
            param.secretkey = Utils.encrypt('', param.timestamp)
            if (/\$check@|@check\$/ig.test(param.LText)) {
              if (btn.intertype === 'system') {
                param.$unCheckParam = fromJS(param).toJS()
              }
              param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
            }
            param.LText = Utils.formatOptions(param.LText)
          } else {
            param.ID = primaryId
@@ -655,11 +663,18 @@
            } else {
              param.LText = param.LText.replace(/@\$|\$@/ig, '')
            }
            param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
            param.exec_type = 'y' // 后台解码
            param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
            param.secretkey = Utils.encrypt('', param.timestamp)
            if (/\$check@|@check\$/ig.test(param.LText)) {
              if (btn.intertype === 'system') {
                param.$unCheckParam = fromJS(param).toJS()
              }
              param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
            }
            param.LText = Utils.formatOptions(param.LText)
          }
        }
@@ -675,6 +690,16 @@
        if (window.GLOB.breakpoint) {
          param.func = 'sPC_TableData_InUpDe_debug'
        }
        if (param.$unCheckParam) {
          param.$unCheckParam.LText = param.$unCheckParam.LText.replace(/\$check@/ig, '/*').replace(/@check\$/ig, '*/')
          param.$unCheckParam.LText = Utils.formatOptions(param.$unCheckParam.LText)
          param.$unCheckParam.menuname = btn.logLabel
          if (window.GLOB.probation) {
            param.$unCheckParam.s_debug_type = 'Y'
          }
        }
        return param
@@ -995,7 +1020,9 @@
        params = this.getInnerParam(data, formdata)
      }
      if (params.length <= 20) {
      if (params[0].$unCheckParam) {
        this.checkLoopRequest(params, btn, _resolve)
      } else if (params.length <= 20) {
        let deffers = params.map((param, i) => {
          return new Promise(resolve => {
            setTimeout(() => {
@@ -1529,6 +1556,69 @@
        } else {
          this.innerLoopRequest(params, btn, _resolve)
        }
      } else {
        this.execError(res)
        _resolve()
      }
    }, () => {
      this.updateStatus()
      _resolve()
    })
  }
  /**
   * @description 数据检验循环执行
   */
  checkLoopRequest = (params, btn, _resolve) => {
    let param = params.shift()
    let unCheckParam = param.$unCheckParam
    delete param.$unCheckParam
    this.setState({
      loadingNumber: params.length
    })
    Api.genericInterface(param).then(res => {
      if (res.status) {
        this.triggerNote(res) // 消息
        if (params.length === 0) {
          this.execSuccess(res)
          _resolve()
        } else {
          this.checkLoopRequest(params, btn, _resolve)
        }
      } else if (res.ErrCode === 'C') {
        const _this = this
        confirm({
          title: '继续执行?',
          content: res.message,
          onOk() {
            return new Promise(resolve => {
              Api.genericInterface(unCheckParam).then(result => {
                if (result.status) {
                  _this.triggerNote(result) // 消息
                  if (params.length === 0) {
                    _this.execSuccess(result)
                    _resolve()
                  } else {
                    _this.checkLoopRequest(params, btn, _resolve)
                  }
                } else {
                  _this.execError(res)
                  _resolve()
                }
                resolve()
              })
            })
          },
          onCancel() {
            _this.execError(res)
            _resolve()
          }
        })
      } else {
        this.execError(res)
        _resolve()
@@ -2245,48 +2335,6 @@
      loadingNumber: '',
      loadingTotal: '',
    })
    if (res.ErrCode === 'C') {
      const _this = this
      if (this.state.checkParam) {
        let param = this.state.checkParam
        confirm({
          title: res.message || res.ErrMesg,
          content: '继续执行?',
          onOk() {
            return new Promise(resolve => {
              Api.genericInterface(param).then((result) => {
                if (result.status) {
                  _this.execSuccess(result)
                } else {
                  _this.execError(result)
                }
                resolve()
              }, () => {
                _this.setState({
                  visible: false
                })
                resolve()
              })
            })
          },
          onCancel() {
            _this.setState({
              visible: false
            })
            if (btn.execError !== 'never') {
              MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execError, btn, '', this.state.selines)
            }
          }
        })
        this.setState({checkParam: null})
        return
      } else {
        Modal.error({
          title: res.message || res.ErrMesg,
        })
      }
    }
    if (btnconfig && btnconfig.setting && btnconfig.setting.errFocus) {
      MKEmitter.emit('mkFC', 'focus', btnconfig.setting.errFocus)
src/tabviews/zshare/mutilform/index.jsx
@@ -35,6 +35,7 @@
    data: PropTypes.any,         // 表格数据
    BID: PropTypes.any,          // 主表ID
    BData: PropTypes.any,        // 主表数据
    unload: PropTypes.any,       // 下拉菜单不加载数据
    inputSubmit: PropTypes.func  // input回车提交
  }
@@ -45,7 +46,7 @@
  record = {}
  componentDidMount () {
    const { action } = this.props
    const { action, unload } = this.props
    let data = {}
    let BData = {}
@@ -506,6 +507,8 @@
    this.record = record
    this.setState({ formlist }, () => {
      if (unload) return
      if (action.setting && action.setting.focus && fieldMap.has(action.setting.focus)) {
        setTimeout(() => {
          MKEmitter.emit('mkFC', 'focus', fieldMap.get(action.setting.focus).uuid)
src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx
@@ -183,7 +183,7 @@
        }
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
        param.LText = param.LText.replace(/@\$|\$@/ig, '').replace(/@(BID|ID|LoginUID|SessionUid|UserID|Appkey|time_id)@/ig, `'${param.timestamp}'`)
        param.LText = param.LText.replace(/@\$|\$@/ig, '').replace(/\$check@|@check\$/ig, '').replace(/@(BID|ID|LoginUID|SessionUid|UserID|Appkey|time_id)@/ig, `'${param.timestamp}'`)
        param.LText = param.LText.replace(/\n/g, ' ')
        
        // 外联数据库替换
src/templates/zshare/verifycard/customform/index.jsx
@@ -106,8 +106,18 @@
        let param = {
          func: 's_debug_sql',
          exec_type: 'y',
          LText: this.props.initsql + values.sql
        }
        param.LText = `${this.props.initsql}
          /* 自定义验证 */
          select @tbid='', @ErrorCode='',@retmsg=''
          select top 1 @tbid='X' from (${values.sql}) a
          If @tbid = ''
          Begin
            select @ErrorCode='${values.errorCode}',@retmsg='${values.errmsg}'
            goto aaa
          end
          aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
        if (window.GLOB.funcs && window.GLOB.funcs.length > 0) {
          window.GLOB.funcs.forEach(item => {
@@ -126,8 +136,10 @@
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
        param.LText = param.LText.replace(/@(BID|ID|LoginUID|SessionUid|UserID|Appkey|time_id)@/ig, `'${param.timestamp}'`)
        console.info(`/* sql 验证 */\n${param.LText.replace(/\n\s{10}/ig, '\n')}`)
        param.LText = param.LText.replace(/\n/g, ' ')
        param.LText = Utils.formatOptions(param.LText)
        param.secretkey = Utils.encrypt('', param.timestamp)
        
src/templates/zshare/verifycard/customscript/index.jsx
@@ -333,7 +333,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 关闭调试。注:调试时字符 $breakpoint_proc@ 将被替换。'}</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/templates/zshare/verifycard/index.jsx
@@ -664,8 +664,8 @@
        resolve(_fields)
      }
    }).then(_fields => {
      let _usefulfields = ['UserName', 'FullName', 'RoleID', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode']
      let _declare = ['@UserName nvarchar(50)', '@FullName nvarchar(50)', '@RoleID nvarchar(512)', '@mk_departmentcode nvarchar(512)', '@mk_organization nvarchar(512)', '@mk_user_type nvarchar(20)', '@mk_nation nvarchar(50)', '@mk_province nvarchar(50)', '@mk_city nvarchar(50)', '@mk_district nvarchar(50)', '@mk_address nvarchar(100)', '@ErrorCode nvarchar(50)', '@retmsg nvarchar(4000)', '@BillCode nvarchar(50)', '@BVoucher nvarchar(50)', '@FIBVoucherDate nvarchar(50)', '@FiYear nvarchar(50)', '@ModularDetailCode nvarchar(50)', '@bid nvarchar(50)']
      let _usefulfields = ['UserName', 'FullName', 'RoleID', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode', 'tbid']
      let _declare = ['@UserName nvarchar(50)', '@FullName nvarchar(50)', '@RoleID nvarchar(512)', '@mk_departmentcode nvarchar(512)', '@mk_organization nvarchar(512)', '@mk_user_type nvarchar(20)', '@mk_nation nvarchar(50)', '@mk_province nvarchar(50)', '@mk_city nvarchar(50)', '@mk_district nvarchar(50)', '@mk_address nvarchar(100)', '@ErrorCode nvarchar(50)', '@retmsg nvarchar(4000)', '@BillCode nvarchar(50)', '@BVoucher nvarchar(50)', '@FIBVoucherDate nvarchar(50)', '@FiYear nvarchar(50)', '@ModularDetailCode nvarchar(50)', '@bid nvarchar(50)', '@tbid nvarchar(50)']
      let _select = ['@UserName=\'\'', '@FullName=\'\'', '@RoleID=\'\'', '@mk_departmentcode=\'\'', '@mk_organization=\'\'', '@mk_user_type=\'\'', '@mk_nation=\'\'', '@mk_province=\'\'', '@mk_city=\'\'', '@mk_district=\'\'', '@mk_address=\'\'', '@ErrorCode=\'\'', '@retmsg=\'\'', '@BillCode=\'\'', '@BVoucher=\'\'', '@FIBVoucherDate=\'\'', '@FiYear=\'\'', '@ModularDetailCode=\'\'', '@bid=\'\'']
      let fieldArr = _usefulfields.map(_f => _f.toLowerCase())
      let hasBid = false
@@ -724,10 +724,8 @@
      let hasColumn = false
      if (columns && columns.length > 0) {
        if (btnTab) { // 表单标签
          if (btnTab.Ot !== 'notRequired' && btnTab.Ot !== 'requiredOnce') {
            hasColumn = true
          }
        } else if (card.Ot !== 'notRequired' && card.Ot !== 'requiredOnce') {
          hasColumn = btnTab.Ot !== 'notRequired'
        } else if (card.Ot !== 'notRequired') {
          hasColumn = true
        }
      }
src/views/billprint/index.jsx
@@ -343,6 +343,7 @@
              })
            }
            component.cols = getColumns(component.cols)
            component.statFields = []
          }
          if (component.wrap && component.wrap.datatype === 'static') {
src/views/billprint/index.scss
@@ -46,6 +46,9 @@
  .g2-tooltip {
    display: none;
  }
  .mk-action-space {
    display: none;
  }
}
.print-page {
src/views/design/header/editfirstmenu/index.jsx
@@ -118,11 +118,11 @@
  }
  
  handleButton = (type) => {
    const that = this
    // 菜单编辑:添加,确定,取消
    let _menuchange = !is(fromJS(this.state.menulist), fromJS(this.props.menulist))
    if (type === 'confirm' && _menuchange) {
      let _this = this
      let param  = {
        func: 'sPC_Menu_SortUpt',
        LText: this.state.menulist.map((item, index) => {
@@ -141,7 +141,7 @@
        onOk() {
          return Api.getSystemConfig(param).then(res => {
            if (res.status) {
              _this.props.reload()
              that.props.reload()
            } else {
              notification.warning({
                top: 92,
@@ -154,13 +154,11 @@
        onCancel() {}
      })
    } else if (type === 'cancel' && _menuchange) {
      let _this = this
      confirm({
        title: '菜单顺序已调整,放弃保存吗?',
        content: '',
        onOk() {
          _this.props.exitEdit()
          that.props.exitEdit()
        },
        onCancel() {}
      })
src/views/design/index.jsx
@@ -7,6 +7,7 @@
import { setGLOBFuncs } from '@/utils/utils.js'
import Sidemenu from './sidemenu'
import '@/assets/css/design.scss'
import './index.scss'
const _locale = sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS
@@ -15,6 +16,7 @@
  componentDidMount() {
    window.debugger = false
    window.GLOB.breakpoint = false
    window.GLOB.designView = true
    sessionStorage.removeItem('breakpoint')
    setGLOBFuncs()
  }
src/views/design/sidemenu/editsecmenu/index.jsx
@@ -106,6 +106,7 @@
  }
  handleSubBtn = (type) => {
    const that = this
    if (type === 'confirm') { // 保存调整后的顺序
      let param  = {
        func: 'sPC_Menu_SortUpt',
@@ -139,13 +140,11 @@
      })
    } else if (type === 'close') { // 退出编辑
      if (this.state.change) {
        let _this = this
        confirm({
          title: '菜单顺序已调整,放弃保存吗?',
          content: '',
          onOk() {
            _this.props.exitEdit()
            that.props.exitEdit()
          },
          onCancel() {}
        })
src/views/design/sidemenu/editthdmenu/index.jsx
@@ -136,6 +136,7 @@
  }
  handleSubBtn = (type) => {
    const that = this
    // 操作按钮:添加、解除冻结、确认及关闭
    if (type === 'confirm') {
      let param  = {
@@ -170,15 +171,12 @@
      })
    } else if (type === 'close') {
      if (this.state.change) {
        let _this = this
        confirm({
          title: '菜单顺序已调整,放弃保存吗?',
          content: '',
          onOk() {
            _this.props.exitEdit()
          },
          onCancel() {}
            that.props.exitEdit()
          }
        })
      } else {
        this.props.exitEdit()