king
2020-02-05 74f42024805abe7850dbeeb03dae48a0d9ef0b79
2020-02-05
11个文件已修改
380 ■■■■ 已修改文件
src/locales/en-US/comtable.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/locales/zh-CN/comtable.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/index.jsx 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/formtab/index.jsx 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtable/index.jsx 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtabtable/index.jsx 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/tableshare/actionList/index.jsx 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/tableshare/mutilform/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycard/index.jsx 195 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/ushare/modalform/index.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/utils.js 102 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/locales/en-US/comtable.js
@@ -185,6 +185,12 @@
  'header.form.database.local': '本地',
  'header.form.database.sso': '系统',
  'header.form.linkMain': '关联主表',
  'header.form.query.delete': '确定删除吗?',
  'header.form.up': '上移',
  'header.form.down': '下移',
  'header.form.status.change': '状态切换',
  'header.form.status.forbidden': '禁用',
  'header.form.status.open': '启用',
  'header.modal.form.edit': '表单-编辑',
  'header.modal.search.edit': '搜索条件-编辑',
  'header.modal.action.edit': '按钮-编辑',
src/locales/zh-CN/comtable.js
@@ -185,6 +185,12 @@
  'header.form.database.local': '本地',
  'header.form.database.sso': '系统',
  'header.form.linkMain': '关联主表',
  'header.form.query.delete': '确定删除吗?',
  'header.form.up': '上移',
  'header.form.down': '下移',
  'header.form.status.change': '状态切换',
  'header.form.status.forbidden': '禁用',
  'header.form.status.open': '启用',
  'header.modal.form.edit': '表单-编辑',
  'header.modal.search.edit': '搜索条件-编辑',
  'header.modal.action.edit': '按钮-编辑',
src/tabviews/commontable/index.jsx
@@ -36,6 +36,7 @@
    searchlist: null,     // 搜索条件
    actions: null,        // 按钮集
    columns: null,        // 显示列
    logcolumns: null,     // 日志中显示的列信息
    arr_field: '',        // 使用 sPC_Get_TableData 时的查询字段集
    setting: null,        // 页面全局设置:数据源、按钮及显示列固定、主键等
    data: null,           // 列表数据集
@@ -98,8 +99,9 @@
      let _arrField = []     // 字段集
      let _columns = []      // 显示列
      let _logcolumns = []   // 日志显示列
      let _hideCol = []      // 隐藏及合并列中字段的uuid集
      let colMap = new Map()
      let colMap = new Map() // 用于字段过滤
      // 权限过滤
      config.action = config.action.filter(item => permAction[item.uuid])
@@ -108,10 +110,16 @@
      //   config[group] = config[group].filter(tab => permAction[tab.uuid])
      // })
      // 1、筛选字段集,2、过滤隐藏列及合并列中的字段uuid
      config.columns.forEach(col => {
        if (col.field) {
          _arrField.push(col.field)
          // 筛选出日志中的显示列,取前四个
          if (col.Hide !== 'true' && _logcolumns.length < 4) {
            _logcolumns.push(col)
          }
        }
        if (col.type === 'colspan' && col.sublist) { // 筛选隐藏列
          _hideCol = _hideCol.concat(col.sublist)
@@ -180,6 +188,7 @@
        searchlist: config.search,
        actions: _actions,
        columns: _columns,
        logcolumns: _logcolumns,
        isLinkMain: _isLinkMain,
        arr_field: _arrField.join(','),
        search: Utils.initMainSearch(config.search) // 搜索条件初始化(含有时间格式,需要转化)
@@ -770,6 +779,7 @@
            type="main"
            setting={setting}
            actions={actions}
            logcolumns={this.state.logcolumns}
            dict={this.state.dict}
            MenuID={this.props.MenuID}
            refreshdata={this.refreshbyaction}
src/tabviews/formtab/index.jsx
@@ -594,6 +594,7 @@
            actions={actions}
            dict={this.state.dict}
            MenuID={this.props.MenuID}
            logcolumns={[]}
            refreshdata={this.refreshbyaction}
            triggerPopview={this.triggerPopview}
            gettableselected={this.gettableselected}
src/tabviews/subtable/index.jsx
@@ -37,6 +37,7 @@
    searchlist: null,     // 搜索条件
    actions: null,        // 按钮集
    columns: null,        // 显示列
    logcolumns: null,     // 日志中显示的列信息
    arr_field: '',        // 使用 sPC_Get_TableData 时的查询字段集
    setting: null,        // 页面全局设置:数据源、按钮及显示列固定、主键等
    data: null,           // 列表数据集
@@ -104,6 +105,7 @@
      let _arrField = []     // 字段集
      let _columns = []      // 显示列
      let _logcolumns = []   // 日志显示列
      let _hideCol = []      // 隐藏及合并列中字段的uuid集
      let colMap = new Map()
@@ -114,6 +116,11 @@
      config.columns.forEach(col => {
        if (col.field) {
          _arrField.push(col.field)
          // 筛选出日志中的显示列,取前四个
          if (col.Hide !== 'true' && _logcolumns.length < 4) {
            _logcolumns.push(col)
          }
        }
        if (col.type === 'colspan' && col.sublist) { // 筛选隐藏列
          _hideCol = _hideCol.concat(col.sublist)
@@ -159,6 +166,7 @@
        searchlist: config.search,
        actions: _actions,
        columns: _columns,
        logcolumns: _logcolumns,
        arr_field: _arrField.join(','),
        search: Utils.initMainSearch(config.search) // 搜索条件初始化(含有时间格式,需要转化)
      }, () => {
@@ -647,6 +655,7 @@
            BData={this.props.BData}
            dict={this.state.dict}
            MenuID={this.props.SupMenuID}
            logcolumns={this.state.logcolumns}
            refreshdata={this.refreshbyaction}
            triggerPopview={this.triggerPopview}
            gettableselected={this.gettableselected}
src/tabviews/subtabtable/index.jsx
@@ -32,6 +32,7 @@
    searchlist: null,     // 搜索条件
    actions: null,        // 按钮集
    columns: null,        // 显示列
    logcolumns: null,     // 日志中显示的列信息
    arr_field: '',        // 使用 sPC_Get_TableData 时的查询字段集
    setting: null,        // 页面全局设置:数据源、按钮及显示列固定、主键等
    data: null,           // 列表数据集
@@ -87,6 +88,7 @@
      let _arrField = []     // 字段集
      let _columns = []      // 显示列
      let _logcolumns = []   // 日志显示列
      let _hideCol = []      // 隐藏及合并列中字段的uuid集
      let colMap = new Map()
@@ -97,6 +99,11 @@
      config.columns.forEach(col => {
        if (col.field) {
          _arrField.push(col.field)
          // 筛选出日志中的显示列,取前四个
          if (col.Hide !== 'true' && _logcolumns.length < 4) {
            _logcolumns.push(col)
          }
        }
        if (col.type === 'colspan' && col.sublist) { // 筛选隐藏列
          _hideCol = _hideCol.concat(col.sublist)
@@ -142,6 +149,7 @@
        searchlist: config.search,
        actions: _actions,
        columns: _columns,
        logcolumns: _logcolumns,
        arr_field: _arrField.join(','),
        search: Utils.initMainSearch(config.search), // 搜索条件初始化(含有时间格式,需要转化)
        loading: true
@@ -601,6 +609,7 @@
            data={this.state.data}
            total={this.state.total}
            loading={this.state.loading}
            logcolumns={this.state.logcolumns}
            refreshdata={this.refreshbytable}
            buttonTrigger={this.buttonTrigger}
            handleTableId={this.handleTableId}
src/tabviews/tableshare/actionList/index.jsx
@@ -11,15 +11,16 @@
class MainAction extends Component {
  static propTpyes = {
    BID: PropTypes.string,
    BData: PropTypes.any,
    Tab: PropTypes.any,
    type: PropTypes.string,
    MenuID: PropTypes.string,
    actions: PropTypes.array, // 搜索条件列表
    dict: PropTypes.object, // 字典项
    setting: PropTypes.any,
    triggerPopview: PropTypes.func
    BID: PropTypes.string,         // 主表ID
    BData: PropTypes.any,          // 主表数据
    Tab: PropTypes.any,            // 如果当前元素为标签时,tab为标签信息
    type: PropTypes.string,        // 判断当前为主表(main)、子表(sub)、子表标签(subtab)
    MenuID: PropTypes.string,      // 菜单ID
    actions: PropTypes.array,      // 按钮组
    logcolumns: PropTypes.array,   // 日志中显示列
    dict: PropTypes.object,        // 字典项
    setting: PropTypes.any,        // 页面通用设置
    triggerPopview: PropTypes.func // 弹窗标签页触发
  }
  state = {
@@ -143,7 +144,7 @@
   * @description 按钮提交执行
   */
  execSubmit = (btn, data, _resolve, formdata) => {
    const { setting } = this.props
    const { setting, logcolumns } = this.props
    if (btn.intertype === 'inner') {
      // 使用内部接口时,内部函数和数据源不可同时为空, 使用系统函数时,类型不可为空
@@ -196,7 +197,7 @@
            }
          } else if (btn.sql) {
            param.ID = primaryId
            param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, '', param, data[0])) // 数据源
            param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, '', param, data[0], logcolumns)) // 数据源
            param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
            param.secretkey = Utils.encrypt(param.LText, param.timestamp)
          }
@@ -214,12 +215,12 @@
          } else if (btn.sql && btn.sqlType === 'insert') { // 系统函数添加时,生成uuid
            param.ID = Utils.getguid()
            param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, formdata, param, data[0])) // 数据源
            param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, formdata, param, data[0], logcolumns)) // 数据源
            param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
            param.secretkey = Utils.encrypt(param.LText, param.timestamp)
          } else if (btn.sql) {
            param.ID = primaryId
            param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, formdata, param, data[0])) // 数据源
            param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, formdata, param, data[0], logcolumns)) // 数据源
            param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
            param.secretkey = Utils.encrypt(param.LText, param.timestamp)
          }
@@ -251,7 +252,7 @@
              }
            } else if (btn.sql) {
              param.ID = primaryId
              param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, '', param, cell)) // 数据源
              param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, '', param, cell, logcolumns)) // 数据源
              param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
              param.secretkey = Utils.encrypt(param.LText, param.timestamp)
            }
@@ -269,7 +270,7 @@
            } else if (btn.sql) {
              param.ID = primaryId
              param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, formdata, param, cell)) // 数据源
              param.LText = Utils.formatOptions(Utils.getSysDefaultSql(btn, setting, formdata, param, cell, logcolumns)) // 数据源
              param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
              param.secretkey = Utils.encrypt(param.LText, param.timestamp)
            }
src/tabviews/tableshare/mutilform/index.jsx
@@ -258,7 +258,7 @@
                initialValue: _initval,
                rules: [
                  {
                    required: item.required === 'true',
                    required: true,
                    message: this.props.dict['form.required.input'] + item.label + '!'
                  }
                ]
src/templates/tableshare/verifycard/index.jsx
@@ -34,12 +34,30 @@
      {
        title: '字段名',
        dataIndex: 'field',
        width: '55%'
        width: '45%'
      },
      {
        title: '报错编码',
        dataIndex: 'errorCode',
        width: '20%'
        width: '15%'
      },
      {
        title: '状态',
        dataIndex: 'status',
        width: '15%',
        render: (text, record) => record.status === 'false' ?
          (
            <div>
              {this.props.dict['header.form.status.forbidden']}
              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
            </div>
          ) :
          (
            <div>
              {this.props.dict['header.form.status.open']}
              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
            </div>
          )
      },
      {
        title: '操作',
@@ -48,12 +66,18 @@
        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" title={this.props.dict['header.edit']} onClick={() => this.handleEdit(record, 'unique')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <Popconfirm
              title={this.props.dict['header.form.query.delete']}
              okText={this.props.dict['header.confirm']}
              cancelText={this.props.dict['header.cancel']}
              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>
            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'unique', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'unique', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'unique')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
          </div>)
      }
    ],
@@ -61,22 +85,40 @@
      {
        title: 'SQL',
        dataIndex: 'sql',
        width: '50%'
        width: '45%'
      },
      {
        title: '结果处理',
        dataIndex: 'resultName',
        width: '10%'
        width: '9%'
      },
      {
        title: '提示信息',
        dataIndex: 'errmsg',
        width: '15%'
        width: '13%'
      },
      {
        title: '报错编码',
        dataIndex: 'errorCode',
        width: '10%'
        width: '9%'
      },
      {
        title: '状态',
        dataIndex: 'status',
        width: '9%',
        render: (text, record) => record.status === 'false' ?
          (
            <div>
              {this.props.dict['header.form.status.forbidden']}
              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
            </div>
          ) :
          (
            <div>
              {this.props.dict['header.form.status.open']}
              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
            </div>
          )
      },
      {
        title: '操作',
@@ -85,12 +127,18 @@
        dataIndex: 'operation',
        render: (text, record) =>
          (<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" title={this.props.dict['header.edit']} onClick={() => this.handleEdit(record, 'customverify')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <Popconfirm
              title={this.props.dict['header.form.query.delete']}
              okText={this.props.dict['header.confirm']}
              cancelText={this.props.dict['header.cancel']}
              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>
            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'customverify', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'customverify', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'customverify')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
          </div>)
      }
    ],
@@ -98,7 +146,25 @@
      {
        title: 'SQL',
        dataIndex: 'sql',
        width: '80%'
        width: '70%'
      },
      {
        title: '状态',
        dataIndex: 'status',
        width: '10%',
        render: (text, record) => record.status === 'false' ?
          (
            <div>
              {this.props.dict['header.form.status.forbidden']}
              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
            </div>
          ) :
          (
            <div>
              {this.props.dict['header.form.status.open']}
              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
            </div>
          )
      },
      {
        title: '操作',
@@ -107,12 +173,18 @@
        dataIndex: 'operation',
        render: (text, record) =>
          (<div>
            <span className="operation-btn" onClick={() => this.handleEdit(record, 'scripts')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <Popconfirm title="确定删除吗?" onConfirm={() => this.handleDelete(record, 'scripts')}>
            <span className="operation-btn" title={this.props.dict['header.edit']} onClick={() => this.handleEdit(record, 'scripts')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <Popconfirm
              title={this.props.dict['header.form.query.delete']}
              okText={this.props.dict['header.confirm']}
              cancelText={this.props.dict['header.cancel']}
              onConfirm={() => this.handleDelete(record, 'scripts')
            }>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
            </Popconfirm>
            <span className="operation-btn" onClick={() => this.handleUpDown(record, 'scripts', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" onClick={() => this.handleUpDown(record, 'scripts', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'scripts', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'scripts', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'scripts')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
          </div>)
      }
    ],
@@ -120,28 +192,28 @@
      {
        title: '函数变量',
        dataIndex: 'fieldName',
        width: '15%',
        width: '13%',
        render: (text, record) => (`${record.fieldName || ''}(${record.field})`)
      },
      {
        title: '类型',
        dataIndex: 'billType',
        width: '10%',
        width: '8%',
      },
      {
        title: '凭证类型',
        dataIndex: 'ModularCodeName',
        width: '13%'
        width: '11%'
      },
      {
        title: '凭证标识',
        dataIndex: 'ModularDetailCode',
        width: '13%'
        width: '11%'
      },
      {
        title: '关联字段',
        dataIndex: 'linkFieldName',
        width: '13%',
        width: '12%',
        render: (text, record) => (record.linkField ? `${record.linkFieldName || ''}(${record.linkField})` : '')
      },
      {
@@ -168,18 +240,42 @@
        }
      },
      {
        title: '状态',
        dataIndex: 'status',
        width: '9%',
        render: (text, record) => record.status === 'false' ?
          (
            <div>
              {this.props.dict['header.form.status.forbidden']}
              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
            </div>
          ) :
          (
            <div>
              {this.props.dict['header.form.status.open']}
              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
            </div>
          )
      },
      {
        title: '操作',
        align: 'center',
        width: '15%',
        dataIndex: 'operation',
        render: (text, record) =>
          (<div>
            <span className="operation-btn" onClick={() => this.handleEdit(record, 'ordercode')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <Popconfirm title="确定删除吗?" onConfirm={() => this.handleDelete(record, 'ordercode')}>
            <span className="operation-btn" title={this.props.dict['header.edit']} onClick={() => this.handleEdit(record, 'ordercode')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
            <Popconfirm
              title={this.props.dict['header.form.query.delete']}
              okText={this.props.dict['header.confirm']}
              cancelText={this.props.dict['header.cancel']}
              onConfirm={() => this.handleDelete(record, 'ordercode')
            }>
              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
            </Popconfirm>
            <span className="operation-btn" onClick={() => this.handleUpDown(record, 'ordercode', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" onClick={() => this.handleUpDown(record, 'ordercode', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'ordercode', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'ordercode', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'ordercode')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
          </div>)
      }
    ]
@@ -492,6 +588,49 @@
    }
  }
  handleStatus = (record, type) => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    record.status = record.status === 'false' ? 'true' : 'false'
    if (type === 'customverify') {
      verify.customverifys = verify.customverifys.map(item => {
        if (item.uuid === record.uuid) {
          return record
        } else {
          return item
        }
      })
    } else if (type === 'unique') {
      verify.uniques = verify.uniques.map(item => {
        if (item.uuid === record.uuid) {
          return record
        } else {
          return item
        }
      })
    } else if (type === 'ordercode') {
      verify.billcodes = verify.billcodes.map(item => {
        if (item.uuid === record.uuid) {
          return record
        } else {
          return item
        }
      })
    } else if (type === 'scripts') {
      verify.scripts = verify.scripts.map(item => {
        if (item.uuid === record.uuid) {
          return record
        } else {
          return item
        }
      })
    }
    this.setState({
      verify: verify
    })
  }
  handleUpDown = (record, type, direction) => {
    let verify = JSON.parse(JSON.stringify(this.state.verify))
    let index = 0
src/templates/ushare/modalform/index.jsx
@@ -33,7 +33,7 @@
    } else if ((type === 'multiselect' || type === 'select' || type === 'link') && resourceType === '1') { // 选择类型、数据源
      _options = [..._options, 'resourceType', 'dataSource', 'valueField', 'valueText', 'orderBy', 'orderType', 'database']
    } else if (type === 'number') {
      _options = [..._options, 'decimal', 'min', 'max']
      _options = ['label', 'field', 'initval', 'type', 'readonly', 'hidden', 'decimal', 'min', 'max']
    } else if (type === 'fileupload') {
      _options = ['label', 'field', 'type', 'readonly', 'required']
    }
@@ -60,6 +60,7 @@
          form.type = 'select'
        } else if (type === 'number' && form.key === 'initval') {
          form.type = 'number'
          form.required = true
        }
        form.show = _options.includes(form.key)
        return form
@@ -89,7 +90,7 @@
      } else if ((value === 'multiselect' || value === 'select' || value === 'link') && this.state.resourceType === '1') { // 选择类型、数据源
        _options = [..._options, 'resourceType', 'dataSource', 'valueField', 'valueText', 'orderBy', 'orderType', 'database']
      } else if (value === 'number') {
        _options = [..._options, 'decimal', 'min', 'max']
        _options = ['label', 'field', 'initval', 'type', 'readonly', 'hidden', 'decimal', 'min', 'max']
      } else if (value === 'fileupload') {
        _options = ['label', 'field', 'type', 'readonly', 'required']
      }
@@ -112,11 +113,13 @@
        formlist: this.state.formlist.map(form => {
          form.show = _options.includes(form.key)
          if (form.key === 'initval') {
            form.required = false
            if (dateOptions.hasOwnProperty(value)) {
              form.options = dateOptions[value]
              form.type = 'select'
            } else if (value === 'number') {
              form.type = 'number'
              form.required = true
            } else {
              form.type = 'text'
            }
src/utils/utils.js
@@ -445,26 +445,54 @@
   * @return {String} type   执行类型
   * @return {String} table  表名
   */
  static getSysDefaultSql (btn, setting, formdata, param, data) {
  static getSysDefaultSql (btn, setting, formdata, param, data, logcolumns) {
    let primaryId = param.ID
    let BID = param.BID
    let verify = btn.verify
    let _formFieldValue = {}
    if (formdata) { // 获取字段键值对
    // 需要声明的变量集
    let _vars = ['tbid', 'ErrorCode', 'retmsg', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'UserName', 'FullName']
    // 主键字段
    let primaryKey = setting.primaryKey || 'id'
    // 系统变量声明与设置初始值
    let _sql = `Declare @tbid nvarchar(50),@ErrorCode nvarchar(50),@retmsg nvarchar(4000),@BillCode nvarchar(50),@BVoucher nvarchar(50),@FIBVoucherDate nvarchar(50), @FiYear nvarchar(50), @UserName nvarchar(50),@FullName nvarchar(50)
      `
    // 获取字段键值对
    if (formdata) {
      formdata.forEach(form => {
        _formFieldValue[form.key] = form.value
      })
    }
    let _vars = ['tbid', 'ErrorCode', 'retmsg', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'UserName', 'FullName']
    // 去除禁用的验证
    if (verify) {
      if (verify.uniques) {
        verify.uniques = verify.uniques.filter(item => item.status !== 'false')
      }
      if (verify.customverifys) {
        verify.customverifys = verify.customverifys.filter(item => item.status !== 'false')
      }
      if (verify.billcodes) {
        verify.billcodes = verify.billcodes.filter(item => item.status !== 'false')
      }
      if (verify.scripts) {
        verify.scripts = verify.scripts.filter(item => item.status !== 'false')
      }
    }
    let primaryKey = setting.primaryKey || 'id' // 主键字段
    // 系统变量声明与设置初始值
    let _sql = `Declare @tbid nvarchar(50),@ErrorCode nvarchar(50),@retmsg nvarchar(4000),@BillCode nvarchar(50),@BVoucher nvarchar(50),@FIBVoucherDate nvarchar(50), @FiYear nvarchar(50), @UserName nvarchar(50),@FullName nvarchar(50)
      `
    if (verify && verify.scripts && verify.scripts.length > 0 && formdata) {
      let _formfields = formdata.filter(form => !_vars.includes(form.key))
    // 设置有自定义脚本时,声明变量中添加所有表单字段,并避免重复
    if (verify && verify.scripts && verify.scripts.length > 0 && formdata && formdata.length > 0) {
      let _initfields = []
      let _formfields = formdata.filter(form => {
        _initfields.push(`@${form.key}='${form.value}'`)
        return !_vars.includes(form.key)
      })
      _formfields = _formfields.map(form => {
        _vars.push(form.key)
        return `@${form.key} nvarchar(50)`
@@ -472,25 +500,33 @@
      _formfields = _formfields.join(',')
      _sql += `,${_formfields}
        `
      _initfields = _initfields.join(',')
      _sql += `select ${_initfields}
        `
    }
    _sql += `Select @BVoucher='',@FIBVoucherDate='',@FiYear=''
    // 初始化凭证字段
    _sql += `select @BVoucher='',@FIBVoucherDate='',@FiYear=''
      `
    if (verify && verify.accountdate === 'true') { // 启用账期验证
    // 启用账期验证
    if (verify && verify.accountdate === 'true') {
      _sql += `exec s_FIBVoucherDateCheck @ErrorCode=@ErrorCode OUTPUT,@retmsg=@retmsg OUTPUT
        if @ErrorCode!=''
          GOTO aaa
        `
    }
    if (btn.sqlType !== 'insert' && verify && verify.invalid === 'true' && setting.dataresource) { // 失效验证,添加数据时不用
    // 失效验证,添加数据时不用
    if (btn.sqlType !== 'insert' && verify && verify.invalid === 'true' && setting.dataresource) {
      let datasource = setting.dataresource
      if (/\s/.test(datasource)) { // 拼接别名
        datasource = '(' + datasource + ') tb'
      }
      _sql += `Select @tbid='', @ErrorCode='',@retmsg=''
        Select @tbid=${primaryKey} from ${datasource} where ${primaryKey} ='${primaryId}'
      _sql += `select @tbid='', @ErrorCode='',@retmsg=''
        select @tbid=${primaryKey} from ${datasource} where ${primaryKey} ='${primaryId}'
        If @tbid=''
        Begin
          select @ErrorCode='E',@retmsg='数据已失效'
@@ -498,24 +534,26 @@
        end
        `
    }
    if (formdata && verify && verify.uniques.length > 0) { // 唯一性验证,必须存在表单(表单存在时,主键均为单值),必须填写数据源
    // 唯一性验证,必须存在表单(表单存在时,主键均为单值),必须填写数据源
    if (formdata && verify && verify.uniques.length > 0) {
      let _primaryId = primaryId
      if (btn.sqlType === 'insert') {
        _primaryId = ''
      }
      verify.uniques.forEach(item => {
        let _fieldValue = [] // 表单键值对field=value
        let _value = []      // 表单值,用于错误提示
        let _labels = item.fieldlabel.split(',')
        let _fieldValue = []                     // 表单键值对field=value
        let _value = []                          // 表单值,用于错误提示
        let _labels = item.fieldlabel.split(',') // 表单提示文字
        item.field.split(',').forEach((_field, index) => {
          _fieldValue.push(`${_field}='${_formFieldValue[_field]}'`)
          _value.push(`${_labels[index] || ''}:${_formFieldValue[_field] || ''}`)
        })
        _sql += `Select @tbid='', @ErrorCode='',@retmsg=''
          Select @tbid='X' from ${btn.sql} where ${_fieldValue.join(' and ')} and ${primaryKey} !='${_primaryId}'
        _sql += `select @tbid='', @ErrorCode='',@retmsg=''
          select @tbid='X' from ${btn.sql} where ${_fieldValue.join(' and ')} and ${primaryKey} !='${_primaryId}'
          If @tbid!=''
          Begin
            select @ErrorCode='${item.errorCode}',@retmsg='${_value.join(', ')} 已存在'
@@ -525,7 +563,8 @@
      })
    }
    
    if (verify && verify.customverifys.length > 0) { // 自定义验证
    // 自定义验证,使用列表及表单数据(表单优先),替换所有@相同字段、@ID、@BID
    if (verify && verify.customverifys.length > 0) {
      let _primaryId = primaryId
      if (btn.sqlType === 'insert') {
        _primaryId = ''
@@ -551,8 +590,8 @@
        let bidreg = new RegExp('@BID', 'ig')
        _cuSql = _cuSql.replace(bidreg, `'${BID}'`)
        _sql += `Select @tbid='', @ErrorCode='',@retmsg=''
          Select top 1 @tbid='X' from (${_cuSql}) a
        _sql += `select @tbid='', @ErrorCode='',@retmsg=''
          select top 1 @tbid='X' from (${_cuSql}) a
          If @tbid ${item.result === 'true' ? '!=' : '='}''
          Begin
            select @ErrorCode='${item.errorCode}',@retmsg='${item.errmsg}'
@@ -562,7 +601,8 @@
      })
    }
    if (verify && verify.billcodes.length > 0) { // 单号生成
    // 单号生成,使用上级id(BID)或列表数据,声明变量(检验)
    if (verify && verify.billcodes.length > 0) {
      verify.billcodes.forEach(item => {
        let _ModularDetailCode = ''
        if (item.TypeCharOne === 'Lp' || item.TypeCharOne === 'BN') {
@@ -602,7 +642,8 @@
    let _updateconfig = ''
    if (verify && verify.voucher && verify.voucher.enabled && data) { // 凭证-显示列中选取,必须选行
    // 凭证-显示列中选取,必须选行
    if (verify && verify.voucher && verify.voucher.enabled && data) {
      let _voucher = verify.voucher
      _updateconfig = ',BVoucher=@BVoucher,FIBVoucherDate=@FIBVoucherDate,FiYear=@FiYear'
@@ -623,9 +664,11 @@
        `
    }
    // 用于取用户信息
    let _user = `select @UserName=UserName,@FullName=FullName from SUsers where UID=@UserID
      `
    // 添加、修改、逻辑删除、物理删除
    if (btn.OpenType === 'pop' && btn.sqlType === 'insert') {
      let keys = []
      let values = []
@@ -662,10 +705,17 @@
    } else if ((btn.OpenType === 'prompt' || btn.OpenType === 'exec') && btn.sqlType === 'LogicDelete') { // 逻辑删除
      _sql += `update ${btn.sql} set deleted=1,modifydate=getdate(),modifyuserid=@userid where ${primaryKey}=@${primaryKey};`
    } else if ((btn.OpenType === 'prompt' || btn.OpenType === 'exec') && btn.sqlType === 'delete') {      // 物理删除
      let _msg = ''
      if (data && logcolumns && logcolumns.length > 0) {
        logcolumns.forEach(col => {
          _msg += col.label + '=' + data[col.field] + ','
        })
      }
      _sql += _user
      _sql += `insert into snote (remark,createuserid) select '删除表:${btn.sql} 数据: ${primaryKey}='+@${primaryKey},@userid,@username,@fullname delete ${btn.sql} where ${primaryKey}=@${primaryKey};`
      _sql += `insert into snote (remark,createuserid,CreateUser,CreateStaff) select '删除表:${btn.sql} 数据: ${_msg}${primaryKey}='+@${primaryKey},@userid,@username,@fullname delete ${btn.sql} where ${primaryKey}=@${primaryKey};`
    }
    // 拼接自定义脚本
    if (verify && verify.scripts && verify.scripts.length > 0) {
      let _scripts = ''
      verify.scripts.forEach(item => {