king
2020-01-07 ec3cc73f8deaf0b83b0b517e65f949a5a5c496dc
2020-01-07
15个文件已修改
6个文件已添加
867 ■■■■ 已修改文件
src/tabviews/commontable/index.jsx 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/index.scss 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/mainTable/index.jsx 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/tableshare/actionList/index.jsx 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/comtableconfig/index.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/comtableconfig/settingform/index.jsx 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/comtableconfig/tabdragelement/index.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/comtableconfig/tabdragelement/index.scss 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/modalconfig/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/subtableconfig/index.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/subtableconfig/settingform/index.jsx 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/subtableconfig/settingform/index.scss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycard/billcodeform/index.jsx 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycard/billcodeform/index.scss 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycard/customform/index.jsx 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycard/customform/index.scss 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycard/index.jsx 320 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycard/index.scss 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycard/uniqueform/index.jsx 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycard/uniqueform/index.scss 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/utils.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/index.jsx
@@ -138,7 +138,7 @@
      }
      let _actions = config.action.filter(item => item.position === 'toolbar') // 过滤工具栏按钮(未经过权限过滤)
      let _tab = config.tabs.filter(tab => tab.supMenu === 'mainTable')        // 检查是否有与主表关联的子表
      let _isLinkMain = false        // 检查是否有与主表关联的子表
      let supmenus = {}
      config.tabgroups.forEach(group => {
        if (config[group] && config[group].length > 0) {
@@ -150,6 +150,7 @@
            }
            if (config.setting.subtabs.includes(tab.uuid)) {
              tab.supMenu = 'mainTable'
              _isLinkMain = true
            } else if (supmenus[tab.uuid]) {
              tab.supMenu = supmenus[tab.uuid]
            }
@@ -166,7 +167,7 @@
        searchlist: config.search,
        actions: _actions,
        columns: _columns,
        isLinkMain: _tab.length > 0,
        isLinkMain: _isLinkMain,
        arr_field: _arrField.join(','),
        search: Utils.initMainSearch(config.search), // 搜索条件初始化(含有时间格式,需要转化)
        loading: true
@@ -292,6 +293,10 @@
    } else {
      param = this.getDefaultParam()
    }
    this.setState({
      pickup: false
    })
    this.handleTableId('mainTable', '')
@@ -661,7 +666,7 @@
    const { setting, searchlist, actions, columns, loadingview, viewlost, setsingle, pickup, isLinkMain, config } = this.state
    return (
      <div className="commontable" id={'commontable' + this.props.MenuID}>
      <div className={'commontable ' + (isLinkMain ? 'pick-control' : '')} id={'commontable' + this.props.MenuID}>
        {loadingview && <Spin size="large" />}
        {searchlist && searchlist.length > 0 ?
          <MainSearch
@@ -686,8 +691,12 @@
        }
        {columns && setting.onload !== 'false' ?
          <div className="main-table-box">
            {isLinkMain && setting.tableType === 'checkbox' ? <Switch title="单选切换" checkedChildren="多" unCheckedChildren="单" defaultChecked={setsingle} onChange={this.checkChange} /> : null}
            {isLinkMain && this.state.BIDs.mainTable && (setting.tableType === 'radio' || setsingle) ? <Switch title="收起" checkedChildren="关" unCheckedChildren="开" defaultChecked={pickup} onChange={this.pickupChange} /> : null}
            {isLinkMain ?
              <div className="pickchange">
                {setting.tableType === 'checkbox' ? <Switch title="单选切换" checkedChildren="多" unCheckedChildren="单" defaultChecked={setsingle} onChange={this.checkChange} /> : null}
                {this.state.BIDs.mainTable && (setting.tableType === 'radio' || setsingle) ? <Switch title="收起" checkedChildren="关" unCheckedChildren="开" defaultChecked={pickup} onChange={this.pickupChange} /> : null}
              </div> : null
            }
            <MainTable
              ref="mainTable"
              pickup={pickup}
src/tabviews/commontable/index.scss
@@ -56,6 +56,10 @@
  }
  .main-table-box {
    position: relative;
    .pickchange {
      position: absolute;
      right: 0px;
      top: -25px;
    .ant-switch {
      z-index: 1;
      float: right;
@@ -63,10 +67,16 @@
      margin-bottom: 5px;
    }
  }
  }
  .ant-tabs + .ant-tabs {
    margin-top: 20px;
  }
}
.commontable.pick-control {
  >.button-list {
    padding-right: 140px;
  }
}
.ant-back-top {
  bottom: 30px;
  right: 30px;
src/tabviews/commontable/mainTable/index.jsx
@@ -30,7 +30,7 @@
  }
  UNSAFE_componentWillMount () {
    const { columns } = this.props
    const { columns, setting } = this.props
    let _columns = []
    
    columns.forEach(item => {
@@ -47,7 +47,10 @@
      _columns.push(cell)
    })
    this.setState({columns: _columns})
    this.setState({
      columns: _columns,
      isSingleSelect: setting.tableType === 'radio'
    })
  }
  UNSAFE_componentWillReceiveProps(nextProps) {
@@ -316,6 +319,9 @@
    }
    let _data = this.props.data ? this.props.data : []
    console.log(selectId)
    console.log(pickup)
    console.log(isSingleSelect)
    if (selectId && pickup && isSingleSelect) {
      _data = _data.filter(item => item[setting.primaryKey] === selectId)
    }
src/tabviews/tableshare/actionList/index.jsx
@@ -164,7 +164,7 @@
          if (btn.innerFunc) {
            param.func = btn.innerFunc
          } else if (btn.sql) {
            param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting)) // 数据源
            param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, '', param[setting.primaryKey])) // 数据源
            param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
            param.secretkey = Utils.encrypt(param.LText, param.timestamp)
          }
@@ -181,11 +181,11 @@
              param[setting.primaryKey] = Utils.getguid()
            }
            param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, formdata)) // 数据源
            param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, formdata, param[setting.primaryKey])) // 数据源
            param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
            param.secretkey = Utils.encrypt(param.LText, param.timestamp)
          } else if (btn.sql) {
            param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, formdata)) // 数据源
            param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, formdata, param[setting.primaryKey])) // 数据源
            param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
            param.secretkey = Utils.encrypt(param.LText, param.timestamp)
          }
@@ -216,7 +216,7 @@
            if (btn.innerFunc) {
              param.func = btn.innerFunc
            } else if (btn.sql) {
              param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting)) // 数据源
              param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, '', param[setting.primaryKey])) // 数据源
              param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
              param.secretkey = Utils.encrypt(param.LText, param.timestamp)
            }
@@ -232,7 +232,7 @@
              if (setting.primaryKey) {
                param[setting.primaryKey] = cell[setting.primaryKey]
              }
              param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, formdata)) // 数据源
              param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, formdata, param[setting.primaryKey])) // 数据源
              param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
              param.secretkey = Utils.encrypt(param.LText, param.timestamp)
            }
src/templates/comtableconfig/index.jsx
@@ -2793,7 +2793,7 @@
                  }}
                > 
                  {this.state.tables.map((table, index) => (
                    <Option key={index} value={table.TbName}>{table.Remark}</Option>
                    <Option key={index} title={table.TbName} value={table.TbName}>{table.Remark}</Option>
                  ))}
                </Select>
                {this.state.selectedTables.length > 0 && <List
@@ -3069,7 +3069,7 @@
          onCancel={() => { this.setState({ profileVisible: false }) }}
          destroyOnClose
        >
          <VerifyCard card={this.state.card} wrappedComponentRef={(inst) => this.verifyRef = inst} dict={this.state.dict} />
          <VerifyCard card={this.state.card} columns={this.state.config.columns} wrappedComponentRef={(inst) => this.verifyRef = inst} dict={this.state.dict} />
        </Modal>
        {/* 设置全局配置及列表数据源 */}
        <Modal
src/templates/comtableconfig/settingform/index.jsx
@@ -80,11 +80,9 @@
  }
  selectChange = (val) => {
    let _order = this.props.form.getFieldValue('order')
    if (_order) return
    // let _order = this.props.form.getFieldValue('order')
    this.props.form.setFieldsValue({
      order: `${val} desc`,
      order: `${val} desc`
    })
  }
@@ -110,6 +108,9 @@
      if (field.length !== 1) {
        primaryKey = ''
      }
    }
    if (!primaryKey && columns.length === 0) {
      primaryKey = 'ID'
    }
    let str = '^(' + usefulFields.join('|') + ')'
@@ -238,7 +239,7 @@
          <Col span={12}>
            <Form.Item label="主键">
              {getFieldDecorator('primaryKey', {
                initialValue: primaryKey ? primaryKey : (columns.length === 0 ? 'ID' : '')
                initialValue: primaryKey
              })(
                <Select
                  getPopupContainer={() => document.getElementById('commontable-setting-form')}
@@ -258,7 +259,7 @@
          <Col span={12}>
            <Form.Item label="默认排序">
              {getFieldDecorator('order', {
                initialValue: data.order,
                initialValue: data.order || (primaryKey ? primaryKey + ' desc' : ''),
                rules: [
                  {
                    required: true,
src/templates/comtableconfig/tabdragelement/index.jsx
@@ -4,13 +4,9 @@
import { Tabs, Icon } from 'antd'
import Utils from '@/utils/utils.js'
import Card from './card'
import subtable from '@/assets/img/subtable.jpg'
import './index.scss'
const { TabPane } = Tabs
const photo = {
  SubTable: subtable
}
const Container = ({list, type, groupId, placeholder, handleList, handleMenu, deleteMenu }) => {
  let target = null
@@ -85,7 +81,7 @@
  }
  return (
    <div ref={drop} className="ant-row">
    <div ref={drop} className="ant-row maintable-tab-list">
      <Tabs defaultActiveKey="0">
        {cards.map((card, index) => (
          <TabPane tab={
@@ -103,7 +99,7 @@
              <Icon className="edit close" type="close" onClick={() => del(card)} />
            </div>
          } key={`${index}`}>
            <img src={photo[card.type]} alt=""/>
            《{card.label}》标签内容
          </TabPane>
        ))}
      </Tabs>
src/templates/comtableconfig/tabdragelement/index.scss
@@ -7,9 +7,15 @@
  cursor: move;
  border-radius: 4px;
}
.maintable-tab-list {
  .ant-tabs-content {
    text-align: center;
    color: #bcbcbc;
  }
.commontab-drawarea-placeholder {
  position: absolute;
  top: 25px;
  left: calc(50% - 50px);
  color: #bcbcbc;
}
}
src/templates/modalconfig/index.jsx
@@ -1088,7 +1088,7 @@
                  }}
                > 
                  {this.state.tables.map((table, index) => (
                    <Option key={index} value={table.TbName}>{table.Remark}</Option>
                    <Option key={index} title={table.TbName} value={table.TbName}>{table.Remark}</Option>
                  ))}
                </Select>
                {this.state.selectedTables.length > 0 && <List
src/templates/subtableconfig/index.jsx
@@ -2412,7 +2412,7 @@
                  }}
                > 
                  {this.state.tables.map((table, index) => (
                    <Option key={index} value={table.TbName}>{table.Remark}</Option>
                    <Option key={index} title={table.TbName} value={table.TbName}>{table.Remark}</Option>
                  ))}
                </Select>
                {this.state.selectedTables.length > 0 && <List
@@ -2629,7 +2629,7 @@
          onCancel={() => { this.setState({ profileVisible: false }) }}
          destroyOnClose
        >
          <VerifyCard card={this.state.card} wrappedComponentRef={(inst) => this.verifyRef = inst} dict={this.state.dict} />
          <VerifyCard card={this.state.card} columns={this.state.config.columns} wrappedComponentRef={(inst) => this.verifyRef = inst} dict={this.state.dict} />
        </Modal>
        {/* 设置全局配置及列表数据源 */}
        <Modal
src/templates/subtableconfig/settingform/index.jsx
@@ -49,6 +49,12 @@
    })
  }
  selectChange = (val) => {
    this.props.form.setFieldsValue({
      order: `${val} desc`
    })
  }
  render() {
    const { data, dict, tabId, usefulFields } = this.props
    const { getFieldDecorator } = this.props.form
@@ -72,12 +78,15 @@
        primaryKey = ''
      }
    }
    if (!primaryKey && columns.length === 0) {
      primaryKey = 'ID'
    }
    let str = '^(' + usefulFields.join('|') + ')'
    let _patten = new RegExp(str + '[0-9a-zA-Z_]*$', 'g')
    return (
      <Form {...formItemLayout} className="ant-advanced-search-form commontable-setting-form" id="commontable-setting-form">
      <Form {...formItemLayout} className="ant-advanced-search-form subtable-setting-form" id="subtable-setting-form">
        <Row gutter={24}>
          <Col span={12}>
            <Form.Item label="表名">
@@ -98,7 +107,7 @@
                initialValue: data.tableType
              })(
                <Select
                  getPopupContainer={() => document.getElementById('commontable-setting-form')}
                  getPopupContainer={() => document.getElementById('subtable-setting-form')}
                >
                  <Select.Option value="">不可选</Select.Option>
                  <Select.Option value="radio">单选</Select.Option>
@@ -175,10 +184,11 @@
          <Col span={12}>
            <Form.Item label="主键">
              {getFieldDecorator('primaryKey', {
                initialValue: primaryKey ? primaryKey : (columns.length === 0 ? 'ID' : '')
                initialValue: primaryKey
              })(
                <Select
                  getPopupContainer={() => document.getElementById('commontable-setting-form')}
                  getPopupContainer={() => document.getElementById('subtable-setting-form')}
                  onChange={this.selectChange}
                >
                  <Select.Option key='unset' value="">不设置</Select.Option>
                  {columns.length === 0 ?
@@ -194,7 +204,7 @@
          <Col span={12}>
            <Form.Item label="默认排序">
              {getFieldDecorator('order', {
                initialValue: data.order,
                initialValue: data.order || (primaryKey ? primaryKey + ' desc' : ''),
                rules: [
                  {
                    required: true,
src/templates/subtableconfig/settingform/index.scss
@@ -1,4 +1,4 @@
.ant-advanced-search-form.commontable-setting-form {
.ant-advanced-search-form.subtable-setting-form {
  .textarea {
    .ant-form-item-label {
      width: 16.3%;
src/templates/tableshare/verifycard/billcodeform/index.jsx
New file
@@ -0,0 +1,169 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { Form, Row, Col, Input, Select, Button, InputNumber } from 'antd'
import './index.scss'
class UniqueForm extends Component {
  static propTpyes = {
    dict: PropTypes.object,  // 字典项
    billCode: PropTypes.object,  // 表单
    billCodeChange: PropTypes.func  // 表单
  }
  handleConfirm = () => {
    // 表单提交时检查输入值是否正确
    this.props.form.validateFieldsAndScroll((err, values) => {
      if (!err) {
        values.uuid = this.state.editItem ? this.state.editItem.uuid : ''
        values.field = values.field.join(',')
        this.props.uniqueChange(values)
        this.setState({
          editItem: null
        })
      }
    })
  }
  render() {
    const { getFieldDecorator } = this.props.form
    const { billCode } = this.props
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 8 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 }
      }
    }
    return (
      <Form {...formItemLayout} className="custom-verify-form">
        <Row gutter={24}>
          <Col span={6}>
            <Form.Item label={'字段'}>
              {getFieldDecorator('field', {
                initialValue: billCode.ModularDetailCode || '',
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.input'] + '凭证标识!'
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
            </Form.Item>
          </Col>
          <Col span={6}>
            <Form.Item label={'单号类型'}>
              {getFieldDecorator('TypeCharOne', {
                initialValue: billCode.TypeCharOne || 'Y',
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.select'] + '单号类型!'
                  }
                ]
              })(
                <Select>
                  <Select.Option value="Y"> 单号 </Select.Option>
                  <Select.Option value="n"> 编码 </Select.Option>
                  <Select.Option value="Lp"> 行号 </Select.Option>
                  <Select.Option value="BN"> 批次 </Select.Option>
                </Select>
              )}
            </Form.Item>
          </Col>
          <Col span={6}>
            <Form.Item label={'凭证标识'}>
              {getFieldDecorator('ModularDetailCode', {
                initialValue: billCode.ModularDetailCode || '',
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.input'] + '凭证标识!'
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
            </Form.Item>
          </Col>
          <Col span={6}>
            <Form.Item label={'流水码位数'}>
              {getFieldDecorator('Type', {
                initialValue: billCode.Type || 4,
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.input'] + '流水码位数!'
                  }
                ]
              })(<InputNumber defaultValue={4} min={1} max={10} precision={0} />)}
            </Form.Item>
          </Col>
          <Col span={6}>
            <Form.Item label={'类型'}>
              {getFieldDecorator('TypeCharTwo', {
                initialValue: billCode.TypeCharTwo || 'BillCode',
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.select'] + '类型!'
                  }
                ]
              })(
                <Select>
                  <Select.Option value="BillCode"> 业务 </Select.Option>
                  <Select.Option value="TableCode"> 主数据 </Select.Option>
                </Select>
              )}
            </Form.Item>
          </Col>
          <Col span={6}>
            <Form.Item label={'报错信息'}>
              {getFieldDecorator('errmsg', {
                initialValue: '',
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.input'] + '报错信息!'
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
            </Form.Item>
          </Col>
          <Col span={6}>
            <Form.Item label={'报错编码'}>
              {getFieldDecorator('errorCode', {
                initialValue: 'E',
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.select'] + '报错编码!'
                  }
                ]
              })(
                <Select>
                  <Select.Option value="E"> E </Select.Option>
                  <Select.Option value="N"> N </Select.Option>
                  <Select.Option value="F"> F </Select.Option>
                  <Select.Option value="NM"> NM </Select.Option>
                  <Select.Option value="S"> S </Select.Option>
                  <Select.Option value="-1"> -1 </Select.Option>
                </Select>
              )}
            </Form.Item>
          </Col>
          <Col span={2}>
            <Button onClick={this.handleConfirm} type="primary" className="add-row">
              确定
            </Button>
          </Col>
        </Row>
      </Form>
    )
  }
}
export default Form.create()(UniqueForm)
src/templates/tableshare/verifycard/billcodeform/index.scss
src/templates/tableshare/verifycard/customform/index.jsx
New file
@@ -0,0 +1,127 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { Form, Row, Col, Input, Select, Button } from 'antd'
import './index.scss'
const { TextArea } = Input
class CustomForm extends Component {
  static propTpyes = {
    dict: PropTypes.object,  // 字典项
    fields: PropTypes.array,  // 表单
    customChange: PropTypes.func  // 表单
  }
  state = {
    editItem: null
  }
  edit = (record) => {
    this.setState({
      editItem: record
    })
    this.props.form.setFieldsValue({
      sql: record.sql,
      errmsg: record.errmsg,
      errorCode: record.errorCode
    })
  }
  handleConfirm = () => {
    // 表单提交时检查输入值是否正确
    this.props.form.validateFieldsAndScroll((err, values) => {
      if (!err) {
        values.uuid = this.state.editItem ? this.state.editItem.uuid : ''
        this.props.customChange(values)
        this.setState({
          editItem: null
        })
        this.props.form.setFieldsValue({
          sql: '',
          errmsg: '',
          errorCode: 'E'
        })
      }
    })
  }
  render() {
    const { getFieldDecorator } = this.props.form
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 8 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 }
      }
    }
    return (
      <Form {...formItemLayout} className="custom-verify-form" id="verifycard2">
        <Row gutter={24}>
          <Col span={10} className="sql">
            <Form.Item label={'sql'}>
              {getFieldDecorator('sql', {
                initialValue: '',
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.input'] + 'sql!'
                  }
                ]
              })(<TextArea rows={3} />)}
            </Form.Item>
          </Col>
          <Col span={6}>
            <Form.Item label={'报错信息'}>
              {getFieldDecorator('errmsg', {
                initialValue: '',
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.input'] + '报错信息!'
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
            </Form.Item>
          </Col>
          <Col span={6}>
            <Form.Item label={'报错编码'}>
              {getFieldDecorator('errorCode', {
                initialValue: 'E',
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.select'] + '报错编码!'
                  }
                ]
              })(
                <Select
                  getPopupContainer={() => document.getElementById('verifycard2')}
                >
                  <Select.Option value="E"> E </Select.Option>
                  <Select.Option value="N"> N </Select.Option>
                  <Select.Option value="F"> F </Select.Option>
                  <Select.Option value="NM"> NM </Select.Option>
                  <Select.Option value="S"> S </Select.Option>
                  <Select.Option value="-1"> -1 </Select.Option>
                </Select>
              )}
            </Form.Item>
          </Col>
          <Col span={2} className="add">
            <Button onClick={this.handleConfirm} type="primary" className="add-row">
              确定
            </Button>
          </Col>
        </Row>
      </Form>
    )
  }
}
export default Form.create()(CustomForm)
src/templates/tableshare/verifycard/customform/index.scss
src/templates/tableshare/verifycard/index.jsx
@@ -1,20 +1,25 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { Form, Tabs, Row, Col, Radio, Input, Button, Select, Table, Popconfirm, Icon, notification, Modal, message, InputNumber } from 'antd'
import { Form, Tabs, Row, Col, Radio, Button, Table, Popconfirm, Icon, notification, Modal, message, InputNumber } from 'antd'
import Utils from '@/utils/utils.js'
import UniqueForm from './uniqueform'
import CustomForm from './customform'
import BillcodeForm from './billcodeform'
import Api from '@/api'
import './index.scss'
const { TabPane } = Tabs
const { TextArea } = Input
class VerifyCard extends Component {
  static propTpyes = {
    dict: PropTypes.object, // 字典项
    card: PropTypes.object
    card: PropTypes.object,
    columns: PropTypes.array
  }
  state = {
    verify: {}
    verify: {},
    fields: []
  }
  UNSAFE_componentWillMount() {
@@ -23,25 +28,95 @@
    this.setState({
      verify: {
        invalid: _verify.invalid || 'false',
        unique: _verify.unique || 'false',
        uniques: _verify.uniques || [],
        accountdate: _verify.accountdate || 'false',
        customverifys: _verify.customverifys || []
        customverifys: _verify.customverifys || [],
        billCode: _verify.billCode || {}
      }
    })
    if (this.props.card.OpenType === 'pop') {
      Api.getSystemConfig({
        func: 'sPC_Get_LongParam',
        MenuID: this.props.card.uuid
      }).then(res => {
        if (res.status) {
          let _LongParam = ''
          if (res.LongParam) {
            _LongParam = window.decodeURIComponent(window.atob(res.LongParam))
            try {
              _LongParam = JSON.parse(_LongParam)
            } catch (e) {
              _LongParam = ''
            }
          }
          if (!_LongParam) return
          let _fields = []
          if (_LongParam.groups.length > 0) {
            _LongParam.groups.forEach(group => {
              group.sublist.forEach(field => {
                _fields.push(field)
              })
            })
          } else {
            _fields = _LongParam.fields
          }
          this.setState({
            fields: _fields
          })
        } else {
          notification.warning({
            top: 92,
            message: res.message,
            duration: 10
          })
      }
    })
  }
  }
  handleConfirm = () => {
  uniqueChange = (values) => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    // 表单提交时检查输入值是否正确
    this.props.form.validateFieldsAndScroll((err, values) => {
      if (!err) {
    if (values.uuid) {
      verify.uniques = verify.uniques.map(item => {
        if (item.uuid === values.uuid) {
          return values
        } else {
          return item
        }
      })
    } else {
        values.uuid = Utils.getuuid()
        verify.customverifys.push(values)
      verify.uniques.push(values)
    }
        this.setState({
          verify: verify
        })
      }
  customChange = (values) => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    if (values.uuid) {
      verify.customverifys = verify.customverifys.map(item => {
        if (item.uuid === values.uuid) {
          return values
        } else {
          return item
        }
      })
    } else {
      values.uuid = Utils.getuuid()
      verify.customverifys.push(values)
    }
    this.setState({
      verify: verify
    })
  }
@@ -54,11 +129,73 @@
    })
  }
  handleDelete = (uuid) => {
  handleDelete = (record, type) => {
    const { verify } = this.state
    verify.customverifys = verify.customverifys.filter(item => item.uuid !== uuid)
    if (type === 'customverify') {
      verify.customverifys = verify.customverifys.filter(item => item.uuid !== record.uuid)
    } else if (type === 'unique') {
      verify.uniques = verify.uniques.filter(item => item.uuid !== record.uuid)
    }
    this.setState({ verify: verify })
  }
  handleEdit = (record, type) => {
    if (type === 'customverify') {
      this.customForm.edit(record)
    } else if (type === 'unique') {
      this.uniqueForm.edit(record)
    }
  }
  handleUpDown = (record, type, direction) => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    let index = 0
    if (type === 'customverify') {
      verify.customverifys = verify.customverifys.filter((item, i) => {
        if (item.uuid === record.uuid) {
          index = i
        }
        return item.uuid !== record.uuid
      })
      if ((index === 0 && direction === 'up') || (index === verify.customverifys.length && direction === 'down')) {
        return
      }
      if (direction === 'up') {
        verify.customverifys.splice(index - 1, 0, record)
      } else {
        verify.customverifys.splice(index + 1, 0, record)
      }
      this.setState({
        verify: verify
      })
    } else if (type === 'unique') {
      verify.uniques = verify.uniques.filter((item, i) => {
        if (item.uuid === record.uuid) {
          index = i
        }
        return item.uuid !== record.uuid
      })
      if ((index === 0 && direction === 'up') || (index === verify.uniques.length && direction === 'down')) {
        return
      }
      if (direction === 'up') {
        verify.uniques.splice(index - 1, 0, record)
      } else {
        verify.uniques.splice(index + 1, 0, record)
      }
      this.setState({
        verify: verify
      })
    }
  }
  showError = (errorType) => {
@@ -92,16 +229,15 @@
  timeChange = (val, type) => {
    const { verify } = this.state
    console.log(val)
    console.log(type)
    this.setState({
      verify: {...verify, [type]: val}
    })
  }
  render() {
    const { getFieldDecorator } = this.props.form
    const { verify } = this.state
    // const { getFieldDecorator } = this.props.form
    const { verify, fields } = this.state
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
@@ -112,6 +248,39 @@
        sm: { span: 16 }
      }
    }
    let uniqueColumns = [
      {
        title: '字段名',
        dataIndex: 'field',
        width: '50%'
      },
      {
        title: 'ErrorMessage',
        dataIndex: 'errmsg',
        width: '25%'
      },
      {
        title: 'ErrorCode',
        dataIndex: 'errorCode',
        width: '10%'
      },
      {
        title: '操作',
        align: 'center',
        width: '15%',
        dataIndex: 'operation',
        render: (text, record) =>
          (<div>
            <span className="operation-btn" onClick={() => this.handleEdit(record, 'unique')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <Popconfirm title="确定删除吗?" onConfirm={() => this.handleDelete(record, 'unique')}>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
            </Popconfirm>
            <span className="operation-btn" onClick={() => this.handleUpDown(record, 'unique', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" onClick={() => this.handleUpDown(record, 'unique', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
          </div>)
      }
    ]
    let columns = [
      {
        title: 'SQL',
@@ -134,11 +303,14 @@
        width: '15%',
        dataIndex: 'operation',
        render: (text, record) =>
          (
            <Popconfirm title="确定删除吗?" onConfirm={() => this.handleDelete(record.uuid)}>
              <span style={{color: '#1890ff', cursor: 'pointer'}}><Icon type="delete" /></span>
          (<div>
            <span className="operation-btn" onClick={() => this.handleEdit(record, 'customverify')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <Popconfirm title="确定删除吗?" onConfirm={() => this.handleDelete(record, 'customverify')}>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
            </Popconfirm>
          )
            <span className="operation-btn" onClick={() => this.handleUpDown(record, 'customverify', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" onClick={() => this.handleUpDown(record, 'customverify', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
          </div>)
      }
    ]
@@ -148,24 +320,16 @@
          <Form {...formItemLayout}>
            <Row gutter={24}>
              <Col span={12}>
                <Form.Item label={'失效验证'}>
                  <Radio.Group value={verify.invalid} onChange={(e) => {this.onOptionChange(e, 'invalid')}}>
                    <Radio value="true">开启</Radio>
                    <Radio value="false">不开启</Radio>
                  </Radio.Group>
                </Form.Item>
              </Col>
              <Col span={12}>
                <Form.Item label={'唯一性验证'}>
                  <Radio.Group value={verify.unique} onChange={(e) => {this.onOptionChange(e, 'unique')}}>
                    <Radio value="true">开启</Radio>
                    <Radio value="false">不开启</Radio>
                  </Radio.Group>
                </Form.Item>
              </Col>
              <Col span={12}>
                <Form.Item label={'账期验证'}>
                  <Radio.Group value={verify.accountdate} onChange={(e) => {this.onOptionChange(e, 'accountdate')}}>
                    <Radio value="true">开启</Radio>
                    <Radio value="false">不开启</Radio>
                  </Radio.Group>
                </Form.Item>
              </Col>
              <Col span={12}>
                <Form.Item label={'失效验证'}>
                  <Radio.Group value={verify.invalid} onChange={(e) => {this.onOptionChange(e, 'invalid')}}>
                    <Radio value="true">开启</Radio>
                    <Radio value="false">不开启</Radio>
                  </Radio.Group>
@@ -174,61 +338,28 @@
            </Row>
          </Form>
        </TabPane>
        <TabPane tab="自定义验证" key="2">
          <Form {...formItemLayout} className="custom-verify-form" id="verifycard1">
            <Row gutter={24}>
              <Col span={10} className="sql">
                <Form.Item label={'sql'}>
                  {getFieldDecorator('sql', {
                    initialValue: '',
                    rules: [
                      {
                        required: true,
                        message: this.props.dict['form.required.input'] + 'sql!'
                      }
                    ]
                  })(<TextArea rows={3} />)}
                </Form.Item>
              </Col>
              <Col span={6}>
                <Form.Item label={'报错信息'}>
                  {getFieldDecorator('errmsg', {
                    initialValue: '',
                    rules: [
                      {
                        required: true,
                        message: this.props.dict['form.required.input'] + '报错信息!'
                      }
                    ]
                  })(<Input placeholder="" autoComplete="off" />)}
                </Form.Item>
              </Col>
              <Col span={6}>
                <Form.Item label={'报错编码'}>
                  {getFieldDecorator('errorCode', {
                    initialValue: 'E',
                    rules: [
                      {
                        required: true,
                        message: this.props.dict['form.required.select'] + '报错编码!'
                      }
                    ]
                  })(
                    <Select
                      getPopupContainer={() => document.getElementById('verifycard1')}
                    >
                      <Select.Option value="E"> E </Select.Option>
                    </Select>
                  )}
                </Form.Item>
              </Col>
              <Col span={2} className="add">
                <Button onClick={this.handleConfirm} type="primary" className="add-row">
                  添加
                </Button>
              </Col>
            </Row>
          </Form>
        <TabPane tab="唯一性验证" key="2">
          <UniqueForm
            fields={fields}
            dict={this.props.dict}
            uniqueChange={this.uniqueChange}
            wrappedComponentRef={(inst) => this.uniqueForm = inst}
          />
          <Table
            bordered
            rowKey="uuid"
            className="custom-table"
            dataSource={verify.uniques}
            columns={uniqueColumns}
            pagination={false}
          />
        </TabPane>
        <TabPane tab="自定义验证" key="3">
          <CustomForm
            dict={this.props.dict}
            customChange={this.customChange}
            wrappedComponentRef={(inst) => this.customForm = inst}
          />
          <Table
            bordered
            rowKey="uuid"
@@ -238,7 +369,10 @@
            pagination={false}
          />
        </TabPane>
        <TabPane tab="信息提示" key="3">
        <TabPane tab="单号生成" key="4">
          {verify.billCode ? <BillcodeForm dict={this.props.dict} billCode={verify.billCode} /> : null}
        </TabPane>
        <TabPane tab="信息提示" key="5">
          <Form {...formItemLayout}>
            <Row gutter={24}>
              <Col offset={6} span={6}>
src/templates/tableshare/verifycard/index.scss
@@ -26,4 +26,10 @@
    display: inline-block;
    width: 30px;
  }
  .operation-btn {
    display: inline-block;
    font-size: 16px;
    padding: 0 5px;
    cursor: pointer;
  }
}
src/templates/tableshare/verifycard/uniqueform/index.jsx
New file
@@ -0,0 +1,133 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { Form, Row, Col, Input, Select, Button } from 'antd'
import './index.scss'
class UniqueForm extends Component {
  static propTpyes = {
    dict: PropTypes.object,  // 字典项
    fields: PropTypes.array,  // 表单
    uniqueChange: PropTypes.func  // 表单
  }
  state = {
    editItem: null
  }
  edit = (record) => {
    this.setState({
      editItem: record
    })
    this.props.form.setFieldsValue({
      field: record.field.split(','),
      errmsg: record.errmsg,
      errorCode: record.errorCode
    })
  }
  handleConfirm = () => {
    // 表单提交时检查输入值是否正确
    this.props.form.validateFieldsAndScroll((err, values) => {
      if (!err) {
        values.uuid = this.state.editItem ? this.state.editItem.uuid : ''
        values.field = values.field.join(',')
        this.props.uniqueChange(values)
        this.setState({
          editItem: null
        })
        this.props.form.setFieldsValue({
          field: [],
          errmsg: '',
          errorCode: 'E'
        })
      }
    })
  }
  render() {
    const { getFieldDecorator } = this.props.form
    const { fields } = this.props
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 8 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 }
      }
    }
    return (
      <Form {...formItemLayout} className="custom-verify-form" id="verifycard1">
        <Row gutter={24}>
          <Col span={10}>
            <Form.Item label={'字段名'}>
              {getFieldDecorator('field', {
                initialValue: [],
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.select'] + '字段名!'
                  }
                ]
              })(
                <Select
                  mode="multiple"
                >
                  {fields.map(item => (
                    <Select.Option key={item.uuid} value={item.field}>{item.field}</Select.Option>
                  ))}
                </Select>
              )}
            </Form.Item>
          </Col>
          <Col span={6}>
            <Form.Item label={'报错信息'}>
              {getFieldDecorator('errmsg', {
                initialValue: '',
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.input'] + '报错信息!'
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
            </Form.Item>
          </Col>
          <Col span={6}>
            <Form.Item label={'报错编码'}>
              {getFieldDecorator('errorCode', {
                initialValue: 'E',
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.select'] + '报错编码!'
                  }
                ]
              })(
                <Select>
                  <Select.Option value="E"> E </Select.Option>
                  <Select.Option value="N"> N </Select.Option>
                  <Select.Option value="F"> F </Select.Option>
                  <Select.Option value="NM"> NM </Select.Option>
                  <Select.Option value="S"> S </Select.Option>
                  <Select.Option value="-1"> -1 </Select.Option>
                </Select>
              )}
            </Form.Item>
          </Col>
          <Col span={2} className="add">
            <Button onClick={this.handleConfirm} type="primary" className="add-row">
              确定
            </Button>
          </Col>
        </Row>
      </Form>
    )
  }
}
export default Form.create()(UniqueForm)
src/templates/tableshare/verifycard/uniqueform/index.scss
src/utils/utils.js
@@ -448,9 +448,11 @@
   * @return {String} type   执行类型
   * @return {String} table  表名
   */
  static getSysDefaultSql (btn, setting, formdata) {
  static getSysDefaultSql (btn, setting, formdata, primaryId) {
    let primaryKey = setting.primaryKey || 'id'
    let _sql = ''
    console.log(primaryId)
    if (btn.OpenType === 'pop' && btn.sqlType === 'insert') {
      let keys = []
      let values = []