king
2020-10-23 407c0f1765c7d085218a91ad8842784977383d05
src/menu/actioncomponent/index.jsx
@@ -3,7 +3,6 @@
import {connect} from 'react-redux'
import { is, fromJS } from 'immutable'
import { Modal, notification, Button } from 'antd'
import moment from 'moment'
import Api from '@/api'
import options from '@/store/options.js'
@@ -39,7 +38,6 @@
    card: null,          // 编辑中元素
    formlist: null,      // 表单信息
    actionlist: null,    // 按钮组
    copying: false,      // 按钮复制中
    visible: false,      // 模态框控制
    profVisible: false   // 验证信息模态框
  }
@@ -267,15 +265,10 @@
  }
  /**
   * @description 搜索修改后提交保存
   * 1、去除系统默认搜索条件
   * 2、字段及提示文字重复校验
   * 3、更新下拉菜单可选集合
   * 4、下拉菜单数据源语法验证
   * @description 按钮修改后提交保存
   */
  handleSubmit = () => {
    const { config, menu } = this.props
    const { card } = this.state
    const { config } = this.props
    let _actionlist = fromJS(this.state.actionlist).toJS()
    this.actionFormRef.handleConfirm().then(btn => {
@@ -304,350 +297,11 @@
      }
      this.setState({
        copying: true
        actionlist: _actionlist,
        visible: false
      }, () => {
        this.props.updateaction({...config, action: _actionlist})
      })
      let copyActionId = '' // 按钮为复制时,记录当前按钮的Id,菜单取消保存时,删除复制按钮配置信息
      /**
       * @description 按钮保存校验
       * 1、检查按钮是否为表单或表单标签页,如前后一致,则复制其内容
       * 2、检查按钮是否为标签页,如前后一致,则复制标签页
       */
      new Promise(resolve => {
        if (
          !card.originCard ||
          (btn.OpenType === 'pop' && card.originCard.OpenType !== 'pop') ||
          (['tab', 'blank'].includes(btn.OpenType) && !['tab', 'blank'].includes(card.originCard.OpenType)) ||
          (btn.OpenType === 'popview' && (!btn.createTab || card.originCard.OpenType !== 'popview' || !card.originCard.linkTab))
        ) { // 按钮不是复制,或按钮前后类型不一致时,直接保存
          resolve('save')
        } else if (btn.OpenType === 'pop' || btn.OpenType === 'tab' || btn.OpenType === 'blank') {
          resolve('subconf')
        } else if (btn.OpenType === 'popview') {
          resolve('subtab')
        } else {
          resolve('save')
        }
      }).then(result => { // 查询原按钮配置信息
        if (result === 'save' || result === 'subtab') return result
        return Api.getSystemConfig({
          func: 'sPC_Get_LongParam',
          MenuID: card.originCard.uuid
        })
      }).then(result => { // 复制按钮配置信息,保存至新添加按钮
        if (result === 'save' || result === 'subtab') return result
        if (result.status && result.LongParam) {
          let _LongParam = ''
          // 解析配置
          if (result.LongParam) {
            try {
              _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
            } catch (e) {
              console.warn('Parse Failure')
              _LongParam = ''
            }
          }
          let _temp = '' // 配置信息类型
          // 修改模态框标题名称
          if (btn.OpenType === 'pop' && _LongParam && _LongParam.type === 'Modal') {
            try {
              _LongParam.setting.title = btn.label
              _LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(_LongParam)))
              _temp = 'Modal'
            } catch {
              console.warn('Stringify Failure')
              _LongParam = ''
              _temp = ''
            }
          } else if (['tab', 'blank'].includes(btn.OpenType) && _LongParam && _LongParam.type === 'FormTab') {
            try {
              _LongParam.action = _LongParam.action.map(_btn => {
                _btn.uuid = Utils.getuuid()
                return _btn
              })
              _LongParam.tabgroups.forEach(_groupId => {
                _LongParam[_groupId] = _LongParam[_groupId].map(_tab => {
                  _tab.uuid = Utils.getuuid()
                  return _tab
                })
              })
              _LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(_LongParam)))
              _temp = 'FormTab'
            } catch {
              console.warn('Stringify Failure')
              _LongParam = ''
              _temp = ''
            }
          }
          if (!_temp) return 'save'
          let param = {
            func: 'sPC_ButtonParam_AddUpt',
            ParentID: menu.MenuID,
            MenuID: btn.uuid,
            MenuNo: menu.MenuNo,
            Template: _temp,
            MenuName: btn.label,
            PageParam: JSON.stringify({Template: _temp}),
            LongParam: _LongParam
          }
          return Api.getSystemConfig(param)
        } else {
          if (!result.status) {
            notification.warning({
              top: 92,
              message: result.message,
              duration: 5
            })
          }
          return 'save'
        }
      }).then(result => {
        if (result === 'save' || result === 'subtab') return result
        if (!result.status) {
          notification.warning({
            top: 92,
            message: result.message,
            duration: 5
          })
        } else {
          copyActionId = btn.uuid
        }
        return 'save'
      }).then(result => { // 查询原按钮关联标签信息
        if (result === 'save') return result
        return Api.getSystemConfig({
          func: 'sPC_Get_LongParam',
          MenuID: card.originCard.linkTab
        })
      }).then(result => { // 标签复制
        if (result === 'save') return result
        let _LongParam = '' // 标签配置信息
        if (!result.status) {
          notification.warning({
            top: 92,
            message: result.message,
            duration: 5
          })
        } else if (result.LongParam) {
          // 解析标签配置
          try {
            _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
          } catch (e) {
            console.warn('Parse Failure')
            _LongParam = ''
          }
        }
        if (!_LongParam) {
          return 'save'
        } else {
          copyActionId = btn.linkTab
          return new Promise(resolve => {
            this.copytab(btn, _LongParam, resolve)
          })
        }
      }).then(() => {
        this.setState({
          actionlist: _actionlist,
          copying: false,
          visible: false
        }, () => {
          this.props.updateaction({...config, action: _actionlist}, copyActionId)
        })
      })
    })
  }
  /**
   * @description 标签复制
   * 1、保存按钮关联的新标签
   * 2、保存标签按钮信息
   * 3、保存新标签中按钮的子配置信息
   */
  copytab = (btn, _tab, _resolve) => {
    let _LongParam = ''
    _tab.uuid = btn.linkTab
    _tab.tabName = _tab.tabName + moment().format('YYYY-MM-DD HH:mm:ss')
    _tab.tabNo = _tab.tabNo + moment().format('YYYY-MM-DD HH:mm:ss')
    let param = {
      func: 'sPC_Tab_AddUpt',
      MenuID: _tab.uuid,
      MenuNo: _tab.tabNo,
      Template: _tab.Template,
      MenuName: _tab.tabName,
      Remark: _tab.Remark,
      PageParam: JSON.stringify({Template: _tab.Template}),
      Sort: 0
    }
    let _oriActions = []
    let btnParam = {
      func: 'sPC_Button_AddUpt',
      Type: 40,
      ParentID: _tab.uuid,
      MenuNo: _tab.tabNo,
      Template: _tab.Template,
      PageParam: '',
      LongParam: '',
      LText: ''
    }
    try {
      let _linkchange = {}
      btnParam.LText = []
      _tab.action = _tab.action.map((item, index) => {
        let uuid = Utils.getuuid()
        if (item.OpenType === 'pop') {
          _oriActions.push({
            prebtn: JSON.parse(JSON.stringify(item)),
            curuuid: uuid,
            Template: 'Modal'
          })
        } else if (item.OpenType === 'popview') {
          _linkchange[item.linkTab] = Utils.getuuid()
          item.linkTab = _linkchange[item.linkTab]
        }
        item.uuid = uuid
        btnParam.LText.push(`select '${item.uuid}' as menuid, '${item.label}' as menuname, '${(index + 1) * 10}' as Sort`)
        return item
      })
      if (_tab.funcs && _tab.funcs.length > 0) {
        _tab.funcs = _tab.funcs.map(item => {
          if (item.type === 'tab') {
            item.linkTab = _linkchange[item.linkTab]
            item.menuNo = ''
            item.subfuncs = []
          }
          return item
        })
      }
      btnParam.LText = btnParam.LText.join(' union all ')
      btnParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      btnParam.LText = Utils.formatOptions(btnParam.LText)
      btnParam.secretkey = Utils.encrypt(btnParam.LText, btnParam.timestamp)
      _LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(_tab)))
    } catch {
      console.warn('Stringify Failure')
      _LongParam = ''
      _resolve('save')
      return
    }
    param.LongParam = _LongParam
    new Promise(resolve => {
      Api.getSystemConfig(param).then(response => {
        if (response.status) {
          resolve(true)
        } else {
          notification.warning({
            top: 92,
            message: response.message,
            duration: 5
          })
          resolve(false)
        }
      })
    }).then(result => {
      if (!result) return result
      if (!btnParam.LText) return true
      return Api.getSystemConfig(btnParam)
    }).then(result => {
      if (result === false || result === true) return result
      if (result.status) {
        return true
      } else {
        notification.warning({
          top: 92,
          message: result.message,
          duration: 5
        })
        return false
      }
    }).then(result => {
      if (!result) return result
      if (_oriActions.length === 0) return true
      let deffers = _oriActions.map(item => {
        return new Promise(resolve => {
          Api.getSystemConfig({
            func: 'sPC_Get_LongParam',
            MenuID: item.prebtn.uuid
          }).then(response => {
            if (!response.status || !response.LongParam) {
              resolve(response)
            } else {
              let _param = {
                func: 'sPC_ButtonParam_AddUpt',
                ParentID: _tab.uuid,
                MenuID: item.curuuid,
                MenuNo: _tab.tabNo,
                Template: item.Template,
                MenuName: item.prebtn.label,
                PageParam: JSON.stringify({Template: item.Template}),
                LongParam: response.LongParam
              }
              Api.getSystemConfig(_param).then(resp => {
                resolve(resp)
              })
            }
          })
        })
      })
      return Promise.all(deffers)
    }).then(result => {
      let error = ''
      if (typeof(result) === 'object') {
        result.forEach(resul => {
          if (!resul.status && !error) {
            error = resul
          }
        })
      }
      if (error) {
        notification.warning({
          top: 92,
          message: error.message,
          duration: 5
        })
      }
      _resolve('save')
    })
  }
@@ -666,15 +320,19 @@
        _actionlist = _actionlist.filter(item => item.uuid !== card.uuid)
        let delcard = {
          type: 'action',
          card: card
        let delButtons = sessionStorage.getItem('delButtons')
        try {
          delButtons = JSON.parse(delButtons)
          delButtons.push(card.uuid)
        } catch {
          delButtons = [card.uuid]
        }
        sessionStorage.setItem('delButtons', JSON.stringify(delButtons))
        _this.setState({
          actionlist: _actionlist
        }, () => {
          _this.props.updateaction({...config, action: _actionlist}, '', delcard)
          _this.props.updateaction({...config, action: _actionlist})
        })
      },
      onCancel() {}
@@ -723,39 +381,13 @@
   * @description 创建按钮存储过程
   */
  creatFunc = () => {
    const { config, menu } = this.props
    const { menu } = this.props
    let _config = fromJS(this.props.config).toJS()
    this.actionFormRef.handleConfirm().then(res => {
      let btn = res         // 按钮信息
      let newLText = ''     // 创建存储过程sql
      let DelText = ''      // 删除存储过程sql
      let _actionlist = fromJS(this.state.actionlist).toJS()
      _actionlist = _actionlist.filter(item => !item.origin || item.uuid === btn.uuid)
      let labelrepet = false
      _actionlist = _actionlist.map(item => {
        if (item.uuid !== btn.uuid && item.label === btn.label) {
          labelrepet = true
        }
        if (item.uuid === btn.uuid) {
          return btn
        } else {
          return item
        }
      })
      if (labelrepet) {
        notification.warning({
          top: 92,
          message: this.state.dict['model.name.exist'] + ' !',
          duration: 5
        })
        return
      }
      // 创建存储过程,必须填写内部函数名
      if (btn.intertype !== 'inner') {
@@ -767,102 +399,50 @@
        return
      }
      new Promise(resolve => {
        // 弹窗(表单)类按钮,先获取按钮配置信息,如果尚未配置按钮则会报错并终止。
        // 获取信息后生成删除和创建存储过程的语句
        if (btn.OpenType === 'pop') {
          Api.getSystemConfig({
            func: 'sPC_Get_LongParam',
            MenuID: btn.uuid
          }).then(res => {
            let _LongParam = ''
            if (res.status && res.LongParam) {
              try {
                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
              } catch (e) {
                console.warn('Parse Failure')
                _LongParam = ''
              }
            }
            if (_LongParam) {
              let fields = []
              if (_LongParam.groups.length > 0) {
                _LongParam.groups.forEach(group => {
                  fields = [...fields, ...group.sublist]
                })
              } else {
                fields = _LongParam.fields
              }
              let _param = {
                funcName: btn.innerFunc,
                name: _config.setting.tableName || '',
                fields: fields,
                menuNo: menu.MenuNo
              }
              newLText = Utils.formatOptions(DevUtils.getfunc(_param, btn, menu, _config))
              DelText = Utils.formatOptions(DevUtils.dropfunc(btn.innerFunc))
              resolve(true)
            } else {
              notification.warning({
                top: 92,
                message: '弹窗(表单)按钮,请先配置表单信息!',
                duration: 5
              })
              resolve(false)
            }
      if (btn.OpenType === 'pop') {
        let fields = []
        if (btn.groups.length > 0) {
          btn.groups.forEach(group => {
            fields = [...fields, ...group.sublist]
          })
        } else if (btn.OpenType === 'excelIn') {
          if (btn.verify && btn.verify.sheet && btn.verify.columns && btn.verify.columns.length > 0) {
            let _param = {
              funcName: btn.innerFunc,
              menuNo: menu.MenuNo
            }
            newLText = Utils.formatOptions(DevUtils.getexcelInfunc(_param, btn, menu))
            DelText = Utils.formatOptions(DevUtils.dropfunc(btn.innerFunc))
            resolve(true)
          } else {
            notification.warning({
              top: 92,
              message: '请完善导入Excel验证信息!',
              duration: 5
            })
            resolve(false)
          }
        } else if (btn.OpenType === 'excelOut') {
          let _param = {
            innerFunc: btn.innerFunc
          }
          newLText = Utils.formatOptions(DevUtils.getTableFunc(_param, menu, _config)) // 创建存储过程sql
          DelText = Utils.formatOptions(DevUtils.dropfunc(btn.innerFunc))
          resolve(true)
        } else {
          let _param = {
            funcName: btn.innerFunc,
            name: _config.setting.tableName || '',
            fields: '',
            menuNo: menu.MenuNo
          }
          newLText = Utils.formatOptions(DevUtils.getfunc(_param, btn, menu, _config))
          DelText = Utils.formatOptions(DevUtils.dropfunc(btn.innerFunc))
          resolve(true)
          fields = btn.fields
        }
      }).then(res => {
        if (!res) return
        this.refs.btnCreatFunc.exec(btn.innerFunc, newLText, DelText).then(result => {
          if (result !== 'success') return
        let _param = {
          funcName: btn.innerFunc,
          name: _config.setting.tableName || '',
          fields: fields,
          menuNo: menu.MenuNo
        }
        newLText = Utils.formatOptions(DevUtils.getfunc(_param, btn, menu, _config))
        DelText = Utils.formatOptions(DevUtils.dropfunc(btn.innerFunc))
      } else if (btn.OpenType === 'excelIn') {
        let _param = {
          funcName: btn.innerFunc,
          menuNo: menu.MenuNo
        }
        newLText = Utils.formatOptions(DevUtils.getexcelInfunc(_param, btn, menu))
        DelText = Utils.formatOptions(DevUtils.dropfunc(btn.innerFunc))
      } else if (btn.OpenType === 'excelOut') {
        let _param = {
          innerFunc: btn.innerFunc
        }
          this.setState({
            actionlist: _actionlist
          }, () => {
            this.props.updateaction({...config, action: _actionlist})
          })
        })
      })
        newLText = Utils.formatOptions(DevUtils.getTableFunc(_param, menu, _config)) // 创建存储过程sql
        DelText = Utils.formatOptions(DevUtils.dropfunc(btn.innerFunc))
      } else {
        let _param = {
          funcName: btn.innerFunc,
          name: _config.setting.tableName || '',
          fields: '',
          menuNo: menu.MenuNo
        }
        newLText = Utils.formatOptions(DevUtils.getfunc(_param, btn, menu, _config))
        DelText = Utils.formatOptions(DevUtils.dropfunc(btn.innerFunc))
      }
      this.refs.btnCreatFunc.exec(btn.innerFunc, newLText, DelText)
    })
  }
@@ -870,7 +450,7 @@
   * @description 按钮双击触发子配置
   */
  btnDoubleClick = (element) => {
    if (!element.origin && (element.OpenType === 'pop' || element.OpenType === 'popview' || element.OpenType === 'blank' || element.OpenType === 'tab')) {
    if (element.OpenType === 'pop' || element.OpenType === 'popview') {
      this.props.setSubConfig(element)
    } else {
      notification.warning({
@@ -883,7 +463,7 @@
  render() {
    const { config, plus } = this.props
    const { actionlist, visible, card, dict, copying, profVisible } = this.state
    const { actionlist, visible, card, dict, profVisible } = this.state
    return (
      <div className="model-menu-action-list">
@@ -904,9 +484,9 @@
          maskClosable={false}
          onCancel={this.editModalCancel}
          footer={[
            card && !card.copyType ? <CreateFunc key="create" dict={dict} ref="btnCreatFunc" trigger={this.creatFunc}/> : null,
            <CreateFunc key="create" dict={dict} ref="btnCreatFunc" trigger={this.creatFunc}/>,
            <Button key="cancel" onClick={this.editModalCancel}>{dict['model.cancel']}</Button>,
            <Button key="confirm" type="primary" loading={copying} onClick={this.handleSubmit}>{dict['model.confirm']}</Button>
            <Button key="confirm" type="primary" onClick={this.handleSubmit}>{dict['model.confirm']}</Button>
          ]}
          destroyOnClose
        >
@@ -934,7 +514,6 @@
        >
          {card && !card.execMode && card.OpenType !== 'excelIn' && card.OpenType !== 'excelOut' ?
            <VerifyCard
              floor={this.props.type}
              card={card}
              dict={dict}
              config={config}