king
2019-10-15 ee32a69f9a7f25c37757325dc28ac7b5127dceca
src/tabviews/datamanage/modules/action/index.jsx
@@ -1,8 +1,9 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
// import { is, fromJS } from 'immutable'
import {connect} from 'react-redux'
import { Button, Affix, Modal, notification } from 'antd'
import MutilForm from '@/components/mutilform'
import {modifyTabview} from '@/store/action'
import Api from '@/api'
import './index.scss'
@@ -10,102 +11,314 @@
class MainAction extends Component {
  static propTpyes = {
    MenuNo: PropTypes.string,
    MenuNo: PropTypes.string, // 菜单参数
    columns: PropTypes.array, // 显示列用于表单列
    actions: PropTypes.array, // 搜索条件列表
    dict: PropTypes.object // 字典项
    dict: PropTypes.object, // 字典项
    mainKey: PropTypes.array
  }
  state = {
    visible: false,
    formdata: null,
    tabledata: null,
    confirmLoading: false,
    execAction: null
    visible: false, // 弹窗是否显示
    formdata: null, // 表单显示列数据
    tabledata: null, // 列表选择数据
    confirmLoading: false, // 确认中
    execAction: null, // 执行按钮属性
    primarykey: null, // 主键
    bidkey: null, // BID
    defaultproc: { // 默认添加、修改、删除存储过程
      Add: 'sDataManageAdd',
      Update: 'sDataManageUpt',
      Delete: 'sDataManageDel'
    }
  }
  
  refreshdata = () => {
    this.props.refreshdata()
  submitaction = (action, datalist, primarykey, bidkey) => {
    if (action.Ot === 'requiredSgl' || action.Ot === 'requiredOnce') { // 选择单行或多行id拼接执行
      let ids = datalist.map(data => {
        return data[primarykey]
      })
      let bids = null
      if (bidkey) {
        bids = datalist.map(data => {
          return data[bidkey] || ''
        })
      }
      return Api.submitInterface({
        func: action.AuditProc || this.state.defaultproc[action.Action],
        ID: ids.join(','), // 主键字段
        BID: bids ? bids.join(',') : '' // BID字段
      })
    } else if (action.Ot === 'required') { // 可选多行,循环执行
      let deffers = datalist.map(data => {
        return new Promise((resolve, reject) => {
          Api.submitInterface({
            func: action.AuditProc || this.state.defaultproc[action.Action],
            ID: data[primarykey], // 主键字段
            BID: data[bidkey] || '' // BID字段
          }).then(res => {
            resolve(res)
          })
        })
      })
      return Promise.all(deffers)
    } else { // 不选行
      return Api.submitInterface({
        func: action.AuditProc || this.state.defaultproc[action.Action],
        ID: '', // 主键字段
        BID: '' // BID字段
      })
    }
  }
  actionTrigger = (item) => {
    let _this = this
    let data = this.props.gettableselected() || []
    if (item.Ot === 'required' && data.length === 0) {
    let datalist = this.props.gettableselected() || []
    /************* 校验列表数据选择是否正确 **************/
    if ((item.Ot === 'requiredSgl' || item.Ot === 'required' || item.Ot === 'requiredOnce') && datalist.length === 0) {
      // 需要选择行时,校验数据
      notification.warning({
        top: 92,
        message: this.props.dict['main.action.confirm.selectline']
        message: this.props.dict['main.action.confirm.selectline'],
        duration: 10
      })
      return
    } else if (item.Ot === 'pop' && data.length !== 1) {
      if (data.length === 0) {
        // 需要选择行时,校验数据
        notification.warning({
          top: 92,
          message: this.props.dict['main.action.confirm.selectline']
        })
        return
      } else {
    } else if (item.Ot === 'requiredSgl' && datalist.length > 1) {
        // 需要选择单行时,校验数据
        notification.warning({
          top: 92,
          message: this.props.dict['main.action.confirm.selectSingleLine']
        message: this.props.dict['main.action.confirm.selectSingleLine'],
        duration: 10
      })
      return
    }
    /************* 校验主键与BID **************/
    let ID = []
    let BID = []
    if (item.Ot === 'requiredSgl' || item.Ot === 'required' || item.Ot === 'requiredOnce') {
      this.props.mainKey.forEach(key => {
        if (key.IDField === '1') {
          ID.push(key.FieldName)
        } else {
          BID.push(key.FieldName)
        }
      })
      if (ID.length === 0) { // 主键校验
        notification.warning({
          top: 92,
          message: this.props.dict['main.action.primarykey.required'],
          duration: 10
        })
        return
      } else if (ID.length > 1) {
        notification.warning({
          top: 92,
          message: this.props.dict['main.action.primarykey.repetition'],
          duration: 10
        })
        return
      }
      if (BID.length > 1) { // BID校验
        notification.warning({
          top: 92,
          message: this.props.dict['main.action.primarykey.repetitionbid'],
          duration: 10
        })
        return
      }
    }
    if (item.Action === 'Prompt' || item.Action === 'Delete') {
    /********************* 操作处理 **********************/
    if (item.OpenType === 'prompt') { // 确认框
      confirm({
        title: this.props.dict['main.action.confirm.tip'],
        onOk() {
          return Api.setActionSubmit({
            func: 'SetActionSubmitSuccess'
            // func: 'SetActionSubmitError'
          }).then((res) => {
          return _this.submitaction(item, datalist, ID[0], (BID.length === 1 ? BID[0] : ''))
            .then(res => {
              if (Array.isArray(res)) {
                let iserror = false
                res.forEach(result => {
                  if (!result.status && !iserror) {
                    notification.error({
                      top: 92,
                      message: result.message,
                      duration: 15
                    })
                    iserror = true
                  }
                })
                if (!iserror) {
                  notification.success({
                    top: 92,
                    message: _this.props.dict['main.action.confirm.success']
                  })
                  if (item.ReloadForm && item.ReloadForm !== 'false' && item.ReloadForm !== 'singlegrid') {
                    _this.props.refreshdata(item.ReloadForm)
                  }
                }
              } else {
            if (res.status) {
              notification.success({
                top: 92,
                message: _this.props.dict['main.action.confirm.success']
                // duration: 0
                // description:
              })
              _this.refreshdata()
                  if (item.ReloadForm && item.ReloadForm !== 'false' && item.ReloadForm !== 'singlegrid') {
                    _this.props.refreshdata(item.ReloadForm)
                  }
            } else {
              notification.error({
                top: 92,
                message: res.message
                    message: res.message,
                    duration: 15
              })
                }
            }
          })
        },
        onCancel() {}
      })
    } else if (item.Action === 'Update') {
      Api.getModelFormData(item.MenuID).then(res => {
    } else if (item.OpenType === 'execproc') { // 直接执行
      this.submitaction(item, datalist, ID[0], (BID.length === 1 ? BID[0] : ''))
        .then(res => {
          if (Array.isArray(res)) {
            let iserror = false
            res.forEach(result => {
              if (!result.status && !iserror) {
                notification.error({
                  top: 92,
                  message: result.message,
                  duration: 15
                })
                iserror = true
              }
            })
            if (!iserror) {
              notification.success({
                top: 92,
                message: this.props.dict['main.action.confirm.success']
              })
              if (item.ReloadForm && item.ReloadForm !== 'false' && item.ReloadForm !== 'singlegrid') {
                this.props.refreshdata(item.ReloadForm)
              }
            }
          } else {
        if (res.status) {
              notification.success({
                top: 92,
                message: this.props.dict['main.action.confirm.success']
              })
              if (item.ReloadForm && item.ReloadForm !== 'false' && item.ReloadForm !== 'singlegrid') {
                this.props.refreshdata(item.ReloadForm)
              }
            } else {
              notification.error({
                top: 92,
                message: res.message,
                duration: 15
              })
            }
          }
        })
    } else if (item.OpenType === 'newpage') { // 打开新页面
      let src = '#/' + item.LinkUrl + '?param=' + window.btoa(JSON.stringify({UserId: sessionStorage.getItem('UserID'), ID: datalist[0][ID[0]], BID: BID.length === 1 ? datalist[0][BID[0]] : ''}))
      window.open(src)
    } else if (item.OpenType === 'pop') {
          this.setState({
            formdata: res.data.map(input => {
              let validate = input.Validate && JSON.parse(input.Validate)
              input.DynOptions = JSON.parse(input.DynOptions)
              input.required = (validate && validate.required) || false
              return input
        formdata: this.props.columns.map(column => {
          column.readonly = false
          if (column.ReadOnly.includes(item.MenuID)) {
            column.readonly = true
          }
          return column
            }),
            visible: true,
            execAction: item,
            tabledata: data[0]
        primarykey: ID[0],
        bidkey: BID.length === 1 ? BID[0] : '',
        tabledata: datalist[0] || ''
          })
    } else if (item.OpenType === 'tab') {
      let menu = {
        MenuNo: this.props.MenuNo,
        MenuID: item.MenuID,
        MenuName: item.MenuName,
        type: 'TabForm',
        param: {
          formdata: this.props.columns.map(column => {
            column.readonly = false
            if (column.ReadOnly.includes(item.MenuID)) {
              column.readonly = true
        }
            return column
          }),
          execAction: item,
          primarykey: ID[0],
          bidkey: BID.length === 1 ? BID[0] : '',
          tabledata: datalist[0] || '',
          defaultproc: this.state.defaultproc,
          dict: this.props.dict
        }
      }
      let tabs = JSON.parse(JSON.stringify(this.props.tabviews))
      let _index = null
      let isexit = false
      tabs = tabs.map((tab, index) => {
        tab.selected = false
        if (tab.MenuNo === this.props.MenuNo && tab.MenuID === item.MenuID) {
          isexit = true
          tab.selected = true
          tab.param = menu.param
        } else if (tab.MenuNo === this.props.MenuNo && tab.type !== 'TabForm') {
          _index = index
          menu.MenuName = tab.MenuName + '-' + menu.MenuName
          menu.selected = true
        }
        return tab
      })
      if (!isexit) {
        tabs.splice(_index + 1, 0, menu)
      }
      this.props.modifyTabview(tabs)
    } else if (item.OpenType === 'blank') {
      this.props.switchview(item)
    } else {
      notification.warning({
        top: 92,
        message: this.props.dict['main.action.settingerror'],
        duration: 10
      })
    }
  }
  changemenu(e) {
    let menu = {}
    let tabs = JSON.parse(JSON.stringify(this.props.tabviews))
    tabs = tabs.filter(tab => {
      tab.selected = false
      return tab.MenuID !== menu.MenuID
    })
    menu.selected = true
    tabs.push(menu)
    this.props.modifyTabview(tabs)
  }
  getModels = () => {
    if (!this.state.execAction) return
    let cols = +this.state.execAction.FormLineQty
    if (![1, 2, 3].includes(cols)) {
      cols = 2
    }
    return (
      <Modal
        wrapClassName='action-modal'
        title={(this.state.execAction && this.state.execAction.MenuName) || ''}
        title={this.state.execAction.MenuName || ''}
        visible={this.state.visible}
        width={(this.state.execAction && +this.state.execAction.PopWidth) || 520}
        width={document.body.clientWidth * this.state.execAction.PopWidth}
        onOk={this.handleOk}
        confirmLoading={this.state.confirmLoading}
        onCancel={this.handleCancel}
@@ -115,6 +328,7 @@
            dict={this.props.dict}
            formlist={this.state.formdata}
            data={this.state.tabledata}
            cols={cols}
            wrappedComponentRef={(inst) => this.formRef = inst}
          />}
      </Modal>
@@ -126,11 +340,25 @@
      this.setState({
        confirmLoading: true
      })
      console.log(res)
      Api.setActionSubmit({
        func: 'SetActionSubmitSuccess'
      }).then((res) => {
        if (res.status) {
      let values = []
      this.props.columns.forEach(column => {
        let value = ''
        if (res[column.FieldName] || res[column.FieldName] === 0) { // 依次选取表单值、表格数据值、初始值
          value = res[column.FieldName]
        } else if (this.state.tabledata && this.state.tabledata[column.FieldName]) {
          value = this.state.tabledata[column.FieldName]
        } else if (column.InitVal) {
          value = column.InitVal
        }
        values.push(value)
      })
      Api.submitInterface({
        func: this.state.execAction.AuditProc || this.state.defaultproc[this.state.execAction.Action],
        AddLongText: values.join(','), // 表单数据
        ID: (this.state.tabledata && this.state.primarykey) ? this.state.tabledata[this.state.primarykey] : '', // 主键字段
        BID: (this.state.tabledata && this.state.bidkey) ? this.state.tabledata[this.state.bidkey] : '' // BID字段
      }).then(result => {
        if (result.status) {
          notification.success({
            top: 92,
            message: this.props.dict['main.action.confirm.success']
@@ -139,10 +367,17 @@
            confirmLoading: false,
            visible: false
          })
          if (this.state.execAction.ReloadForm && this.state.execAction.ReloadForm !== 'false' && this.state.execAction.ReloadForm !== 'singlegrid') {
            this.props.refreshdata(this.state.execAction.ReloadForm)
          }
        } else {
          this.setState({
            confirmLoading: false
          })
          notification.error({
            top: 92,
            message: res.message
            message: result.message,
            duration: 15
          })
        }
      })
@@ -151,6 +386,7 @@
  handleCancel = () => {
    this.setState({
      confirmLoading: false,
      visible: false
    })
    this.formRef.handleReset()
@@ -159,11 +395,6 @@
  UNSAFE_componentWillMount () {
  }
  // shouldComponentUpdate (nextProps, nextState) {
  //   console.log(!is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState)))
  //   return true
  // }
  render() {
    return (
@@ -186,4 +417,16 @@
  }
}
export default MainAction
const mapStateToProps = (state) => {
  return {
    tabviews: state.tabviews
  }
}
const mapDispatchToProps = (dispatch) => {
  return {
    modifyTabview: (tabviews) => dispatch(modifyTabview(tabviews))
  }
}
export default connect(mapStateToProps, mapDispatchToProps)(MainAction)