king
2020-05-29 3b43ee5ead5f625d532150afceddcf1b481b823d
2020-05-29
10个文件已修改
1个文件已添加
856 ■■■■■ 已修改文件
src/tabviews/commontable/index.jsx 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/rolemanage/index.jsx 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtable/index.jsx 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtabtable/index.jsx 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/chartcomponent/index.jsx 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/chartcomponent/chartcompile/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/settingcomponent/settingform/customscript/index.jsx 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/settingcomponent/settingform/index.jsx 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/settingcomponent/settingform/index.scss 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/settingcomponent/settingform/utils.jsx 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/index.jsx
@@ -733,17 +733,20 @@
      })
    }
    if (setting.queryType === 'statistics') { // 统计数据源,内容替换
    if (setting.queryType === 'statistics' && setting.default !== 'false') { // 统计数据源,内容替换
      regoptions.forEach(item => {
        _dataresource = _dataresource.replace(item.reg, item.value)
      })
      _search = ''
    }
    let LText = `select top ${pageSize} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_dataresource} ${_search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows`
    let DateCount = `select count(1) as total from ${_dataresource} ${_search}`
    let LText = ''
    let DateCount = ''
    if (setting.laypage === 'false') {
    if (setting.default !== 'false' && setting.laypage !== 'false') {
      LText = `select top ${pageSize} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_dataresource} ${_search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows`
      DateCount = `select count(1) as total from ${_dataresource} ${_search}`
    } else if (setting.default !== 'false') {
      LText = `select ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_dataresource} ${_search}) tmptable order by tmptable.rows`
      DateCount = ''
    }
@@ -767,6 +770,20 @@
        param.custom_script = param.custom_script.replace(item.reg, item.value)
      })
      if (LText) {
        LText += `
          aaa:
          if @ErrorCode!=''
            insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
        `
      } else {
        param.custom_script += `
          aaa:
          if @ErrorCode!=''
            insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
        `
      }
      param.custom_script = Utils.formatOptions(param.custom_script)
    }
src/tabviews/rolemanage/index.jsx
@@ -12,8 +12,8 @@
const { Search } = Input
const { TabPane } = Tabs
const { TreeNode, DirectoryTree } = Tree
let checkedKeysMap = null
let linkMap = null
let linkMap = new Map()
let selectMap = null
export default class RoleManage extends Component {
@@ -25,6 +25,7 @@
  state = {
    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
    loading: true,
    loadingTree: false,
    roleList: null,
    selectRoleId: '',
    mainMenus: null,
@@ -39,6 +40,9 @@
    initCheckKeys: null
  }
  /**
   * @description 获取角色列表
   */
  getRoleList = async () => {
    let param = {
      func: 's_rolemenu_get_list'
@@ -47,13 +51,9 @@
    if (result.status) {
      this.setState({
        roleList: result.data,
        loading: false
        roleList: result.data
      })
    } else {
      this.setState({
        loading: false
      })
      notification.warning({
        top: 92,
        message: result.message,
@@ -62,6 +62,9 @@
    }
  }
  /**
   * @description 获取一级菜单,用于构建结构树
   */
  getMainMenuList = async () => {
    let param = {
      func: 's_rolemenu_get_FstMenu'
@@ -70,6 +73,8 @@
    if (result.status) {
      this.setState({
        loadingTree: true,
        loading: false,
        mainMenus: result.data.map(item => {
          return {
            title: item.MenuName,
@@ -82,6 +87,9 @@
        this.getAllMenuList()
      })
    } else {
      this.setState({
        loading: false
      })
      notification.warning({
        top: 92,
        message: result.message,
@@ -90,6 +98,9 @@
    }
  }
  /**
   * @description 获取所有菜单节点,形成权限树
   */
  getAllMenuList = async () => {
    const { selectRoleId, mainMenus, tabKey } = this.state
@@ -102,54 +113,22 @@
    let result = await Api.getSystemConfig(param)
    if (result.status) {
      let _tree = null
      let _openKeys = []
      let _state = {
        loading: false
      // MenuID(菜单Id)、MenuName(菜单名称)、OnlySelf(值为true,表示三级菜单,增加-仅页面)、Type(菜单级别)
      // ParentID(父级Id)、Selected(是否选中-已失效)、Tabs( 标签类型)、TypeCharOne 菜单类型PC或其他
      let _tree = this.getTree(fromJS(mainMenus).toJS(), result.data)
      if (_tree[0]) {
        this.getOpenNode(_tree[0], _openKeys)
      }
      if (tabKey === '') {
        let _initCheckKeys = [] // 初始选中的菜单id
        checkedKeysMap = new Map()
        linkMap = new Map()
        selectMap = new Map()
        result.data.forEach(item => {
          if (item.Selected !== 'true') return
          checkedKeysMap.set(item.MenuID, true)
          _initCheckKeys.push(item.MenuID)
        })
        _initCheckKeys = Array.from(new Set(_initCheckKeys))
        _tree = this.getTree(JSON.parse(JSON.stringify(mainMenus)), result.data)
        if (_tree[0]) {
          this.getOpenNode(_tree[0], _openKeys)
        }
        _state.menuTrees = _tree
        _state.initCheckKeys = _initCheckKeys
        _state.checkedKeys = Array.from(checkedKeysMap.keys())
        _state.menuOpenKeys = _openKeys
      } else {
        _tree = this.getSelectTree(JSON.parse(JSON.stringify(mainMenus)), result.data)
        _tree = _tree.filter(node => node.children)
        if (_tree[0]) {
          this.getOpenNode(_tree[0], _openKeys)
        }
        _state.selectMenuTrees = _tree
        _state.selectMenuOpenKeys = _openKeys
      }
      this.setState(_state)
      this.setState({
        loadingTree: false,
        menuTrees: _tree,
        menuOpenKeys: _openKeys
      })
    } else {
      this.setState({
        loading: false
        loadingTree: false
      })
      notification.warning({
        top: 92,
@@ -159,6 +138,69 @@
    }
  }
  /**
   * @description 选择角色且存在权限树时,获取已分配结构
   */
  getSelectMenuList = async () => {
    const { selectRoleId, menuTrees, tabKey } = this.state
    if (!menuTrees) return
    let param = {
      func: 's_rolemenu_get_Menulist',
      RoleID: selectRoleId
    }
    let result = await Api.getSystemConfig(param)
    if (result.status) {
      let _openKeys = []
      if (tabKey === '') {
        let _initKeys = result.data.map(item => item.MenuID)
        _initKeys = Array.from(new Set(_initKeys))
        selectMap = new Map()
        this.getCheckedKeys(fromJS(menuTrees).toJS(), _initKeys)
        if (menuTrees[0]) {
          this.getOpenNode(menuTrees[0], _openKeys)
        }
        this.setState({
          loadingTree: false,
          initCheckKeys: _initKeys,
          checkedKeys: Array.from(selectMap.keys()),
          menuOpenKeys: _openKeys
        })
      } else {
        let Keys = result.data.map(item => item.MenuID)
        let _tree = this.getSelectTree(fromJS(menuTrees).toJS(), Keys)
        if (_tree[0]) {
          this.getOpenNode(_tree[0], _openKeys)
        }
        this.setState({
          loadingTree: false,
          selectMenuTrees: _tree,
          selectMenuOpenKeys: _openKeys
        })
      }
    } else {
      this.setState({
        loadingTree: false
      })
      notification.warning({
        top: 92,
        message: result.message,
        duration: 5
      })
    }
  }
  /**
   * @description 获取展开节点
   */
  getOpenNode = (parentNode, keys) => {
    if (parentNode.children) {
      keys.push(parentNode.key)
@@ -168,100 +210,105 @@
    }
  }
  /**
   * @description 获取权限分配树
   */
  getTree = (parents, options) => {
    parents.forEach(parent => {
      parent.children = []
      // 添加菜单的子元素
      options.forEach(option => {
        if (option.ParentID === parent.key) {
          parent.children.push({
            title: option.MenuName,
            key: option.MenuID,
            selected: parent.selected && option.Selected === 'true',
            addSelf: option.OnlySelf === 'true',
            tabs: option.Tabs
          })
        }
      })
      if (parent.children.length === 0) {
        parent.children = null
        // 针对标签,生成新的id,并保存关联关系(标签不唯一)
        if (parent.tabs) {
          let _uuid = Utils.getuuid()
          linkMap.set(_uuid, parent.key)
          if (parent.selected) {
            checkedKeysMap.set(_uuid, true)
            checkedKeysMap.delete(parent.key)
            selectMap.set(_uuid, parent.key)
          }
          parent.originKey = parent.key
          parent.key = _uuid
        }
      } else {
        if (parent.selected) {
          checkedKeysMap.delete(parent.key)
        }
        // 三级菜单创建子项
        if (parent.addSelf) {
          let _uuid = Utils.getuuid()
          linkMap.set(_uuid, parent.key)
          if (parent.selected) {
            checkedKeysMap.set(_uuid, true)
          }
          parent.subKey = _uuid
          parent.children.unshift({
            title: parent.title + '(仅页面)',
            key: _uuid,
            isSubView: true
          })
        }
        // 针对标签,生成新的id,并保存关联关系(标签不唯一)
        if (parent.tabs) {
          let _uuid = Utils.getuuid()
          linkMap.set(_uuid, parent.key)
          if (parent.selected) {
            selectMap.set(_uuid, parent.key)
          }
          parent.originKey = parent.key
          parent.key = _uuid
        }
        parent.children = this.getTree(parent.children, options)
      }
    })
    return parents
  }
  getSelectTree = (parents, options) => {
  /**
   * @description 获取已选择的节点
   */
  getCheckedKeys = (parents, initKeys) => {
    parents.forEach(parent => {
      parent.children = []
      options.forEach(option => {
        if (option.ParentID === parent.key) {
          parent.children.push({
            title: option.MenuName,
            key: option.MenuID,
            tabs: option.Tabs
          })
      if ((parent.originKey && initKeys.indexOf(parent.originKey) > -1) || initKeys.indexOf(parent.key) > -1) {
        if (parent.children) {
          if (parent.subKey) {
            selectMap.set(parent.subKey, true)
          }
          this.getCheckedKeys(parent.children, initKeys)
        } else {
          selectMap.set(parent.key, true)
        }
      })
      parent.key = Utils.getuuid()
      if (parent.children.length === 0) {
        parent.children = null
      } else {
        parent.children = this.getSelectTree(parent.children, options)
      }
    })
    return parents
  }
  /**
   * @description 生成已分配权限的结构树
   */
  getSelectTree = (parents, options) => {
    return parents.filter(parent => {
      if ((parent.originKey && options.indexOf(parent.originKey) > -1) || options.indexOf(parent.key) > -1) {
        if (parent.children) {
          parent.children = this.getSelectTree(parent.children, options)
          if (parent.children.length === 0) {
            parent.children = null
          }
        }
        return true
      } else if (parent.isSubView) {
        return true
      }
      return false
    })
  }
  /**
   * @description 角色切换
   */
  changeRole = (role) => {
    const { selectRoleId } = this.state
@@ -269,16 +316,15 @@
    this.setState({
      selectRoleId: role.RoleID,
      menuTrees: null,
      checkedKeys: [],
      menuOpenKeys: [],
      selectMenuTrees: null,
      selectMenuOpenKeys: []
      loadingTree: true
    }, () => {
      this.getAllMenuList()
      this.getSelectMenuList()
    })
  }
  /**
   * @description 获取树节点
   */
  renderTreeNodes = (data) => {
    return data.map(item => {
      if (item.children) {
@@ -292,6 +338,9 @@
    })
  }
  /**
   * @description 节点选择事件
   */
  onCheck = (checkedKeys, info) => {
    this.setState({
      checkedKeys: checkedKeys,
@@ -300,18 +349,30 @@
    })
  }
  /**
   * @description 已分配与未分配切换
   */
  changeTab = (key) => {
    const { menuTrees, selectMenuTrees } = this.state
    const { selectRoleId } = this.state
    this.setState({
      tabKey: key === 'selected' ? key : ''
      tabKey: key === 'selected' ? key : '',
      loadingTree: true
    }, () => {
      if ((key === 'selected' && !selectMenuTrees) || (key === 'all' && !menuTrees)) {
        this.getAllMenuList()
      if (selectRoleId) {
        this.getSelectMenuList()
      } else {
        this.setState({
          selectMenuTrees: [],
          loadingTree: false
        })
      }
    })
  }
  /**
   * @description 提交已选的权限
   */
  roleSubmit = async () => {
    const { checkedKeys, halfCheckedKeys, selectRoleId, initCheckKeys } = this.state
@@ -328,25 +389,13 @@
          _keys.push(key)
        }
      })
      _cKeys = new Map(_cKeys.map(key => [key, true]))
      _keys = new Map(_keys.map(key => [key, true]))
      Array.from(selectMap.keys()).forEach(key => {
        if (!_cKeys.has(key)) {
          _keys.delete(selectMap.get(key))
        }
      })
      _keys = Array.from(_keys.keys())
      _keys = Array.from(new Set(_keys))
    }
    // let _LText = _keys.map(key => `select '${key}' as MenuID`)
    // _LText = _LText.join(' union all ')
    let param = {
      func: 's_rolemenu_sub',
      RoleID: selectRoleId,
      // LText: Utils.formatOptions(_LText)
      RoleMenu: _keys.map(key => {
        return {MenuID: key}
      })
@@ -366,22 +415,18 @@
      })
      this.setState({
        submitloading: false,
        menuTrees: null,
        checkedKeys: [],
        menuOpenKeys: [],
        selectMenuTrees: null,
        selectMenuOpenKeys: []
        loadingTree: true
      }, () => {
        this.getAllMenuList()
        this.getSelectMenuList()
      })
    } else {
      this.setState({
        submitloading: false
      })
      notification.warning({
        top: 92,
        message: result.message,
        duration: 5
      })
      this.setState({
        submitloading: false
      })
    }
  }
@@ -405,7 +450,7 @@
  }
  render() {
    const { roleList, loading, primarykey, menuTrees, checkedKeys, menuOpenKeys, selectMenuTrees, tabKey, selectRoleId, selectMenuOpenKeys, submitloading } = this.state
    const { roleList, loading, loadingTree, primarykey, menuTrees, checkedKeys, menuOpenKeys, selectMenuTrees, tabKey, selectRoleId, selectMenuOpenKeys, submitloading } = this.state
    let _roleList  = []
@@ -442,7 +487,7 @@
          <Col span={19}>
            <Tabs defaultActiveKey="all" tabBarExtraContent={!tabKey && selectRoleId ? <Button type="primary" loading={submitloading} onClick={this.roleSubmit}>提交</Button> : null} onChange={this.changeTab}>
              <TabPane tab="菜单列表" key="all">
                {menuTrees && menuTrees.length > 0 ? <Tree
                {!loadingTree && menuTrees && menuTrees.length > 0 ? <Tree
                  checkable
                  selectable={false}
                  defaultExpandedKeys={menuOpenKeys}
@@ -452,15 +497,15 @@
                >
                  {this.renderTreeNodes(menuTrees)}
                </Tree> : null}
                {menuTrees && menuTrees.length === 0 ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null}
                {!loading && !menuTrees ? <Spin className="load-tree" /> : null}
                {!loadingTree && (!menuTrees || menuTrees.length === 0) ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null}
                {loadingTree ? <Spin className="load-tree" /> : null}
              </TabPane>
              <TabPane tab="已授权菜单" key="selected">
                {selectMenuTrees && selectMenuTrees.length > 0 ? <DirectoryTree multiple defaultExpandedKeys={selectMenuOpenKeys}>
                {!loadingTree && selectMenuTrees && selectMenuTrees.length > 0 ? <DirectoryTree multiple defaultExpandedKeys={selectMenuOpenKeys}>
                  {this.renderTreeNodes(selectMenuTrees)}
                </DirectoryTree> : null}
                {selectMenuTrees && selectMenuTrees.length === 0 ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null}
                {!loading && !selectMenuTrees ? <Spin className="load-tree" /> : null}
                {!loadingTree && (!selectMenuTrees || selectMenuTrees.length === 0) ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null}
                {loadingTree ? <Spin className="load-tree" /> : null}
              </TabPane>
            </Tabs>
          </Col>
src/tabviews/subtable/index.jsx
@@ -637,17 +637,20 @@
      })
    }
    if (setting.queryType === 'statistics') { // 统计数据源,内容替换
    if (setting.queryType === 'statistics' && setting.default !== 'false') { // 统计数据源,内容替换
      regoptions.forEach(item => {
        _dataresource = _dataresource.replace(item.reg, item.value)
      })
      _search = ''
    }
    let LText = `select top ${pageSize} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_dataresource} ${_search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows`
    let DateCount = `select count(1) as total from ${_dataresource} ${_search}`
    let LText = ''
    let DateCount = ''
    if (setting.laypage === 'false') {
    if (setting.default !== 'false' && setting.laypage !== 'false') {
      LText = `select top ${pageSize} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_dataresource} ${_search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows`
      DateCount = `select count(1) as total from ${_dataresource} ${_search}`
    } else if (setting.default !== 'false') {
      LText = `select ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_dataresource} ${_search}) tmptable order by tmptable.rows`
      DateCount = ''
    }
@@ -671,6 +674,20 @@
        param.custom_script = param.custom_script.replace(item.reg, item.value)
      })
      if (LText) {
        LText += `
          aaa:
          if @ErrorCode!=''
            insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
        `
      } else {
        param.custom_script += `
          aaa:
          if @ErrorCode!=''
            insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
        `
      }
      param.custom_script = Utils.formatOptions(param.custom_script)
    }
src/tabviews/subtabtable/index.jsx
@@ -512,17 +512,20 @@
      })
    }
    if (setting.queryType === 'statistics') { // 统计数据源,内容替换
    if (setting.queryType === 'statistics' && setting.default !== 'false') { // 统计数据源,内容替换
      regoptions.forEach(item => {
        _dataresource = _dataresource.replace(item.reg, item.value)
      })
      _search = ''
    }
    let LText = `select top ${pageSize} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_dataresource} ${_search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows`
    let DateCount = `select count(1) as total from ${_dataresource} ${_search}`
    let LText = ''
    let DateCount = ''
    if (setting.laypage === 'false') {
    if (setting.default !== 'false' && setting.laypage !== 'false') {
      LText = `select top ${pageSize} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_dataresource} ${_search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows`
      DateCount = `select count(1) as total from ${_dataresource} ${_search}`
    } else if (setting.default !== 'false') {
      LText = `select ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_dataresource} ${_search}) tmptable order by tmptable.rows`
      DateCount = ''
    }
@@ -546,6 +549,20 @@
        param.custom_script = param.custom_script.replace(item.reg, item.value)
      })
      if (LText) {
        LText += `
          aaa:
          if @ErrorCode!=''
            insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
        `
      } else {
        param.custom_script += `
          aaa:
          if @ErrorCode!=''
            insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
        `
      }
      param.custom_script = Utils.formatOptions(param.custom_script)
    }
src/tabviews/zshare/actionList/index.jsx
@@ -1207,7 +1207,7 @@
            param.BID = this.props.BID
          }
          let primaryId = setting.primaryKey ? cell[setting.primaryKey] : ''
          let primaryId = setting.primaryKey ? cell[setting.primaryKey] || '' : ''
          if (btn.OpenType === 'prompt' || btn.OpenType === 'exec') { // 是否弹框或直接执行
src/tabviews/zshare/chartcomponent/index.jsx
@@ -722,7 +722,7 @@
    }
    if (plot.adjust !== 'stack') {
      chart
      let _chart = chart
        .interval()
        .position(`${plot.Xaxis}*${_valfield}`)
        .color(_typefield)
@@ -733,13 +733,21 @@
          }
        ])
        .shape(plot.shape || 'rect')
      if (plot.label === 'true') {
        _chart.label(_valfield)
      }
    } else if (plot.adjust === 'stack') {
      chart
      let _chart = chart
        .interval()
        .position(`${plot.Xaxis}*${_valfield}`)
        .color(_typefield)
        .adjust('stack')
        .shape(plot.shape || 'rect')
      if (plot.label === 'true') {
        _chart.label(_valfield)
      }
    }
    chart.render()
src/templates/sharecomponent/chartcomponent/chartcompile/index.jsx
@@ -412,7 +412,7 @@
        if (!err) {
          let _plot = {...plot, ...values}
          if (_plot.enabled !== 'true') {
          if (_plot.enabled !== 'true' || _plot.customs.map(_cell => _cell.field).sort().toString() !== _plot.Yaxis.sort().toString()) {
            _plot.enabled = 'false'
            _plot.customs = _plot.Yaxis.map((field, i) => {
              let _item = {field: field}
@@ -426,6 +426,7 @@
          }
          
          this.setState({
            enabled: _plot.enabled || 'false',
            plot: _plot,
            view: _view
          })
src/templates/sharecomponent/settingcomponent/settingform/customscript/index.jsx
@@ -1,9 +1,10 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { Form, Row, Col, Input, Button, notification, Modal, Select, Radio } from 'antd'
import { Form, Row, Col, Input, Button, notification, Modal, Select } from 'antd'
import moment from 'moment'
import Utils from '@/utils/utils.js'
import SettingUtils from '../utils.jsx'
import Api from '@/api'
import './index.scss'
@@ -15,8 +16,10 @@
    dict: PropTypes.object,         // 字典项
    setting: PropTypes.object,      // 设置
    searches: PropTypes.array,      // 搜索条件
    swhere: PropTypes.string,       // where条件
    arr_field: PropTypes.string,    // 列字段
    regoptions: PropTypes.array,    // 正则替换
    systemScripts: PropTypes.array, // 系统脚本
    customScripts: PropTypes.array, // 自定义脚本
    scriptsChange: PropTypes.func   // 表单
  }
@@ -58,8 +61,7 @@
    })
    this.props.form.setFieldsValue({
      sql: record.sql,
      initsql: record.initsql || 'false'
      sql: record.sql
    })
  }
@@ -73,8 +75,8 @@
  }
  handleConfirm = () => {
    const { searches, setting } = this.props
    const { setting, arr_field, regoptions, swhere } = this.props
    // 表单提交时检查输入值是否正确
    this.props.form.validateFieldsAndScroll((err, values) => {
      if (!err) {
@@ -122,54 +124,38 @@
          return
        }
        let tail = `
          aaa:
        `
        let _initsql = ''
        this.props.customScripts.forEach(script => {
          if (this.state.editItem && this.state.editItem.uuid === script.uuid) return
          if (script.status === 'false' || script.initsql !== 'true') return
          _initsql += `
        let _customScript = ''
        setting.scripts && setting.scripts.forEach(script => {
          if (this.state.editItem && this.state.editItem.uuid === script.uuid) {
            _customScript += `
            ${values.sql}
            `
          } else if (script.status !== 'false') {
            _customScript += `
            ${script.sql}
            `
        })
        let param = {
          func: 's_debug_sql',
          LText: _initsql + values.sql + tail
        }
        param.LText = param.LText.replace(/@\$|\$@/ig, '')
        let allSearch = Utils.initMainSearch(searches)
        allSearch = Utils.getAllSearchOptions(allSearch)
        let regoptions = allSearch.map(item => {
          return {
            reg: new RegExp('@' + item.key + '@', 'ig'),
            value: `'${item.value}'`
          }
        })
        regoptions.push({
          reg: new RegExp('@orderBy@', 'ig'),
          value: setting.order
        })
        if (setting.laypage !== 'false') {
          regoptions.push({
            reg: new RegExp('@pageSize@', 'ig'),
            value: 10
          }, {
            reg: new RegExp('@pageIndex@', 'ig'),
            value: 1
          })
        if (!this.state.editItem) {
          _customScript += `
            ${values.sql}
            `
        }
        regoptions.forEach(item => {
          param.LText = param.LText.replace(item.reg, item.value)
        })
        if (_customScript) {
          _customScript = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000) select @ErrorCode='',@retmsg =''
            ${_customScript}
          `
        }
        let _setting = {...setting, customScript: _customScript}
        let param = {
          func: 's_debug_sql',
          LText: SettingUtils.getDebugSql(_setting, arr_field, regoptions, swhere)
        }
        param.LText = Utils.formatOptions(param.LText)
        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
@@ -249,18 +235,6 @@
          <Col span={24} className="sqlfield">
            <Form.Item label={'可用字段'}>
              id, bid, loginuid, sessionuid, userid, appkey, {type === 'main' ? 'out_id, ' : '' }time_id, orderBy{setting.laypage !== 'false' ? ', pageSize, pageIndex': ''}{usefulFields ? ', ' + usefulFields : ''}
            </Form.Item>
          </Col>
          <Col span={8} style={{whiteSpace: 'nowrap'}}>
            <Form.Item style={{marginBottom: 0}} label="初始化sql">
              {getFieldDecorator('initsql', {
                initialValue: 'false'
              })(
                <Radio.Group>
                  <Radio value="true">是</Radio>
                  <Radio value="false">否</Radio>
                </Radio.Group>
              )}
            </Form.Item>
          </Col>
          <Col span={10}>
src/templates/sharecomponent/settingcomponent/settingform/index.jsx
@@ -1,11 +1,12 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { fromJS } from 'immutable'
import { Form, Row, Col, Input, Radio, Select, Tooltip, Icon, notification, InputNumber, Modal, Table, Popconfirm, Typography } from 'antd'
import { Form, Row, Col, Input, Radio, Select, Tooltip, Icon, notification, InputNumber, Modal, Table, Popconfirm, Typography, Button } from 'antd'
import moment from 'moment'
import Api from '@/api'
import Utils from '@/utils/utils.js'
import SettingUtils from './utils.jsx'
import CustomScript from './customscript'
import './index.scss'
@@ -25,6 +26,10 @@
  state = {
    formlist: [],
    btnloading: false,
    search: '',
    arr_field: '',
    regoptions: [],
    setting: null,
    view: 'normal',
    systemScripts: [{
@@ -35,27 +40,15 @@
      {
        title: 'SQL',
        dataIndex: 'sql',
        width: '60%',
        width: '70%',
        render: (text) => (
          <Paragraph copyable ellipsis={{ rows: 5, expandable: true }}>{text}</Paragraph>
        )
      },
      {
        title: '初始化sql',
        dataIndex: 'initsql',
        width: '12%',
        render: (text, record) => {
          if (record.initsql === 'true') {
            return '是'
          } else {
            return '否'
          }
        }
      },
      {
        title: '状态',
        dataIndex: 'status',
        width: '8%',
        width: '10%',
        render: (text, record) => record.status === 'false' ?
          (
            <div>
@@ -95,6 +88,8 @@
  }
  UNSAFE_componentWillMount() {
    const { config } = this.props
    let _formlist = fromJS(this.props.formlist).toJS()
    let interType = 'inner'
@@ -110,8 +105,38 @@
    delete _setting.subtabs
    // 搜索条件
    let allSearch = Utils.initMainSearch(config.search)
    allSearch = Utils.getAllSearchOptions(allSearch)
    // 显示列字段,用于查询
    let arr_field = []
    config.columns.forEach(col => {
      if (col.field) {
        arr_field.push(col.field)
      }
    })
    arr_field = arr_field.join(',')
    // 正则替换
    let regoptions = allSearch.map(item => {
      return {
        reg: new RegExp('@' + item.key + '@', 'ig'),
        value: `'${item.value}'`
      }
    })
    let _search = this.formatSearch(config.search)
    _search = Utils.joinMainSearchkey(_search)
    _search = _search.replace(/@\$@/ig, '')
    _search = _search ? 'where ' + _search : ''
    this.setState({
      setting: _setting,
      search: _search,
      arr_field: arr_field,
      regoptions: regoptions,
      formlist: _formlist.map(item => {
        if (interType === 'inner' && ['sysInterface', 'interface', 'outerFunc'].includes(item.key)) {
          item.hidden = true
@@ -192,7 +217,7 @@
              })
              reject()
              return
            } else if (values.interType === 'inner') {
            } else if (values.interType === 'inner' && !values.innerFunc && values.default !== 'false' && values.dataresource) {
              let error = Utils.verifySql(values.dataresource)
  
              if (error) {
@@ -209,6 +234,7 @@
            // 数据源保存
            if (
              values.interType === 'inner' && !values.innerFunc &&
              values.default !== 'false' &&
              /[^\s]+\s+[^\s]+/ig.test(values.dataresource) &&
              this.props.config.setting.dataresource !== values.dataresource
            ) {
@@ -232,25 +258,7 @@
                resolve()
              })
            } else {
              if (values.scripts && values.scripts.length > 0) {
                let _customScript = 'declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000) select @ErrorCode=\'\',@retmsg =\'\''
                values.scripts.forEach(item => {
                  if (item.status === 'false' || item.initsql !== 'true') return
                  _customScript += `
                    ${item.sql}
                  `
                })
                values.scripts.forEach(item => {
                  if (item.status === 'false' || item.initsql === 'true') return
                  _customScript += `
                    ${item.sql}
                  `
                })
                values.customScript = _customScript
              } else {
                values.customScript = ''
              }
              values.customScript = this.getCustomScript(values)
              this.sqlverify(values, resolve, reject)
            }
@@ -260,37 +268,13 @@
        })
      })
    } else {
      let _loading = false
      let _setting = fromJS(this.state.setting).toJS()
      if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql')) {
        _loading = true
      }
      if (_setting.scripts && _setting.scripts.length > 0) {
        let _customScript = 'declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000) select @ErrorCode=\'\',@retmsg =\'\''
        _setting.scripts.forEach(item => {
          if (item.status === 'false' || item.initsql !== 'true') return
          _customScript += `
            ${item.sql}
          `
        })
        _setting.scripts.forEach(item => {
          if (item.status === 'false' || item.initsql === 'true') return
          _customScript += `
            ${item.sql}
          `
        })
        _setting.customScript = _customScript
      } else {
        _setting.customScript = ''
      }
      _setting.customScript = this.getCustomScript(_setting)
      let _this = this
      return new Promise((resolve, reject) => {
        if (_loading) {
        if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql')) {
          confirm({
            content: `存在未保存项,确定提交吗?`,
            okText: this.props.dict['model.confirm'],
@@ -309,77 +293,43 @@
    }
  }
  sqlverify = (_setting, _resolve, _reject) => {
    const { config } = this.props
    if (_setting.interType === 'inner' && !_setting.innerFunc && _setting.default !== 'false' && /\s/.test(_setting.dataresource)) {
      let _dataresource = _setting.dataresource
      let _customScript = _setting.customScript
      // 搜索条件
      let allSearch = Utils.initMainSearch(config.search)
      allSearch = Utils.getAllSearchOptions(allSearch)
      // 显示列字段,用于查询
      let arr_field = []
      config.columns.forEach(col => {
        if (col.field) {
          arr_field.push(col.field)
        }
      })
      arr_field = arr_field.join(',')
      // 正则替换
      let regoptions = allSearch.map(item => {
        return {
          reg: new RegExp('@' + item.key + '@', 'ig'),
          value: `'${item.value}'`
        }
      })
      regoptions.push({
        reg: new RegExp('@orderBy@', 'ig'),
        value: _setting.order
      })
      if (_setting.laypage !== 'false') {
        regoptions.push({
          reg: new RegExp('@pageSize@', 'ig'),
          value: 10
        }, {
          reg: new RegExp('@pageIndex@', 'ig'),
          value: 1
        })
      }
      // 数据源处理, 存在显示列时
      if (arr_field) {
        if (/\s/.test(_dataresource)) {
          _dataresource = '(' + _dataresource + ') tb'
        }
        _dataresource = `select ${_setting.laypage !== 'false' ?  'top 10' : ''} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_setting.order}) as rows from ${_dataresource}) tmptable ${_setting.laypage !== 'false' ?  'where rows > 0' : ''} order by tmptable.rows`
      }
      if (_setting.queryType === 'statistics') {
        regoptions.forEach(item => {
          _dataresource = _dataresource.replace(item.reg, item.value)
        })
      }
      if (_customScript) {
        regoptions.forEach(item => {
          _customScript = _customScript.replace(item.reg, item.value)
        })
        _dataresource = `${_customScript}
          ${_dataresource}
  getCustomScript = (setting) => {
    let _customScript = ''
    if (setting.scripts && setting.scripts.length > 0) {
      setting.scripts.forEach(item => {
        if (item.status === 'false') return
        _customScript += `
          ${item.sql}
        `
      }
      })
    }
      _dataresource = _dataresource.replace(/@\$|\$@/ig, '')
    if (_customScript) {
      _customScript = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000) select @ErrorCode='',@retmsg =''
        ${_customScript}
      `
    }
    return _customScript
  }
  sqlverify = (_setting, _resolve, _reject, isChange = false) => {
    const { arr_field, regoptions, search } = this.state
    if (!isChange && _setting.interType === 'inner' && !_setting.innerFunc && _setting.default === 'false' && !_setting.customScript) {
      notification.warning({
        top: 92,
        message: '不执行默认sql时,请添加自定义脚本!',
        duration: 5
      })
      _reject()
      return
    }
    if (_setting.interType === 'inner' && !_setting.innerFunc && _setting.default !== 'false') {
      let param = {
        func: 's_debug_sql',
        LText: _dataresource
        LText: SettingUtils.getDebugSql(_setting, arr_field, regoptions, search)
      }
      param.LText = Utils.formatOptions(param.LText)
      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
@@ -495,12 +445,11 @@
  }
  changeView = () => {
    const { view } = this.state
    const { view, arr_field, regoptions, search } = this.state
    let _this = this
    if (view === 'normal') {
      this.handleConfirm('change').then(() => {
        const { config } = this.props
        const { setting } = this.state
        if (setting.interType !== 'inner' || (setting.interType === 'inner' && setting.innerFunc)) {
@@ -512,20 +461,7 @@
          return
        }
        let _search = this.formatSearch(config.search)
        _search = Utils.joinMainSearchkey(_search)
        _search = _search.replace(/@\$@/ig, '')
        _search = _search ? 'where ' + _search : ''
        let arr_field = []
        config.columns.forEach(col => {
          if (col.field) {
            arr_field.push(col.field)
          }
        })
        arr_field = arr_field.join(',')
        let _search = search
        
        let _dataresource = setting.dataresource
@@ -534,18 +470,8 @@
        }
        if (setting.queryType === 'statistics') { // 统计数据源,内容替换
          let allSearch = Utils.initMainSearch(config.search)
          allSearch = Utils.getAllSearchOptions(allSearch)
          let options = allSearch.map(item => {
            return {
              reg: new RegExp('@' + item.key + '@', 'ig'),
              value: item.value
            }
          })
          options.forEach(item => {
            _dataresource = _dataresource.replace(item.reg, `'${item.value}'`)
          regoptions.forEach(item => {
            _dataresource = _dataresource.replace(item.reg, item.value)
          })
          _search = ''
@@ -555,12 +481,33 @@
        let _scripts = fromJS(this.state.systemScripts).toJS()
        _scripts[0].value = LText
        this.setState({
          view: 'custom',
          systemScripts: _scripts
        })
        this.scrolltop()
        if (setting.default === 'false') {
          this.setState({
            view: 'custom',
            btnloading: false,
            systemScripts: _scripts
          })
          this.scrolltop()
        } else {
          this.setState({
            btnloading: true
          })
          new Promise((resolve, reject) => {
            this.sqlverify(setting, resolve, reject, true)
          }).then(() => {
            this.setState({
              view: 'custom',
              btnloading: false,
              systemScripts: _scripts
            })
            this.scrolltop()
          }, () => {
            this.setState({
              btnloading: false
            })
          })
        }
      })
    } else {
      let _loading = false
@@ -869,7 +816,7 @@
  render() {
    const { config, type } = this.props
    const { formlist, view, setting, scriptsColumns, systemScripts } = this.state
    const { formlist, view, setting, scriptsColumns, systemScripts, arr_field, regoptions, search, btnloading } = this.state
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
@@ -888,8 +835,10 @@
          <CustomScript
            type={type}
            setting={setting}
            swhere={search}
            arr_field={arr_field}
            regoptions={regoptions}
            dict={this.props.dict}
            customScripts={setting.scripts}
            searches={config.search}
            systemScripts={systemScripts}
            scriptsChange={this.scriptsChange}
@@ -907,7 +856,7 @@
        <Form {...formItemLayout} className="model-table-setting-form" id="model-table-setting-form">
          {view !=='custom' ? <Row gutter={24}>{this.getFields(formlist)}</Row> : null}
          <Row gutter={24}>
            {view !=='custom' ? <span onClick={this.changeView} style={{float: 'right', color: '#1890ff', marginRight: 12, marginTop: 15, cursor: 'pointer'}}>自定义设置<Icon style={{marginLeft: 5}} type="right" /></span> : null}
            {view !=='custom' ? <Button onClick={this.changeView} className="to-custom-script" loading={btnloading}>自定义设置<Icon style={{marginLeft: 5}} type="right" /></Button> : null}
            {view ==='custom' ? <span onClick={this.changeView} style={{float: 'left', color: '#1890ff', marginLeft: 12, marginTop: 15, cursor: 'pointer'}}><Icon style={{marginRight: 5}} type="left" />基础设置</span> : null}
          </Row>
        </Form>
src/templates/sharecomponent/settingcomponent/settingform/index.scss
@@ -33,4 +33,13 @@
    padding: 10px;
    color: rgb(24, 144, 255);
  }
  .to-custom-script {
    float: right;
    color: #1890ff;
    margin-right: 12px;
    margin-top: 15px;
    cursor: pointer;
    border: 0;
    box-shadow: unset;
  }
}
src/templates/sharecomponent/settingcomponent/settingform/utils.jsx
New file
@@ -0,0 +1,79 @@
export default class SettingUtils {
  /**
   * @description 生成页面查询语句
   * @return {String}  arr_field     显示列字段
   * @return {String}  search        搜索条件
   * @return {Object}  setting       页面设置
   * @return {Array}   regoptions    搜索条件正则替换
   */
  static getDebugSql (setting, arr_field, regoptions, search) {
    let sql = ''
    let _dataresource = setting.dataresource
    let _customScript = setting.customScript
    if (setting.interType === 'inner' && !setting.innerFunc && setting.default === 'false') {
      _dataresource = ''
    }
    if (_dataresource) {
      _dataresource = _dataresource.replace(/@\$|\$@/ig, '')
    }
    if (_customScript) {
      _customScript = _customScript.replace(/@\$|\$@/ig, '')
    }
    // 正则替换
    let _regoptions = JSON.parse(JSON.stringify(regoptions))
    let _search = search
    if (setting.queryType === 'statistics' && _dataresource) {
      _regoptions.forEach(item => {
        _dataresource = _dataresource.replace(item.reg, item.value)
      })
      _search = ''
    }
    if (_customScript) {
      _regoptions.push({
        reg: new RegExp('@orderBy@', 'ig'),
        value: setting.order
      })
      if (setting.laypage !== 'false') {
        _regoptions.push({
          reg: new RegExp('@pageSize@', 'ig'),
          value: 10
        }, {
          reg: new RegExp('@pageIndex@', 'ig'),
          value: 1
        })
      }
      _regoptions.forEach(item => {
        _customScript = _customScript.replace(item.reg, item.value)
      })
    }
    // 数据源处理, 存在显示列时
    if (arr_field && _dataresource) {
      if (/\s/.test(_dataresource)) {
        _dataresource = '(' + _dataresource + ') tb'
      }
      _dataresource = `select ${setting.laypage !== 'false' ?  'top 10' : ''} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${setting.order}) as rows from ${_dataresource} ${_search}) tmptable ${setting.laypage !== 'false' ?  'where rows > 0' : ''} order by tmptable.rows`
    }
    if (_customScript) {
      sql = `${_customScript}
        ${_dataresource}
        aaa:
        if @ErrorCode!=''
          insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
      `
    } else {
      sql = _dataresource
    }
    return sql
  }
}