From d5a12181a3fe9719e721920fea6093e31cc58ecb Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期三, 23 二月 2022 18:26:30 +0800
Subject: [PATCH] 2022-02-23

---
 src/mob/components/formdragelement/card.jsx                           |    1 
 src/tabviews/custom/components/module/voucher/voucherTable/index.jsx  |  680 ++++++++++++++++++++++++++++++++++++++++
 src/tabviews/custom/components/module/voucher/index.jsx               |   15 
 src/tabviews/custom/components/module/voucher/index.scss              |   12 
 src/tabviews/custom/components/module/voucher/voucherTable/index.scss |  259 +++++++++++++++
 src/mob/searchconfig/searchdragelement/card.jsx                       |    1 
 src/templates/modalconfig/dragelement/card.jsx                        |    1 
 7 files changed, 965 insertions(+), 4 deletions(-)

diff --git a/src/mob/components/formdragelement/card.jsx b/src/mob/components/formdragelement/card.jsx
index 3b4a23c..784b8b7 100644
--- a/src/mob/components/formdragelement/card.jsx
+++ b/src/mob/components/formdragelement/card.jsx
@@ -194,6 +194,7 @@
             className={'ant-form-item' + (card.required === 'true' ? ' required' : '') + (card.splitline === 'false' ? ' no-boder' : '')}
           >
             {formItem}
+            <div></div>
             {showField ? <div className="field-name" style={card.writein === 'false' ? {color: 'orange'} : {}}>
               {card.field}{card.hidden === 'true' ? '锛堥殣钘忥級' : ''}{card.readonly === 'true' ? '锛堝彧璇伙級' : ''}{card.linkField ? <span style={{color: '#1890ff'}}>{`锛堝叧鑱�${card.linkField}锛塦}</span> : ''}{card.supField ? <span style={{color: '#8E44AD'}}>{`锛堜笂绾�${card.supField}锛塦}</span> : ''}
             </div> : ''}
diff --git a/src/mob/searchconfig/searchdragelement/card.jsx b/src/mob/searchconfig/searchdragelement/card.jsx
index df3e2c6..20a0b9a 100644
--- a/src/mob/searchconfig/searchdragelement/card.jsx
+++ b/src/mob/searchconfig/searchdragelement/card.jsx
@@ -129,6 +129,7 @@
             className={'ant-form-item' + (card.required === 'true' ? ' required' : '') + (card.splitline === 'false' ? ' no-boder' : '')}
           >
             {formItem}
+            <div></div>
             {showField ? <div className="field-name">{card.field}{card.hidden === 'true' ? '(闅愯棌)' : ''}</div> : ''}
           </Form.Item>}
         </div>
diff --git a/src/tabviews/custom/components/module/voucher/index.jsx b/src/tabviews/custom/components/module/voucher/index.jsx
index 59ea03c..f5a95a1 100644
--- a/src/tabviews/custom/components/module/voucher/index.jsx
+++ b/src/tabviews/custom/components/module/voucher/index.jsx
@@ -4,9 +4,11 @@
 import { Button, Select, Input, DatePicker } from 'antd'
 // import { EditOutlined, ToolOutlined, DeleteOutlined, FontColorsOutlined } from '@ant-design/icons'
 
+import asyncComponent from '@/utils/asyncComponent'
 // import MKEmitter from '@/utils/events.js'
-
 import './index.scss'
+
+const VoucherTable = asyncComponent(() => import('./voucherTable'))
 
 class VoucherModule extends Component {
   static propTpyes = {
@@ -70,7 +72,7 @@
   }
 
   render() {
-    const { config, disableSave, disableAdd, typeOptions } = this.state
+    const { config, disableSave, disableAdd, typeOptions, data } = this.state
 
     return (
       <div className="menu-voucher-wrap" style={config.style}>
@@ -87,13 +89,18 @@
                   <Select.Option value={option.value}>{option.label}</Select.Option>
                 )}
               </Select>
-              <Input autoComplete="off" />鍙�
+              <Input autoComplete="off" /> 鍙�
             </div>
             <div className="voucher-date">
               鏃ユ湡锛�<DatePicker onChange={this.onChange}/>
             </div>
+            <div className="voucher-affix">
+              闄勫崟鎹� <Input autoComplete="off" /> 寮�
+              <Button type="link" className="" onClick={this.triggerprint}>闄勪欢</Button>
+              <Button type="link" className="" onClick={this.triggerprint}>澶囨敞</Button>
+            </div>
           </div>
-
+          <VoucherTable config={config} data={data}/>
         </div>
       </div>
     )
diff --git a/src/tabviews/custom/components/module/voucher/index.scss b/src/tabviews/custom/components/module/voucher/index.scss
index 856d44b..0137321 100644
--- a/src/tabviews/custom/components/module/voucher/index.scss
+++ b/src/tabviews/custom/components/module/voucher/index.scss
@@ -7,6 +7,7 @@
   background-size: cover;
   min-height: 150px;
   overflow-y: auto;
+  color: #000000;
 
   .voucher-header {
     padding: 10px;
@@ -19,6 +20,7 @@
     }
   }
   .voucher-body {
+    padding: 0 15px;
     .voucher-code {
       display: inline-block;
       width: 160px;
@@ -32,12 +34,22 @@
         width: 60px;
       }
     }
+    .pre-wrap {
+      padding: 10px 0px;
+    }
     .voucher-date {
       display: inline-block;
       .ant-calendar-picker {
         width: 120px;
       }
     }
+    .voucher-affix {
+      float: right;
+      width: 250px;
+      .ant-input {
+        width: 60px;
+      }
+    }
   }
 }
 
diff --git a/src/tabviews/custom/components/module/voucher/voucherTable/index.jsx b/src/tabviews/custom/components/module/voucher/voucherTable/index.jsx
new file mode 100644
index 0000000..10c587a
--- /dev/null
+++ b/src/tabviews/custom/components/module/voucher/voucherTable/index.jsx
@@ -0,0 +1,680 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
+import { Table, Modal, Input, InputNumber, notification, message } from 'antd'
+// import { EditOutlined } from '@ant-design/icons'
+
+import Api from '@/api'
+import MKEmitter from '@/utils/events.js'
+import zhCN from '@/locales/zh-CN/main.js'
+import enUS from '@/locales/en-US/main.js'
+import '@/assets/css/table.scss'
+import './index.scss'
+
+class BodyRow extends React.Component {
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.props.data), fromJS(nextProps.data))
+  }
+
+  render() {
+    let { data, ...resProps } = this.props
+    let style = {}
+    let className = ''
+
+    return <tr {...resProps} className={className} style={style}/>
+  }
+}
+
+class BodyCell extends React.Component {
+  state = {
+    editing: false,
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.props.record), fromJS(nextProps.record)) ||
+      nextState.editing !== this.state.editing
+  }
+
+  componentDidMount () {
+    MKEmitter.addListener('tdFocus', this.tdFocus)
+  }
+
+  /**
+   * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊锛屾竻闄ゅ揩鎹烽敭璁剧疆
+   */
+  componentWillUnmount () {
+    this.setState = () => {
+      return
+    }
+    MKEmitter.removeListener('tdFocus', this.tdFocus)
+  }
+
+  tdFocus = (id) => {
+    const { col, record } = this.props
+
+    if (id !== col.uuid + record.uuid) return
+
+    this.focus()
+  }
+
+  enterPress = () => {
+    const { col, record } = this.props
+    const { value } = this.state
+
+    this.setState({editing: false})
+    setTimeout(() => {
+      if (col.enter === '$next') {
+        MKEmitter.emit('nextLine', col, record.uuid)
+      } else {
+        MKEmitter.emit('tdFocus', col.enter + record.uuid)
+      }
+    }, 50)
+
+    if (value !== record[col.field]) {
+      MKEmitter.emit('changeRecord', col.tableId, {...record, [col.field]: value})
+    }
+  }
+
+  focus = () => {
+    const { col, record } = this.props
+
+    if (record.type === 'total') return
+
+    let val = record[col.field] !== undefined ? record[col.field] : ''
+
+    this.setState({editing: true, value: val}, () => {
+      let node = document.getElementById(col.uuid + record.uuid)
+      node && node.select()
+    })
+  }
+
+  onBlur = () => {
+    const { col, record } = this.props
+    const { value } = this.state
+
+    this.setState({editing: false})
+
+    if (value !== record[col.field]) {
+      MKEmitter.emit('changeRecord', col.tableId, {...record, [col.field]: value})
+    }
+  }
+  
+  onChange = (val) => {
+    this.setState({value: val})
+  }
+
+  render() {
+    let { col, record, className } = this.props
+    const { editing } = this.state
+
+    let children = null
+    let colSpan = 1
+
+    if (col.field === 'remark') {
+      if (record.type === 'total') {
+        children = <div className="content-wrap" style={{lineHeight: '60px'}}>鍚堣: {record.total}</div>
+        colSpan = 2
+      } else {
+        let val = record.remark || ''
+  
+        if (editing) {
+          children = <Input.TextArea id={col.uuid + record.uuid} autoSize={false} defaultValue={val} onChange={(e) => this.onChange(e.target.value)} onPressEnter={this.enterPress} onBlur={this.onBlur}/>
+        } else {
+          children = <div className="content-wrap" onClick={this.focus}>{val}</div>
+        }
+      }
+    } else if (col.field === 'subject') {
+      if (record.type === 'total') {
+        colSpan = 0
+      } else {
+        let val = record.subject || ''
+  
+        if (editing) {
+          children = <Input.TextArea id={col.uuid + record.uuid} autoSize={false} defaultValue={val} onChange={(e) => this.onChange(e.target.value)} onPressEnter={this.enterPress} onBlur={this.onBlur}/>
+        } else {
+          children = <div className="content-wrap" onClick={this.focus}>{val}</div>
+        }
+      }
+    } else if (col.field === 'debtor') {
+      let val = record.debtor
+      let down = false
+      let vals = []
+      if (typeof(val) === 'number') {
+        if (val < 0) {
+          down = true
+          val = Math.abs(val)
+        }
+        vals = (val * 100).toFixed(0).split('').reverse()
+      }
+
+      if (editing) {
+        children = <InputNumber id={col.uuid + record.uuid} defaultValue={val} onChange={(val) => this.onChange(val)} onPressEnter={this.enterPress} onBlur={this.onBlur}/>
+      } else {
+        children = <div className={'money-uint' + (down ? ' down' : '')} onClick={this.focus}>
+          <span>{vals[10] || ''}</span> <span>{vals[9] || ''}</span> <span>{vals[8] || ''}</span> <span>{vals[7] || ''}</span> <span>{vals[6] || ''}</span> <span>{vals[5] || ''}</span>
+          <span>{vals[4] || ''}</span> <span>{vals[3] || ''}</span> <span>{vals[2] || ''}</span> <span>{vals[1] || ''}</span> <span className="last">{vals[0] || ''}</span>
+        </div>
+      }
+    } else if (col.field === 'creditor') {
+      let val = record.creditor
+      let down = false
+      let vals = []
+      if (typeof(val) === 'number') {
+        if (val < 0) {
+          down = true
+          val = Math.abs(val)
+        }
+        vals = (val * 100).toFixed(0).split('').reverse()
+      }
+
+      if (editing) {
+        children = <InputNumber id={col.uuid + record.uuid} defaultValue={val} onChange={(val) => this.onChange(val)} onPressEnter={this.enterPress} onBlur={this.onBlur}/>
+      } else {
+        children = <div className={'money-uint' + (down ? ' down' : '')} onClick={this.focus}>
+        <span>{vals[10] || ''}</span> <span>{vals[9] || ''}</span> <span>{vals[8] || ''}</span> <span>{vals[7] || ''}</span> <span>{vals[6] || ''}</span> <span>{vals[5] || ''}</span>
+        <span>{vals[4] || ''}</span> <span>{vals[3] || ''}</span> <span>{vals[2] || ''}</span> <span>{vals[1] || ''}</span> <span className="last">{vals[0] || ''}</span>
+      </div>
+      }
+    }
+
+    if (!colSpan) return null
+
+    return (<td colSpan={colSpan} className={className}>{children}</td>)
+  }
+}
+
+class VoucherTable extends Component {
+  static propTpyes = {
+    config: PropTypes.object,        // 鑿滃崟Id
+    BID: PropTypes.any,              // 涓昏〃ID
+    data: PropTypes.any,             // 琛ㄦ牸鏁版嵁
+    total: PropTypes.any,            // 鎬绘暟
+    loading: PropTypes.bool,         // 琛ㄦ牸鍔犺浇涓�
+    refreshdata: PropTypes.func,     // 琛ㄦ牸涓帓搴忓垪銆侀〉鐮佺殑鍙樺寲鏃跺埛鏂�
+  }
+
+  state = {
+    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
+    data: [],
+    edData: [],
+    edColumns: [],
+    tableId: '',          // 琛ㄦ牸ID
+    pageSize: 10,         // 姣忛〉鏁版嵁鏉℃暟
+    columns: null,        // 鏄剧ず鍒�
+    loading: false,
+  }
+
+  UNSAFE_componentWillMount () {
+    let tableId = (() => {
+      let uuid = []
+      let _options = 'abcdefghigklmnopqrstuv'
+      for (let i = 0; i < 19; i++) {
+        uuid.push(_options.substr(Math.floor(Math.random() * 0x20), 1))
+      }
+      return uuid.join('')
+    }) ()
+
+    this.setState({
+      data: [
+        {uuid: 'dsfdsfdsfs', remark: '鎻愮幇', subject: '1001 搴撳瓨鐜伴噾', debtor: 124, creditor: ''},
+        {uuid: 'dsfdsfsdfdsfs', remark: '璐叆鍥哄畾璧勪骇', subject: '1001 搴撳瓨鐜伴噾', debtor: '', creditor: 124},
+        {uuid: 'dsfdsfsdgdrsfs', remark: '杞粨閿�鍞垚鏈�', subject: '1001 搴撳瓨鐜伴噾', debtor: -524, creditor: ''},
+        {uuid: 'dsfdsfsdgfdsgdsfs', remark: '鎻愮幇', subject: '1001 搴撳瓨鐜伴噾', debtor: 34, creditor: ''},
+        {uuid: 'dsfdsfsdgfdsswgdsfs', type: 'total', total: this.changeMoneyToChinese(354.24), debtor: 354.24, creditor: ''},
+      ],
+      columns: [
+        {
+          title: '鎽樿',
+          dataIndex: 'remark',
+          key: 'remark',
+          width: '22%',
+          onCell: record => ({
+            record,
+            col: {uuid: 'remark', field: 'remark', tableId: tableId},
+          })
+        },
+        {
+          title: '浼氳绉戠洰',
+          dataIndex: 'subject',
+          key: 'subject',
+          width: '34%',
+          onCell: record => ({
+            record,
+            col: {uuid: 'subject', field: 'subject', tableId: tableId},
+          })
+        },
+        {
+          title: () => (<>
+            <div className="money-title">鍊熸柟閲戦</div>
+            <div className="money-uint">
+              <span>浜�</span> <span>鍗�</span> <span>鐧�</span> <span>鍗�</span> <span>涓�</span> <span>鍗�</span>
+              <span>鐧�</span> <span>鍗�</span> <span>鍏�</span> <span>瑙�</span> <span className="last">鍒�</span>
+            </div>
+          </>),
+          dataIndex: 'debtor',
+          key: 'debtor',
+          width: '22%',
+          onCell: record => ({
+            record,
+            col: {uuid: 'debtor', field: 'debtor', tableId: tableId},
+          })
+        },
+        {
+          title: () => (<>
+            <div className="money-title">璐锋柟閲戦</div>
+            <div className="money-uint">
+              <span>浜�</span> <span>鍗�</span> <span>鐧�</span> <span>鍗�</span> <span>涓�</span> <span>鍗�</span>
+              <span>鐧�</span> <span>鍗�</span> <span>鍏�</span> <span>瑙�</span> <span className="last">鍒�</span>
+            </div>
+          </>),
+          dataIndex: 'creditor',
+          key: 'creditor',
+          width: '22%',
+          onCell: record => ({
+            record,
+            col: {uuid: 'creditor', field: 'creditor', tableId: tableId},
+          })
+        }
+      ],
+      tableId
+    })
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  componentDidMount () {
+    MKEmitter.addListener('nextLine', this.nextLine)
+    MKEmitter.addListener('delRecord', this.delRecord)
+    MKEmitter.addListener('changeRecord', this.changeRecord)
+  }
+
+  /**
+   * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊
+   */
+  componentWillUnmount () {
+    this.setState = () => {
+      return
+    }
+    MKEmitter.removeListener('nextLine', this.nextLine)
+    MKEmitter.removeListener('delRecord', this.delRecord)
+    MKEmitter.removeListener('changeRecord', this.changeRecord)
+  }
+
+  UNSAFE_componentWillReceiveProps(nextProps) {
+    if (!is(fromJS(this.props.data), fromJS(nextProps.data))) {
+      this.setState({data: nextProps.data || []})
+    }
+  }
+  
+  changeMoneyToChinese = (money) => {
+    let cnNums = ['闆�', '澹�', '璐�', '鍙�', '鑲�', '浼�', '闄�', '鏌�', '鎹�', '鐜�']
+    let cnIntRadice = ['', '鎷�', '浣�', '浠�']
+    let cnIntUnits = ['', '涓�', '浜�', '鍏�']
+    let cnDecUnits = ['瑙�', '鍒�', '姣�', '鍘�']
+    let cnInteger = '鏁�'
+    let cnIntLast = '鍏�'
+    let maxNum = 999999999999999.9999 // 鏈�澶у鐞嗙殑鏁板瓧
+    let IntegerNum = null
+    let DecimalNum = null
+    let ChineseStr = ''
+    let parts = null // 鍒嗙閲戦鍚庣敤鐨勬暟缁勶紝棰勫畾涔�
+    let Symbol = ''  // 姝h礋鍊兼爣璁�
+
+    if (money === '') return ''
+
+    if (money >= maxNum) return '瓒呭嚭鏈�澶у鐞嗘暟瀛�'
+
+    if (money === 0) {
+      ChineseStr = cnNums[0] + cnIntLast + cnInteger;
+      return ChineseStr
+    }
+    if(money < 0) {
+      money = -money
+      Symbol = '璐�'       
+    }
+    money = money.toString() // 杞崲涓哄瓧绗︿覆
+    if (money.indexOf('.') === -1) {
+      IntegerNum = money
+      DecimalNum = ''
+    } else {
+      parts = money.split('.')
+      IntegerNum = parts[0]
+      DecimalNum = parts[1].substr(0, 4)
+    }
+
+    if (parseInt(IntegerNum, 10) > 0) { // 鑾峰彇鏁村瀷閮ㄥ垎杞崲
+      let zeroCount = 0
+      let IntLen = IntegerNum.length
+      for (let i = 0; i < IntLen; i++) {
+        let n = IntegerNum.substr(i, 1)
+        let p = IntLen - i - 1
+        let q = p / 4
+        let m = p % 4
+        
+        if (n === '0') {
+          zeroCount++
+        } else {
+          if (zeroCount > 0) {
+            ChineseStr += cnNums[0]
+          }
+          zeroCount = 0 // 褰掗浂
+          ChineseStr += cnNums[parseInt(n)] + cnIntRadice[m]
+        }
+
+        if (m === 0 && zeroCount < 4) {
+          ChineseStr += cnIntUnits[q]
+        }
+      }
+      ChineseStr += cnIntLast
+    }
+
+    if (DecimalNum !== '') { // 灏忔暟閮ㄥ垎
+      let decLen = DecimalNum.length
+
+      for (let i = 0; i < decLen; i++) {
+        let n = DecimalNum.substr(i, 1)
+        if (n !== '0') {
+          ChineseStr += cnNums[Number(n)] + cnDecUnits[i]
+        }
+      }
+    }
+    if (ChineseStr === '') {
+      ChineseStr += cnNums[0] + cnIntLast + cnInteger
+    } else if (DecimalNum === '') {
+      ChineseStr += cnInteger
+    }
+
+    ChineseStr = Symbol + ChineseStr
+    
+    return ChineseStr
+  }
+
+  nextLine = (col, index) => {
+    const { setting } = this.props
+    const { edData, initEditLine, tableId } = this.state
+
+    if (col.tableId !== tableId) return
+
+    index = +index
+
+    if (index < edData.length && initEditLine) {
+      MKEmitter.emit('tdFocus', initEditLine.uuid + (index + 1))
+    } else if (col.footEnter === 'add' && setting.addable === 'true') {
+      setTimeout(() => {
+        this.plusLine(initEditLine)
+      }, 10)
+    } else if (col.footEnter === 'sub') {
+      setTimeout(() => {
+        this.checkData()
+      }, 10)
+    }
+  }
+
+  plusLine = (initEditLine) => {
+    const { edData } = this.state
+
+    let item = {...edData[edData.length - 1]}
+
+    item.key = item.key + 1
+    item.$$uuid = '$new'
+
+    this.setState({edData: [...edData, item]}, () => {
+      MKEmitter.emit('tdFocus', initEditLine.uuid + item.uuid)
+    })
+  }
+
+  delRecord = (id, record) => {
+    const { tableId, edData } = this.state
+
+    if (id !== tableId) return
+
+    let _data = []
+
+    if (record.$$uuid === '$new') {
+      _data = edData.filter(item => item.uuid !== record.uuid)
+      _data = _data.map((item, index) => {
+        item.key = index
+        return item
+      })
+    } else {
+      _data = edData.map(item => {
+        if (item.uuid === record.uuid) {
+          record.$deleted = true
+          return record
+        } else {
+          return item
+        }
+      })
+    }
+
+    this.setState({edData: _data})
+  }
+
+  changeRecord = (id, record) => {
+    const { tableId } = this.state
+
+    if (id !== tableId) return
+
+    let _data = this.state.edData.map(item => {
+      if (item.uuid === record.uuid) {
+        return record
+      } else {
+        return item
+      }
+    })
+
+    this.setState({edData: _data})
+  }
+
+  addLine = () => {
+    const { BID } = this.props
+    const { edData } = this.state
+
+    let item = {}
+    if (edData.length > 0) {
+      item = {...edData[edData.length - 1]}
+      item.key = item.key + 1
+      item.$$uuid = '$new'
+    } else {
+      item.key = 0
+      item.$$uuid = '$new'
+      item.$$BID = BID || ''
+    }
+
+    this.setState({edData: [...edData, item]})
+  }
+
+  checkData = () => {
+    const { edData } = this.state
+
+    if (edData.length === 0) {
+      notification.warning({
+        top: 92,
+        message: '鎻愪氦鏁版嵁涓嶅彲涓虹┖锛�',
+        duration: 5
+      })
+      return
+    }
+    let err = ''
+    let data = fromJS(edData).toJS().map(item => {
+      // let line = []
+      // fields.forEach(col => {
+      //   if (col.editable !== 'true' || item.$deleted) {
+      //     if (col.type === 'number') {
+      //       item[col.field] = +item[col.field]
+      //       if (isNaN(item[col.field])) {
+      //         item[col.field] = 0
+      //       }
+      //     } else {
+      //       item[col.field] = item[col.field] !== undefined ? (item[col.field] + '') : ''
+      //     }
+      //     return
+      //   }
+      //   if (col.type === 'text') {
+      //     let val = item[col.field] !== undefined ? (item[col.field] + '') : ''
+      //     if (col.required === 'true' && !val) {
+      //       line.push(`${col.label}涓嶅彲涓虹┖`)
+      //     }
+      //     item[col.field] = val
+      //   } else if (col.type === 'number') {
+      //     let val = item[col.field]
+      //     if (!val && val !== 0) {
+      //       line.push(`${col.label}涓嶅彲涓虹┖`)
+      //       return
+      //     }
+      //     val = +val
+      //     if (isNaN(val)) {
+      //       line.push(`${col.label}鏁版嵁鏍煎紡閿欒`)
+      //       return
+      //     }
+
+      //     val = +val.toFixed(col.decimal || 0)
+          
+      //     if (typeof(col.max) === 'number' && val > col.max) {
+      //       line.push(`${col.label}涓嶅彲澶т簬${col.max}`)
+      //     } else if (typeof(col.min) === 'number' && val < col.min) {
+      //       line.push(`${col.label}涓嶅彲灏忎簬${col.min}`)
+      //     }
+
+      //     item[col.field] = val
+      //   }
+      // })
+
+      return item
+    })
+
+    if (err) {
+      notification.warning({
+        top: 92,
+        message: err,
+        duration: 5
+      })
+    } else {
+      this.submit(data)
+    }
+  }
+
+  submit = (data) => {
+    const { BID } = this.props
+
+    let param = {
+      // excel_in: result.lines,
+      BID: BID || ''
+    }
+
+    this.setState({
+      loading: true
+    })
+
+    param.func = 'submit.innerFunc'
+
+    Api.genericInterface(param).then((res) => {
+      if (res.status) {
+        this.execSuccess(res)
+      } else {
+        this.execError(res)
+      }
+    }, () => {
+      this.execError({})
+    })
+  }
+
+  execSuccess = (res) => {
+    const { submit } = this.props
+
+    if (res && res.ErrCode === 'S') { // 鎵ц鎴愬姛
+      notification.success({
+        top: 92,
+        message: res.ErrMesg || this.state.dict['main.action.confirm.success'],
+        duration: submit.stime ? submit.stime : 2
+      })
+    } else if (res && res.ErrCode === 'Y') { // 鎵ц鎴愬姛
+      Modal.success({
+        title: res.ErrMesg || this.state.dict['main.action.confirm.success']
+      })
+    } else if (res && res.ErrCode === '-1') { // 瀹屾垚鍚庝笉鎻愮ず
+
+    }
+
+    this.setState({
+      loading: false
+    })
+
+    if (submit.closetab === 'true') {
+      MKEmitter.emit('popclose')
+    }
+    if (submit.execSuccess !== 'never') {
+      MKEmitter.emit('refreshByButtonResult', submit.$menuId, submit.execSuccess, submit)
+    }
+  }
+
+  execError = (res) => {
+    const { submit } = this.props
+
+    if (res.ErrCode === 'E') {
+      Modal.error({
+        title: res.message || res.ErrMesg,
+      })
+    } else if (res.ErrCode === 'N') {
+      notification.error({
+        top: 92,
+        message: res.message || res.ErrMesg,
+        duration: submit.ntime ? submit.ntime : 10
+      })
+    } else if (res.ErrCode === 'F') {
+      notification.error({
+        className: 'notification-custom-error',
+        top: 92,
+        message: res.message || res.ErrMesg,
+        duration: submit.ftime ? submit.ftime : 10
+      })
+    } else if (res.ErrCode === 'NM') {
+      message.error(res.message || res.ErrMesg)
+    }
+    
+    this.setState({
+      loading: false
+    })
+
+    if (submit.execError !== 'never') {
+      MKEmitter.emit('refreshByButtonResult', submit.$menuId, submit.execError, submit)
+    }
+  }
+
+  render() {
+    const { tableId, data, columns} = this.state
+
+    const components = {
+      body: {
+        row: BodyRow,
+        cell: BodyCell
+      }
+    }
+
+    // 鏁版嵁鏀惰捣鏃讹紝杩囨护宸查�夋暟鎹�
+    let _data = data
+
+    return (
+      <div className="voucher-table-wrap" id={tableId}>
+        <Table
+          rowKey="uuid"
+          components={components}
+          columns={columns}
+          dataSource={_data}
+          bordered={true}
+          // loading={this.props.loading}
+          onRow={(record, index) => {
+            return {
+              data: record
+            }
+          }}
+          pagination={false}
+        />
+      </div>
+    )
+  }
+}
+
+export default VoucherTable
\ No newline at end of file
diff --git a/src/tabviews/custom/components/module/voucher/voucherTable/index.scss b/src/tabviews/custom/components/module/voucher/voucherTable/index.scss
new file mode 100644
index 0000000..e8175c8
--- /dev/null
+++ b/src/tabviews/custom/components/module/voucher/voucherTable/index.scss
@@ -0,0 +1,259 @@
+.voucher-table-wrap {
+  position: relative;
+  padding: 0px;
+
+  .normal-table-footer {
+    padding: 10px 0px;
+    color: rgba(0, 0, 0, 0.65);
+  }
+  .normal-table-footer.pagination {
+    position: absolute;
+    bottom: 10px;
+  }
+  >.ant-table-wrapper {
+    position: relative;
+    z-index: 1;
+  }
+  .ant-table {
+    color: inherit;
+    font-size: inherit;
+  }
+
+  .money-uint {
+    display: flex;
+    span {
+      display: inline-block;
+      flex: 1;
+      text-align: center;
+      font-size: 12px;
+    }
+    span:not(.last) {
+      border-right: 1px solid #e9e9e9;
+    }
+    span:nth-child(3), span:nth-child(6) {
+      border-color: #91d5ff;
+    }
+    span:nth-child(9) {
+      border-color: #ffa39e;
+    }
+  }
+
+  table {
+    max-width: 100%;
+    width: 100%;
+    .ant-table-thead {
+      tr {
+        th {
+          position: relative;
+          background-color: transparent;
+          padding: 0;
+          height: 60px;
+          line-height: 60px;
+          text-align: center;
+
+          .ant-table-header-column {
+            display: block;
+            width: 100%;
+            height: 100%;
+
+            .ant-table-column-title {
+              display: block;
+              width: 100%;
+              height: 100%;
+              font-weight: bold;
+              font-size: 13px;
+            }
+          }
+          .money-title {
+            line-height: 30px;
+            font-weight: bold;
+            font-size: 13px;
+          }
+          .money-uint {
+            line-height: 30px;
+            border-top: 1px solid #dadada;
+          }
+        }
+      }
+    }
+    .ant-table-selection-column {
+      width: 60px;
+      min-width: 60px;
+      max-width: 60px;
+    }
+    .ant-table-tbody {
+      tr td {
+        position: relative;
+        background-color: transparent;
+        padding: 0;
+        height: 60px;
+        vertical-align: top;
+
+        .content-wrap {
+          padding: 5px;
+          height: 100%;
+          font-size: 13px;
+          font-weight: bold;
+        }
+        .money-uint {
+          height: 100%;
+          line-height: 60px;
+
+          span {
+            font-size: 14px;
+            font-weight: bold;
+          }
+        }
+        .money-uint.down {
+          span {
+            color: #ff4d4f;
+          }
+        }
+      }
+    }
+  }
+  .ant-input {
+    height: 60px;
+    border-radius: 0;
+    resize: none;
+  }
+  .ant-input-number {
+    height: 60px;
+    border-radius: 0;
+    
+    .ant-input-number-handler-wrap {
+      display: none;
+    }
+    .ant-input-number-input {
+      border-radius: 0;
+      height: 60px;
+    }
+  }
+  .editing_table_cell {
+    .ant-input {
+      padding: 0px;
+      position: absolute;
+      top: 0px;
+      left: 0px;
+      right: 0px;
+      bottom: 0px;
+      border: 1px solid #1890ff;
+    }
+    .ant-input-number-input {
+      position: absolute;
+      top: 0px;
+      left: 0px;
+      right: 0px;
+      bottom: 0px;
+      border: 1px solid #1890ff;
+    }
+    .anticon {
+      color: #ff4d4f;
+      position: absolute;
+      right: 3px;
+      top: calc(50% - 8px);
+    }
+  }
+  td.pointer {
+    position: relative;
+  }
+  td.pointer {
+    .mk-mask {
+      display: none;
+      cursor: pointer;
+      position: absolute;
+      top: 0;
+      left: 0;
+      bottom: 0;
+      right: 0;
+    }
+  }
+}
+.edit-custom-table.editable {
+  td {
+    background-color: #ffffff!important;
+  }
+  td.pointer .mk-mask {
+    display: block;
+  }
+  .mk-operation {
+    display: none;
+  }
+  .ant-table-placeholder {
+    display: none;
+  }
+}
+.edit-custom-table:not(.fixed-height) {
+  .ant-table-body::-webkit-scrollbar {
+    width: 8px;
+    height: 10px;
+  }
+  ::-webkit-scrollbar-thumb {
+    border-radius: 5px;
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
+    background: rgba(0, 0, 0, 0.13);
+  }
+  ::-webkit-scrollbar-track {/*婊氬姩鏉¢噷闈㈣建閬�*/
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
+    border-radius: 3px;
+    border: 1px solid rgba(0, 0, 0, 0.07);
+    background: rgba(0, 0, 0, 0);
+  }
+}
+.edit-custom-table.fixed-height {
+  .ant-table-body {
+    border-bottom: 1px solid rgba(0, 0, 0, .05);
+    .ant-table-fixed {
+      border-bottom: 0;
+    }
+  }
+}
+.edit-custom-table.hidden {
+  thead {
+    display: none;
+  }
+}
+.edit-custom-table.ghost {
+  .ant-table-thead > tr {
+    > th {
+      color: inherit;
+      background: transparent;
+      .ant-table-column-sorter .ant-table-column-sorter-inner {
+        color: inherit;
+      }
+    }
+    > th:hover {
+      background: transparent;
+    }
+  }
+  .ant-table-body {
+    overflow-x: auto;
+    tr {
+      td {
+        background: transparent!important;
+      }
+    }
+    tr:hover td {
+      background: transparent!important;
+    }
+  }
+}
+.image-scale-modal {
+  width: 70vw;
+  min-height: 80vh;
+  top: 10vh;
+  .ant-modal-body {
+    min-height: calc(80vh - 110px);
+    line-height: calc(80vh - 160px);
+    text-align: center;
+  }
+  .ant-modal-footer {
+    text-align: center;
+    span {
+      display: inline-block;
+      color: #1890ff;
+      padding: 5px 15px;
+      cursor: pointer;
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/templates/modalconfig/dragelement/card.jsx b/src/templates/modalconfig/dragelement/card.jsx
index e2ab66e..449c503 100644
--- a/src/templates/modalconfig/dragelement/card.jsx
+++ b/src/templates/modalconfig/dragelement/card.jsx
@@ -155,6 +155,7 @@
             wrapperCol={card.labelwidth ? {style: {width: (100 - card.labelwidth) + '%'}} : null}
           >
             {formItem}
+            <div></div>
             {showField ? <div className="field-name" style={card.writein === 'false' ? {color: 'orange'} : {}}>
               {card.field}{card.hidden === 'true' ? '锛堥殣钘忥級' : ''}{card.readonly === 'true' ? '锛堝彧璇伙級' : ''}{card.linkField ? <span style={{color: '#1890ff'}}>{`锛堝叧鑱�${card.linkField}锛塦}</span> : ''}{card.supField ? <span style={{color: '#8E44AD'}}>{`锛堜笂绾�${card.supField}锛塦}</span> : ''}
             </div> : ''}

--
Gitblit v1.8.0