import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { is, fromJS } from 'immutable'
|
import { Table } from 'antd'
|
|
import Utils from '@/utils/utils.js'
|
import './index.scss'
|
|
class BodyRow extends React.Component {
|
render() {
|
let { data, ...resProps } = this.props
|
let style = {}
|
let className = ''
|
|
return <tr {...resProps} className={className} style={style}/>
|
}
|
}
|
|
class BodyCell extends React.Component {
|
state = {}
|
|
/**
|
* @description 组件销毁,清除state更新,清除快捷键设置
|
*/
|
componentWillUnmount () {
|
this.setState = () => {
|
return
|
}
|
}
|
|
render() {
|
let { col, record, className } = this.props
|
let children = null
|
let colSpan = 1
|
|
if (col.field === 'remark') {
|
let val = record.remark || ''
|
|
if (record.type === 'total') {
|
children = <div className="content-wrap" style={{lineHeight: '60px'}}>合计: {val}</div>
|
colSpan = 2
|
} else {
|
children = <div className="content-wrap">{val}</div>
|
}
|
} else if (col.field === 'subject') {
|
if (record.type === 'total') {
|
colSpan = 0
|
} else {
|
let val = record.subject || ''
|
|
children = <div className="content-wrap">{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()
|
}
|
|
children = <div className={'money-uint' + (down ? ' down' : '')}>
|
<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()
|
}
|
|
children = <div className={'money-uint' + (down ? ' down' : '')}>
|
<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
|
total: PropTypes.any, // 总数
|
loading: PropTypes.bool, // 表格加载中
|
refreshdata: PropTypes.func, // 表格中排序列、页码的变化时刷新
|
}
|
|
state = {
|
data: [],
|
edData: [],
|
edColumns: [],
|
tableId: '', // 表格ID
|
pageSize: 10, // 每页数据条数
|
columns: null, // 显示列
|
loading: false,
|
}
|
|
UNSAFE_componentWillMount () {
|
const { config } = this.props
|
|
let data = [
|
{remark: '提现', subject: '1001 库存现金', debtor: 124, creditor: ''},
|
{remark: '购入固定资产', subject: '1001 库存现金', debtor: '', creditor: 124},
|
{remark: '转结销售成本', subject: '1001 库存现金', debtor: -524, creditor: ''},
|
{remark: '提现', subject: '1001 库存现金', debtor: 34, creditor: ''},
|
]
|
|
data = this.initData(data)
|
data.push(this.getTotalLine(data))
|
|
let columns = [
|
{
|
title: '摘要',
|
dataIndex: 'remark',
|
key: 'remark',
|
width: '22%',
|
onCell: record => ({
|
record,
|
col: {uuid: 'remark', field: 'remark', tableId: config.uuid},
|
})
|
},
|
{
|
title: '会计科目',
|
dataIndex: 'subject',
|
key: 'subject',
|
width: '34%',
|
onCell: record => ({
|
record,
|
col: {uuid: 'subject', field: 'subject', tableId: config.uuid},
|
})
|
},
|
{
|
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: config.uuid},
|
})
|
},
|
{
|
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: config.uuid},
|
})
|
}
|
]
|
|
this.setState({
|
data: data,
|
edData: fromJS(data).toJS(),
|
columns,
|
tableId: config.uuid
|
})
|
}
|
|
shouldComponentUpdate (nextProps, nextState) {
|
return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
|
}
|
|
/**
|
* @description 组件销毁,清除state更新
|
*/
|
componentWillUnmount () {
|
this.setState = () => {
|
return
|
}
|
}
|
|
initData = (data) => {
|
let _data = data.map((item, i) => {
|
item.uuid = Utils.getuuid()
|
item.index = i
|
|
return item
|
})
|
|
if (_data.length < 4) {
|
for (let i = _data.length - 1; i < 4; i++) {
|
_data.push({uuid: Utils.getuuid(), index: i + 1, remark: '', subject: '', debtor: '', creditor: ''})
|
}
|
}
|
return _data
|
}
|
|
getTotalLine = (data) => {
|
let totalLine = {uuid: Utils.getuuid(), type: 'total'}
|
let debtor = ''
|
let creditor = ''
|
|
data.forEach(item => {
|
if (typeof(item.debtor) === 'number') {
|
if (debtor === '') {
|
debtor = 0
|
}
|
|
debtor += item.debtor
|
} else if (typeof(item.creditor) === 'number') {
|
if (debtor === '') {
|
debtor = 0
|
}
|
if (creditor === '') {
|
creditor = 0
|
}
|
creditor += item.creditor
|
}
|
})
|
|
totalLine.debtor = debtor
|
totalLine.creditor = creditor
|
|
totalLine.remark = this.changeMoneyToChinese(debtor)
|
|
return totalLine
|
}
|
|
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 = '' // 正负值标记
|
|
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
|
}
|
|
render() {
|
const { edData, columns} = this.state
|
|
const components = {
|
body: {
|
row: BodyRow,
|
cell: BodyCell
|
}
|
}
|
|
return (
|
<div className="voucher-table-wrap">
|
<Table
|
rowKey="uuid"
|
components={components}
|
columns={columns}
|
dataSource={edData}
|
bordered={true}
|
onRow={(record, index) => {
|
return {
|
data: record
|
}
|
}}
|
pagination={false}
|
/>
|
</div>
|
)
|
}
|
}
|
|
export default VoucherTable
|