king
2021-01-12 c27d57333ed38c92f595219d2190ea63cef4d182
2021-01-12
21个文件已修改
2个文件已添加
748 ■■■■ 已修改文件
src/api/index.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/search/main-search/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/share/searchcomponent/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/verifycard/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/modalconfig/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/datasource/verifycard/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/index.jsx 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtable/index.jsx 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/settingcomponent/editTable/index.jsx 313 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/settingcomponent/editTable/index.scss 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/settingcomponent/index.jsx 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/settingcomponent/index.scss 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/formtabconfig/index.jsx 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/modalconfig/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/searchcomponent/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/settingcalcomponent/verifycard/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/settingcomponent/settingform/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/treesettingcomponent/settingform/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/verifycard/customform/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/verifycard/customscript/index.jsx 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login/index.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/index.js
@@ -70,7 +70,8 @@
  }
}
window.GLOB.CacheMap = new Map()
window.GLOB.CacheMap = new Map()     // 缓存配置信息
window.GLOB.UserCacheMap = new Map() // 缓存用户自定义设置
axios.interceptors.response.use((response) => {
  if (response.data.ErrCode === 'LoginError') {
src/menu/components/search/main-search/index.jsx
@@ -256,6 +256,7 @@
        let param = {
          func: 's_debug_sql',
          exec_type: 'y',
          LText: res.dataSource
        }
@@ -263,7 +264,7 @@
        
        param.LText = Utils.formatOptions(param.LText)
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
        param.secretkey = Utils.encrypt('', param.timestamp)
        if (window.GLOB.mainSystemApi && res.database === 'sso') {
          param.rduri = window.GLOB.mainSystemApi
src/menu/components/share/searchcomponent/index.jsx
@@ -218,6 +218,7 @@
        let param = {
          func: 's_debug_sql',
          exec_type: 'y',
          LText: res.dataSource
        }
@@ -225,7 +226,7 @@
        
        param.LText = Utils.formatOptions(param.LText)
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
        param.secretkey = Utils.encrypt('', param.timestamp)
        if (window.GLOB.mainSystemApi && res.database === 'sso') {
          param.rduri = window.GLOB.mainSystemApi
src/menu/datasource/verifycard/index.jsx
@@ -594,11 +594,12 @@
      let param = {
        func: 's_debug_sql',
        exec_type: 'y',
        LText: result.sql
      }
      param.LText = Utils.formatOptions(param.LText)
      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      param.secretkey = Utils.encrypt(param.LText, param.timestamp)
      param.secretkey = Utils.encrypt('', param.timestamp)
      
      Api.getLocalConfig(param).then(result => {
        if (result.status) {
src/menu/modalconfig/index.jsx
@@ -313,6 +313,7 @@
        let param = {
          func: 's_debug_sql',
          exec_type: 'y',
          LText: res.dataSource
        }
@@ -320,7 +321,7 @@
        
        param.LText = Utils.formatOptions(param.LText)
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
        param.secretkey = Utils.encrypt('', param.timestamp)
        if (window.GLOB.mainSystemApi && res.database === 'sso') {
          param.rduri = window.GLOB.mainSystemApi
src/mob/datasource/verifycard/index.jsx
@@ -426,11 +426,12 @@
    if ((setting.interType === 'system' && setting.execute !== 'false') || _scripts.length > 0) {
      let param = {
        func: 's_debug_sql',
        exec_type: 'y',
        LText: SettingUtils.getDebugSql(setting, _scripts, columns, searches)
      }
      param.LText = Utils.formatOptions(param.LText)
      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      param.secretkey = Utils.encrypt(param.LText, param.timestamp)
      param.secretkey = Utils.encrypt('', param.timestamp)
      
      Api.getLocalConfig(param).then(result => {
        if (result.status) {
src/tabviews/commontable/index.jsx
@@ -44,7 +44,7 @@
    viewlost: false,      // 页面丢失:1、未获取到配置-页面丢失;2、页面未启用
    lostmsg: '',          // 页面丢失时的提示信息
    config: {},           // 页面配置信息,包括按钮、搜索、显示列、标签等
    userConfig: null,     // 用户自定义设置
    shortcuts: null,      // 快捷键
    searchlist: null,     // 搜索条件
    actions: null,        // 按钮集
    columns: null,        // 显示列
@@ -60,7 +60,6 @@
    search: '',           // 搜索条件数组,使用时需分场景处理
    BIDs: {},             // 上级表id
    pickup: false,        // 主表数据隐藏显示切换
    tabActive: null,      // 标签页展开控制
    chartId: '',          // 展开图表ID
    statFields: [],       // 合计字段
    statFValue: [],       // 合计值
@@ -81,7 +80,7 @@
    if (result.status) {
      let config = ''
      let userConfig = null
      let shortcuts = []
      let _curUserConfig = ''
      try { // 配置信息解析
@@ -94,13 +93,32 @@
      // HS不使用自定义设置
      if (result.LongParamUser && this.props.menuType !== 'HS') {
        try { // 配置信息解析
          userConfig = JSON.parse(window.decodeURIComponent(window.atob(result.LongParamUser)))
          let userConfig = JSON.parse(window.decodeURIComponent(window.atob(result.LongParamUser)))
          userConfig = []
          // if (window.GLOB.UserCacheMap.has(_param)) {
          //   return Promise.resolve(window.GLOB.UserCacheMap.get(_param))
          // } else {
          //   param = this.encryptParam(param)
          //   return new Promise(resolve => {
          //     axios({
          //       url: `/webapi/dostars${param.func ? '/' + param.func : ''}`,
          //       data: param
          //     }).then(res => {
          //       if (res.status) {
          //         window.GLOB.UserCacheMap.set(_param, res)
          //       }
          //       resolve(res)
          //     })
          //   })
          // }
          _curUserConfig = userConfig[this.props.MenuID]
        } catch (e) {
          console.warn('Parse Failure')
          userConfig = null
        }
      }
      console.log(config)
      console.log(shortcuts)
      // 页面配置解析错误时提示
      if (!config) {
@@ -218,8 +236,6 @@
      }
      if (_curUserConfig) {
        config.easyCode = _curUserConfig.easyCode || config.easyCode || ''
        config.action = config.action.map(item => {
          if (_curUserConfig.action[item.uuid]) {
            delete _curUserConfig.action[item.uuid].label
@@ -240,12 +256,6 @@
          return item
        })
      }
      let _tabActive = {} // 筛选展开的tab页
      config.tabgroups.forEach(group => {
        _tabActive[group.uuid] = group.sublist[0].uuid
      })
      let _arrField = []     // 字段集
      let _columns = []      // 显示列
@@ -336,29 +346,13 @@
        return _item
      })
      if (_curUserConfig) {
        _columns = _columns.map(item => {
          if (_curUserConfig.columns[item.uuid]) {
            delete _curUserConfig.columns[item.uuid].label
            item = {...item, ..._curUserConfig.columns[item.uuid]}
          }
          return item
        })
        _columns.sort((pre, next) => {
          return pre.sort - next.sort
        })
      }
      this.setState({
        loadingview: false,
        absFields,
        chartId,
        config,
        statFields,
        userConfig,
        tabActive: _tabActive,
        shortcuts,
        setting: config.setting,
        searchlist: config.search,
        actions: _actions,
@@ -387,8 +381,12 @@
  }
  setShortcut = () => {
    const { actions, userConfig, config } = this.state
    if (!userConfig) return
    const { shortcuts } = this.state
    if (!shortcuts || shortcuts.length === 0) {
      document.onkeydown = () => {}
      return
    }
    document.onkeydown = (event) => {
      let e = event || window.event
@@ -403,56 +401,21 @@
        preKey = 'alt'
      }
      if (!preKey) return
      if (!preKey || !keyCode) return
      let triggerId = ''
      let _shortcut = preKey + keyCode
      actions.some(item => {
        if (Array.isArray(item.shortcut) && preKey === item.shortcut[0] && keyCode === item.shortcut[1]) {
          e.preventDefault()
          triggerId = item.uuid
      shortcuts.some(item => {
        if (item.shortcut === _shortcut) {
          MKEmitter.emit('triggerBtnId', item.uuid)
          let element = item.parentId ? document.getElementById(item.parentId) : '' // 标签切换
          if (element && element.click) {
            element.click()
          }
          return true
        }
        return false
      })
      if (triggerId) {
        MKEmitter.emit('triggerBtnId', triggerId)
        return
      }
      Object.keys(userConfig).some(key => {
        if (key === this.props.MenuID || !userConfig[key].action) return false
        let _actions = userConfig[key].action
        Object.keys(_actions).some(btnkey => {
          let item = _actions[btnkey]
          if (Array.isArray(item.shortcut) && preKey === item.shortcut[0] && keyCode === item.shortcut[1]) {
            e.preventDefault()
            triggerId = btnkey
            let _groupId = ''
            let _ActiveTabId = ''
            config.tabgroups.forEach(group => {
              let _tab = group.sublist.filter(tab => tab.uuid === key)[0]
              if (!_tab) return
              _groupId = group.uuid
              _ActiveTabId = _tab.uuid
            })
            if (_ActiveTabId && this.state.tabActive[_groupId] === _ActiveTabId) {
              MKEmitter.emit('triggerBtnId', triggerId)
              return true
            }
          }
          return false
        })
        if (triggerId) return true
        return false
      })
    }
@@ -884,8 +847,8 @@
  }
  render() {
    const { menuType, MenuName } = this.props
    const { BID, setting, searchlist, pageSize, actions, columns, loadingview, viewlost, pickup, config, userConfig, tabActive, chartId, search, selectedData } = this.state
    const { menuType } = this.props
    const { BID, setting, searchlist, pageSize, actions, columns, loadingview, viewlost, pickup, config, chartId, search, selectedData } = this.state
    return (
      <div className="commontable" id={this.state.ContainerId}>
@@ -920,16 +883,6 @@
                    />
                  </div>
                  <div className="main-table-box">
                    {this.props.menuType !== 'HS' ? <SettingComponent
                      config={config}
                      columns={columns}
                      MenuName={MenuName}
                      dict={this.state.dict}
                      MenuID={this.props.MenuID}
                      permAction={this.props.permAction}
                      userConfig={this.state.userConfig}
                      reloadview={this.reloadview}
                    /> : null}
                    {(setting.tableType === 'radio' || setting.tableType === 'checkbox') && this.state.data && this.state.data.length > 0 ?
                      <Switch title="收起" className="main-pickup" checkedChildren="开" unCheckedChildren="关" defaultChecked={pickup} onChange={this.pickupChange} /> : null
                    }
@@ -986,11 +939,11 @@
          })}
        </Row> : null }
        {setting && config.tabgroups.map(group => (
          <Tabs key={group.uuid} onChange={(key) => this.setState({tabActive: {...tabActive, [group.uuid]: key}})}>
          <Tabs key={group.uuid}>
            {group.sublist.map(_tab => {
              return (
                <TabPane tab={
                  <span>
                  <span id={_tab.uuid}>
                    {_tab.icon ? <Icon type={_tab.icon} /> : null}
                    {_tab.label}
                  </span>
@@ -999,7 +952,6 @@
                    Tab={_tab}
                    MenuID={_tab.linkTab}
                    mainSearch={_tab.searchPass === 'true' ? search : null}
                    userConfig={userConfig ? userConfig[_tab.uuid] : null}
                    SupMenuID={this.props.MenuID}
                    ContainerId={this.state.ContainerId}
                    BID={this.state.BIDs[_tab.supMenu] || ''}
@@ -1012,6 +964,7 @@
          </Tabs>))
        }
        {menuType !== 'HS' ? <PagemsgComponent menu={{MenuName: this.props.MenuName, MenuNo: this.props.MenuNo}} config={config} dict={this.state.dict} /> : null}
        {menuType !== 'HS' ? <SettingComponent config={config} dict={this.state.dict} MenuID={this.props.MenuID} permAction={this.props.permAction}/> : null}
        {viewlost ? <NotFount msg={this.state.lostmsg} /> : null}
      </div>
    )
src/tabviews/subtable/index.jsx
@@ -35,7 +35,6 @@
    mainSearch: PropTypes.any,       // 主表搜索条件
    ContainerId: PropTypes.any,      // 三级菜单Container(html) ID
    handleTableId: PropTypes.func,   // 控制表格数据切换时,更新在主表中的id
    userConfig: PropTypes.any,       // 用户自定义设置
  }
  state = {
@@ -92,7 +91,7 @@
   * @description 获取页面配置信息
   */
  async loadconfig () {
    const { permAction, permMenus, Tab, BID, userConfig } = this.props
    const { permAction, permMenus, Tab, BID } = this.props
    let param = {
      func: 'sPC_Get_LongParam',
@@ -175,11 +174,14 @@
      }
      let chartId = config.charts[0] ? config.charts[0].uuid : ''
      let userConfig = null
      if (window.GLOB.UserCacheMap.has(Tab.uuid)) {
        userConfig = window.GLOB.UserCacheMap.get(Tab.uuid)
      }
      if (userConfig) {
        config.action = config.action.map(item => {
          if (userConfig.action[item.uuid]) {
            delete userConfig.action[item.uuid].label
          if (userConfig[item.uuid]) {
            item = {...item, ...userConfig.action[item.uuid]}
          }
@@ -276,22 +278,6 @@
          valid = false
        }
      })
      // 添加用户显示列设置
      if (userConfig) {
        _columns = _columns.map(item => {
          if (userConfig.columns[item.uuid]) {
            delete userConfig.columns[item.uuid].label
            item = {...item, ...userConfig.columns[item.uuid]}
          }
          return item
        })
        _columns.sort((pre, next) => {
          return pre.sort - next.sort
        })
      }
      config.setting.tabType = 'sub'
      // 数据源信息预处理
src/tabviews/zshare/settingcomponent/editTable/index.jsx
New file
@@ -0,0 +1,313 @@
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import { fromJS } from 'immutable'
import { Table, Form, Icon, Select, Cascader, notification, message } from 'antd'
import zhCN from '@/locales/zh-CN/model.js'
import enUS from '@/locales/en-US/model.js'
import './index.scss'
let eTDict = localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS
const EditableContext = React.createContext()
class EditableCell extends Component {
  getInput = () => {
    const { inputType, options } = this.props
    if (inputType === 'select') {
      return (
        <Select>
          {options.map((item, i) => (<Select.Option key={i} value={item.value}> {item.text} </Select.Option>))}
        </Select>
      )
    } else if (inputType === 'cascader') {
      return (
        <Cascader options={options} placeholder=""/>
      )
    }
  }
  renderCell = (form) => {
    const { getFieldDecorator } = form
    const { editing, dataIndex, title, record, children, className, required, inputType } = this.props
    return (
      <td className={className}>
        {editing ? (
          <Form.Item style={{ margin: 0 }}>
            {getFieldDecorator(dataIndex, {
              rules: [
                {
                  required: required,
                  message: ['number', 'text', 'input'].includes(inputType) ? `${eTDict['form.required.input']} ${title}!` : `${eTDict['form.required.select']} ${title}!`,
                }
              ],
              initialValue: record[dataIndex],
            })(this.getInput())}
          </Form.Item>
        ) : (
          children
        )}
      </td>
    )
  }
  render() {
    return <EditableContext.Consumer>{this.renderCell}</EditableContext.Consumer>
  }
}
class EditTable extends Component {
  static propTpyes = {
    data: PropTypes.any,            // 数据列表
    columns: PropTypes.array,       // 显示列
    onChange: PropTypes.func        // 数据变化
  }
  state = {
    data: [],
    editingKey: '',
    visible: false,
    columns: []
  }
  UNSAFE_componentWillMount () {
    const { data } = this.props
    let columns = fromJS(this.props.columns).toJS()
    columns.push({
      title: '操作',
      dataIndex: 'operation',
      width: '140px',
      render: (text, record) => {
        const { editingKey } = this.state
        const editable = this.isEditing(record)
        return editable ? (
          <div style={{textAlign: 'center', minWidth: '110px'}}>
            <EditableContext.Consumer>
              {form => (
                <span onClick={() => this.save(form, record.uuid)} style={{ marginRight: 8 , color: '#1890ff', cursor: 'pointer'}}>
                  {eTDict['model.save']}
                </span>
              )}
            </EditableContext.Consumer>
            <span style={{ color: '#1890ff', cursor: 'pointer'}} onClick={() => this.cancel(record.uuid)}>{eTDict['model.cancel']}</span>
          </div>
        ) : (
          <div className={'edit-operation-btn' + (editingKey !== '' ? ' disabled' : '')} style={{minWidth: '110px'}}>
            <span className="primary" onClick={() => {editingKey === '' && this.edit(record.uuid)}}><Icon type="edit" /></span>
          </div>
        )
      }
    })
    this.setState({
      data: data || [],
      columns
    })
  }
  isEditing = record => record.uuid === this.state.editingKey
  cancel = () => {
    this.setState({ editingKey: '' })
  }
  copy = (item) => {
    const { type } = this.props
    const { data } = this.state
    if (!data || data.length === 0) {
      message.warning('未获取到配置信息')
      return
    }
    let msg = { key: type }
    if (item) {
      msg.type = 'line'
      msg.data = item
    } else {
      msg.type = 'array'
      msg.data = data
    }
    try {
      msg = window.btoa(window.encodeURIComponent(JSON.stringify(msg)))
    } catch {
      console.warn('Stringify Failure')
      msg = ''
    }
    if (msg) {
      let oInput = document.createElement('input')
      oInput.value = msg
      document.body.appendChild(oInput)
      oInput.select()
      document.execCommand('Copy')
      document.body.removeChild(oInput)
      message.success('复制成功。')
    }
  }
  onSave = (record) => {
    const { columns } = this.state
    const newData = [...this.state.data]
    const index = newData.findIndex(item => record.uuid === item.uuid)
    if (index === -1) {
      notification.warning({
        top: 92,
        message: '数据错误,无法找到行ID!',
        duration: 5
      })
      return
    }
    let unique = true
    columns.forEach(col => {
      if (col.unique !== true || !unique) return
      let _index = newData.findIndex(item => record.uuid !== item.uuid && record[col.dataIndex] === item[col.dataIndex])
      if (_index > -1) {
        notification.warning({
          top: 92,
          message: col.title + '不可重复!',
          duration: 5
        })
        unique = false
      }
    })
    if (!unique) return
    newData.splice(index, 1, record)
    this.setState({ data: newData, editingKey: '' }, () => {
      this.props.onChange(newData)
    })
  }
  handleDelete = (uuid) => {
    const { data } = this.state
    let _data = data.filter(item => uuid !== item.uuid)
    this.setState({
      data: _data
    }, () => {
      this.props.onChange(_data)
    })
  }
  save(form, uuid) {
    const { columns } = this.state
    form.validateFields((error, row) => {
      if (error) {
        return;
      }
      const newData = [...this.state.data]
      const index = newData.findIndex(item => uuid === item.uuid)
      let unique = true
      columns.forEach(col => {
        if (col.unique !== true || !unique) return
        let _index = newData.findIndex(item => uuid !== item.uuid && row[col.dataIndex] === item[col.dataIndex])
        if (_index > -1) {
          notification.warning({
            top: 92,
            message: col.title + '不可重复!',
            duration: 5
          })
          unique = false
        }
      })
      if (!unique) return
      if (index > -1) {
        const item = newData[index]
        newData.splice(index, 1, {
          ...item,
          ...row,
        })
        this.setState({ data: newData, editingKey: '' }, () => {
          this.props.onChange(newData)
        })
      } else {
        newData.push(row);
        this.setState({ data: newData, editingKey: '' }, () => {
          this.props.onChange(newData)
        })
      }
    })
  }
  edit(uuid) {
    this.setState({ editingKey: uuid })
  }
  moveRow = (dragIndex, hoverIndex) => {
    const { editingKey } = this.state
    let _data = fromJS(this.state.data).toJS()
    if (editingKey) return
    _data.splice(hoverIndex, 0, ..._data.splice(dragIndex, 1))
    this.setState({
      data: _data
    }, () => {
      this.props.onChange(_data)
    })
  }
  render() {
    let components = {
      body: {
        cell: EditableCell
      }
    }
    const columns = this.state.columns.map(col => {
      if (!col.editable) return col
      return {
        ...col,
        onCell: record => ({
          record,
          inputType: col.inputType,
          dataIndex: col.dataIndex,
          options: col.options || [],
          required: col.required !== false ? true : false,
          title: col.title,
          editing: this.isEditing(record),
          onSave: this.onSave,
        }),
      }
    })
    return (
      <EditableContext.Provider value={this.props.form}>
        <div className="modal-edit-table">
          <Table
            bordered
            rowKey="uuid"
            components={components}
            dataSource={this.state.data}
            columns={columns}
            rowClassName="editable-row"
            pagination={false}
            onRow={(record, index) => ({
              index,
              moveAble: !this.state.editingKey,
              moveRow: this.moveRow,
            })}
          />
        </div>
      </EditableContext.Provider>
    )
  }
}
export default Form.create()(EditTable)
src/tabviews/zshare/settingcomponent/editTable/index.scss
New file
@@ -0,0 +1,88 @@
.modal-edit-table {
  .editable-row {
    .ant-form-explain {
      position: absolute;
      font-size: 12px;
      margin-top: -4px;
    }
    .color-sketch-block {
      width: 200px;
      position: relative;
      top: 8px;
    }
    .ant-select {
      width: 100%;
    }
    > td {
      padding: 14px 10px;
    }
    > td:last-child {
      padding: 0px;
    }
  }
  thead tr th:last-child {
    text-align: center;
  }
  .edit-operation-btn {
    display: block;
    text-align: center;
    span {
      margin-right: 10px;
      cursor: pointer;
      font-size: 16px;
      padding: 5px;
    }
    .primary {
      color: #1890ff;
    }
    .copy {
      color: #26C281;
    }
    .danger {
      color: #ff4d4f;
    }
    span:last-child {
      margin-right: 0px;
    }
  }
  .edit-operation-btn.disabled {
    cursor: default;
    span {
      cursor: default;
    }
    .primary {
      color: rgba(0, 0, 0, .25);
    }
    .danger {
      color: rgba(0, 0, 0, .25);
    }
    .copy {
      color: rgba(0, 0, 0, .25);
    }
  }
  .ant-empty {
    margin: 0;
  }
  tr.drop-over-downward td {
    border-bottom: 2px dashed #1890ff;
  }
  tr.drop-over-upward td {
    border-top: 2px dashed #1890ff;
  }
  .copy-control {
    display: inline-block;
    position: absolute;
    right: 10px;
    top: 2px;
    .anticon-copy {
      margin-right: 7px;
      color: #26C281;
    }
    .anticon-snippets {
      color: purple;
    }
  }
}
src/tabviews/zshare/settingcomponent/index.jsx
@@ -1,9 +1,10 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Icon, Button, Modal, notification } from 'antd'
import { Button, Modal, notification } from 'antd'
import Api from '@/api'
import options from '@/store/options.js'
import asyncComponent from '@/utils/asyncSpinComponent'
import './index.scss'
@@ -32,6 +33,45 @@
      confirmLoading: false,
      revertLoading: false
    })
    // let deffers = []
    // config.tabgroups.forEach(group => {
    //   group.sublist.forEach(tab => {
    //     deffers.push(new Promise(resolve => {
    //       let param = {
    //         func: 'sPC_Get_LongParam',
    //         MenuID: tab.linkTab
    //       }
    //       Api.getCacheConfig(param).then(res => {
    //         res.tab = tab
    //         resolve(res)
    //       })
    //     }))
    //   })
    // })
    // if (deffers.length > 0) {
    //   Promise.all(deffers).then(result => {
    //     let errors = result.filter(res => !res.status)
    //     if (errors.length > 0) {
    //       notification.warning({
    //         top: 92,
    //         message: errors[0].message,
    //         duration: 5
    //       })
    //       this.setState({
    //         loading: false
    //       })
    //       return
    //     }
    //     let roleId = sessionStorage.getItem('role_id') || '' // 角色ID
    //     result.forEach(res => {
    //       if (!res.LongParam) return
    //       let subconfig = ''
    //       let subUserConfig = userConfig ? userConfig[res.tab.uuid] : ''
    //     }
  }
  changeMenuParam = (param) => {
@@ -125,8 +165,14 @@
  render() {
    
    return (
      <div>
        <Icon className="custom-control" type="setting" onClick={this.controlCustomSetting} />
      <div className="page-setting-wrap">
        {options.sysType === 'local' ? <Button
          icon="setting"
          shape="circle"
          className="page-setting"
          onClick={this.handleviewconfig}
        /> : null}
        {/* <Icon className="custom-control" type="setting" onClick={this.controlCustomSetting} /> */}
        <Modal
          wrapClassName="common-table-custom-modal"
          title={'自定义设置'}
src/tabviews/zshare/settingcomponent/index.scss
@@ -1,3 +1,13 @@
.page-setting-wrap {
  .page-setting {
    position: fixed;
    z-index: 2;
    bottom: 110px;
    right: 30px;
    width: 40px;
    height: 40px;
  }
}
.common-table-custom-modal {
  .ant-modal {
    top: 50px;
src/templates/formtabconfig/index.jsx
@@ -613,6 +613,7 @@
  
          let param = {
            func: 's_debug_sql',
            exec_type: 'y',
            LText: res.dataSource
          }
@@ -620,7 +621,7 @@
          param.LText = Utils.formatOptions(param.LText)
          param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
          param.secretkey = Utils.encrypt(param.LText, param.timestamp)
          param.secretkey = Utils.encrypt('', param.timestamp)
  
          if (window.GLOB.mainSystemApi && res.database === 'sso') {
            param.rduri = window.GLOB.mainSystemApi
@@ -1469,6 +1470,7 @@
        let param = {
          func: 's_debug_sql',
          exec_type: 'y',
          LText: res.dataresource
        }
@@ -1476,7 +1478,7 @@
        param.LText = Utils.formatOptions(param.LText)
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
        param.secretkey = Utils.encrypt('', param.timestamp)
        
        Api.getLocalConfig(param).then(result => {
          if (result.status) {
src/templates/modalconfig/index.jsx
@@ -414,6 +414,7 @@
        let param = {
          func: 's_debug_sql',
          exec_type: 'y',
          LText: res.dataSource
        }
@@ -421,7 +422,7 @@
        
        param.LText = Utils.formatOptions(param.LText)
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
        param.secretkey = Utils.encrypt('', param.timestamp)
        if (window.GLOB.mainSystemApi && res.database === 'sso') {
          param.rduri = window.GLOB.mainSystemApi
src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx
@@ -122,19 +122,35 @@
          aaa:
        `
        let _initsql = ''
        this.props.scripts.forEach(script => {
          if (this.state.editItem && this.state.editItem.uuid === script.uuid) return
          if (script.status === 'false' || script.position !== 'init') return
        let _initCustomScript = '' // 初始化脚本
        let _prevCustomScript = '' // 默认sql前执行脚本
        let _backCustomScript = '' // 默认sql后执行脚本
          _initsql += `
            ${script.sql}
        this.props.scripts.forEach(item => {
          if (item.status === 'false') return
          if (item.position === 'init') {
            _initCustomScript += `
            /* 初始化脚本 */
            ${values.uuid === item.uuid ? values.sql : item.sql}
            `
          } else if (item.position === 'front') {
            _prevCustomScript += `
            /* 默认sql前脚本 */
            ${values.uuid === item.uuid ? values.sql : item.sql}
            `
          } else {
            _backCustomScript += `
            /* 默认sql后脚本 */
            ${values.uuid === item.uuid ? values.sql : item.sql}
            `
          }
        })
        let param = {
          func: 's_debug_sql',
          LText: this.state.verifySql + _initsql + values.sql + tail
          exec_type: 'y',
          LText: this.state.verifySql + _initCustomScript + _prevCustomScript + _backCustomScript + tail
        }
        param.LText = param.LText.replace(/@\$|\$@/ig, '')
@@ -146,7 +162,7 @@
        param.LText = Utils.formatOptions(param.LText)
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
        param.secretkey = Utils.encrypt('', param.timestamp)
        
        this.setState({loading: true})
        Api.getLocalConfig(param).then(res => {
src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
@@ -308,6 +308,7 @@
    
            let param = {
              func: 's_debug_sql',
              exec_type: 'y',
              LText: values.sql
            }
    
@@ -315,7 +316,7 @@
    
            param.LText = Utils.formatOptions(param.LText)
            param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
            param.secretkey = Utils.encrypt(param.LText, param.timestamp)
            param.secretkey = Utils.encrypt('', param.timestamp)
            
            Api.getLocalConfig(param).then(res => {
              if (res.status) {
src/templates/sharecomponent/searchcomponent/index.jsx
@@ -194,6 +194,7 @@
        let param = {
          func: 's_debug_sql',
          exec_type: 'y',
          LText: res.dataSource
        }
@@ -201,7 +202,7 @@
        
        param.LText = Utils.formatOptions(param.LText)
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
        param.secretkey = Utils.encrypt('', param.timestamp)
        if (window.GLOB.mainSystemApi && res.database === 'sso') {
          param.rduri = window.GLOB.mainSystemApi
src/templates/sharecomponent/settingcalcomponent/verifycard/index.jsx
@@ -278,11 +278,12 @@
    } else if (setting.execute !== 'false' || _scripts.length > 0) {
      let param = {
        func: 's_debug_sql',
        exec_type: 'y',
        LText: SettingUtils.getDebugSql(setting, _scripts, columns, Utils.getRegOptions(searches), config.calendar)
      }
      param.LText = Utils.formatOptions(param.LText)
      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      param.secretkey = Utils.encrypt(param.LText, param.timestamp)
      param.secretkey = Utils.encrypt('', param.timestamp)
      
      Api.getLocalConfig(param).then(result => {
        if (result.status) {
src/templates/sharecomponent/settingcomponent/settingform/index.jsx
@@ -265,11 +265,12 @@
    } else { // type 为 submit 、 verify ,以及其他需要验证的场景
      let param = {
        func: 's_debug_sql',
        exec_type: 'y',
        LText: SettingUtils.getDebugSql(setting, _scripts, arr_field, regoptions, search)
      }
      param.LText = Utils.formatOptions(param.LText)
      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      param.secretkey = Utils.encrypt(param.LText, param.timestamp)
      param.secretkey = Utils.encrypt('', param.timestamp)
      
      Api.getLocalConfig(param).then(result => {
        if (result.status) {
src/templates/sharecomponent/treesettingcomponent/settingform/index.jsx
@@ -124,11 +124,12 @@
    } else { // type 为 submit 、 verify ,以及其他需要验证的场景
      let param = {
        func: 's_debug_sql',
        exec_type: 'y',
        LText: SettingUtils.getDebugSql(setting, _scripts)
      }
      param.LText = Utils.formatOptions(param.LText)
      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      param.secretkey = Utils.encrypt(param.LText, param.timestamp)
      param.secretkey = Utils.encrypt('', param.timestamp)
      
      Api.getLocalConfig(param).then(result => {
        if (result.status) {
src/templates/zshare/verifycard/customform/index.jsx
@@ -97,6 +97,7 @@
        let param = {
          func: 's_debug_sql',
          exec_type: 'y',
          LText: this.props.initsql + values.sql
        }
@@ -110,7 +111,7 @@
        param.LText = Utils.formatOptions(param.LText)
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
        param.secretkey = Utils.encrypt('', param.timestamp)
        
        this.setState({loading: true})
        Api.getLocalConfig(param).then(res => {
src/templates/zshare/verifycard/customscript/index.jsx
@@ -37,10 +37,11 @@
  }
  handleConfirm = () => {
    const { editItem } = this.state
    // 表单提交时检查输入值是否正确
    this.props.form.validateFieldsAndScroll((err, values) => {
      if (!err) {
        values.uuid = this.state.editItem ? this.state.editItem.uuid : ''
        values.uuid = editItem ? editItem.uuid : ''
        let _quot = values.sql.match(/'{1}/g)
        let _lparen = values.sql.match(/\({1}/g)
@@ -88,19 +89,35 @@
          aaa:
        `
        let _initsql = ''
        this.props.customScripts.forEach(script => {
          if (this.state.editItem && this.state.editItem.uuid === script.uuid) return
          if (script.status === 'false' || script.position !== 'init') return
        let _initCustomScript = '' // 初始化脚本
        let _prevCustomScript = '' // 默认sql前执行脚本
        let _backCustomScript = '' // 默认sql后执行脚本
          _initsql += `
            ${script.sql}
        this.props.customScripts.forEach(item => {
          if (item.status === 'false') return
          if (item.position === 'init') {
            _initCustomScript += `
            /* 初始化脚本 */
            ${values.uuid === item.uuid ? values.sql : item.sql}
            `
          } else if (item.position === 'front') {
            _prevCustomScript += `
            /* 默认sql前脚本 */
            ${values.uuid === item.uuid ? values.sql : item.sql}
            `
          } else {
            _backCustomScript += `
            /* 默认sql后脚本 */
            ${values.uuid === item.uuid ? values.sql : item.sql}
            `
          }
        })
        let param = {
          func: 's_debug_sql',
          LText: this.props.initsql + _initsql + values.sql + tail
          exec_type: 'y',
          LText: this.props.initsql + _initCustomScript + _prevCustomScript + _backCustomScript + tail
        }
        // 数据权限
@@ -115,7 +132,7 @@
        param.LText = Utils.formatOptions(param.LText)
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
        param.secretkey = Utils.encrypt('', param.timestamp)
        
        this.setState({loading: true})
        Api.getLocalConfig(param).then(res => {
src/views/login/index.jsx
@@ -255,8 +255,12 @@
    Api.getTouristMsg().then(result => {
      if (result.status) {
        result.UserID && sessionStorage.setItem('UserID', result.UserID)
        result.LoginUID && sessionStorage.setItem('LoginUID', result.LoginUID)
        if (result.UserID && !sessionStorage.getItem('UserID')) {
          sessionStorage.setItem('UserID', result.UserID)
        }
        if (result.LoginUID && !sessionStorage.getItem('LoginUID')) {
          sessionStorage.setItem('LoginUID', result.LoginUID)
        }
        if (result.UserID && result.LoginUID) {
          this.setState({touristLogin: true})