| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { is, fromJS } from 'immutable' |
| | | import { Table, Modal, Input, InputNumber, notification, message, AutoComplete, Select } from 'antd' |
| | | import { Table, Modal, Form, Input, InputNumber, notification, message, AutoComplete, Select, Popover, Button } from 'antd' |
| | | import { PlusOutlined, CloseOutlined } from '@ant-design/icons' |
| | | |
| | | import Api from '@/api' |
| | |
| | | } |
| | | } |
| | | |
| | | class Accounting extends React.Component { |
| | | state = { |
| | | subAccounts: [], |
| | | record: null |
| | | } |
| | | |
| | | UNSAFE_componentWillMount() { |
| | | const { data, tableId } = this.props |
| | | let subAccounts = data.sup_accounting.split(',') |
| | | let msg = window.GLOB.CacheVoucher.get(tableId) || {} |
| | | let names = msg.names || {} |
| | | |
| | | subAccounts = subAccounts.map(n => { |
| | | let item = { |
| | | field: n, |
| | | label: names[n] || n, |
| | | initval: data[n] || '', |
| | | options: [] |
| | | } |
| | | |
| | | if (msg[n]) { |
| | | item.options = msg[n] |
| | | } |
| | | |
| | | return item |
| | | }) |
| | | |
| | | this.setState({subAccounts: subAccounts, record: fromJS(data).toJS()}) |
| | | } |
| | | |
| | | selectChange = (val, item) => { |
| | | this.setState({record: {...this.state.record, [item.field]: val || ''}}) |
| | | } |
| | | |
| | | getFields() { |
| | | const { subAccounts } = this.state |
| | | |
| | | const fields = [] |
| | | |
| | | subAccounts.forEach((item) => { |
| | | fields.push( |
| | | <Form.Item label={item.label} key={item.field}> |
| | | <Select |
| | | showSearch |
| | | allowClear |
| | | defaultValue={item.initval} |
| | | filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} |
| | | onChange={(val) => this.selectChange(val, item)} |
| | | > |
| | | {item.options.map((option, i) => |
| | | <Select.Option key={i} value={option.value}>{option.label}</Select.Option> |
| | | )} |
| | | </Select> |
| | | </Form.Item> |
| | | ) |
| | | }) |
| | | |
| | | return fields |
| | | } |
| | | |
| | | confirm = () => { |
| | | const { subAccounts, record } = this.state |
| | | |
| | | let empty = '' |
| | | subAccounts.forEach(item => { |
| | | if (!empty && !record[item.field]) { |
| | | empty = item.label |
| | | } |
| | | }) |
| | | |
| | | if (empty) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: '请选择' + empty, |
| | | duration: 5 |
| | | }) |
| | | } else { |
| | | this.props.confirm(record) |
| | | } |
| | | } |
| | | |
| | | render() { |
| | | return <div> |
| | | {this.getFields()} |
| | | <div className="footer"> |
| | | <Button onClick={this.props.cancel}>取消</Button> |
| | | <Button onClick={this.confirm}>确定</Button> |
| | | </div> |
| | | </div> |
| | | } |
| | | } |
| | | |
| | | 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 |
| | | visible: false, |
| | | } |
| | | |
| | | componentDidMount () { |
| | |
| | | |
| | | this.setState({editing: false}) |
| | | |
| | | if (col.field === 'subjectscode') return |
| | | |
| | | if (value !== record[col.field]) { |
| | | let line = {...record, [col.field]: value} |
| | | |
| | |
| | | MKEmitter.emit('delRecord', col.tableId, record) |
| | | } |
| | | |
| | | onSelectBlur = () => { |
| | | const { visible } = this.state |
| | | |
| | | if (visible) return |
| | | |
| | | this.setState({editing: false}) |
| | | } |
| | | |
| | | onSelectChange = (val, option) => { |
| | | const { col, record } = this.props |
| | | |
| | | this.setState({editing: false}) |
| | | |
| | | let line = {...record, ...option.props.extra} |
| | | |
| | | if (record.sup_accounting && !line.sup_accounting) { |
| | | record.sup_accounting.split(',').forEach(item => { |
| | | line[item] = '' |
| | | }) |
| | | } |
| | | |
| | | MKEmitter.emit('changeRecord', col.tableId, line) |
| | | |
| | | if (line.sup_accounting) { |
| | | setTimeout(() => { |
| | | this.setState({visible: true}) |
| | | }, 100) |
| | | } else { |
| | | this.setState({editing: false}) |
| | | setTimeout(() => { |
| | | MKEmitter.emit('tdFocus', 'debtor' + record.uuid) |
| | | }, 50) |
| | | } |
| | | } |
| | | |
| | | confirm = (res) => { |
| | | const { col } = this.props |
| | | |
| | | MKEmitter.emit('changeRecord', col.tableId, fromJS(res).toJS()) |
| | | |
| | | this.setState({editing: false, visible: false}) |
| | | setTimeout(() => { |
| | | MKEmitter.emit('tdFocus', 'debtor' + record.uuid) |
| | | MKEmitter.emit('tdFocus', 'debtor' + res.uuid) |
| | | }, 50) |
| | | } |
| | | |
| | | cancel = () => { |
| | | const { col } = this.props |
| | | let record = fromJS(this.props.record).toJS() |
| | | record.balance_direction = '' |
| | | record.count_type = '' |
| | | record.foreign_currency_type = '' |
| | | record.mnemonic_code = '' |
| | | record.subjectscode = '' |
| | | record.subjectsname = '' |
| | | record.sup_accounting.split(',').forEach(item => { |
| | | record[item] = '' |
| | | }) |
| | | |
| | | record.sup_accounting = '' |
| | | |
| | | MKEmitter.emit('changeRecord', col.tableId, record) |
| | | |
| | | this.setState({editing: false, visible: false}) |
| | | } |
| | | |
| | | render() { |
| | | let { col, record, subjects, className } = this.props |
| | | const { editing } = this.state |
| | | let { col, record, className } = this.props |
| | | const { editing, visible } = this.state |
| | | |
| | | let children = null |
| | | let colSpan = 1 |
| | |
| | | colSpan = 0 |
| | | } else { |
| | | if (editing) { |
| | | children = <Select |
| | | showSearch |
| | | defaultValue={record.subjectscode || ''} |
| | | dropdownClassName="edit-table-dropdown" |
| | | id={col.uuid + record.uuid} |
| | | onBlur={this.onBlur} |
| | | filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} |
| | | onSelect={this.onSelectChange} |
| | | > |
| | | {subjects.map((item, i) => (<Select.Option key={i} extra={item} value={item.subjectscode}>{item.subjectscode + ' ' + item.subjectsname}</Select.Option>))} |
| | | </Select> |
| | | let msg = window.GLOB.CacheVoucher.get(col.tableId) |
| | | let subjects = msg ? msg.subjects : [] |
| | | |
| | | children = <> |
| | | <Select |
| | | showSearch |
| | | defaultValue={record.subjectscode || ''} |
| | | dropdownClassName="edit-table-dropdown" |
| | | id={col.uuid + record.uuid} |
| | | onBlur={this.onSelectBlur} |
| | | filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} |
| | | onSelect={this.onSelectChange} |
| | | > |
| | | {subjects.map((item, i) => (<Select.Option key={i} extra={item} value={item.subjectscode}>{item.subjectscode + ' ' + item.subjectsname}</Select.Option>))} |
| | | </Select> |
| | | <Popover overlayClassName="subject-pop-wrap" placement="bottom" title="辅助核算" visible={visible} content={<Accounting confirm={this.confirm} cancel={this.cancel} tableId={col.tableId} data={record}/>}> |
| | | <span className="pop-anchor"></span> |
| | | </Popover> |
| | | </> |
| | | } else { |
| | | let val = '' |
| | | if (record.subjectscode) { |
| | | val = (record.subjectscode || '') + ' ' + (record.subjectsname || '') |
| | | |
| | | record.sup_accounting && record.sup_accounting.split(',').forEach(item => { |
| | | if (record[item]) { |
| | | val += '_' + record[item] |
| | | } |
| | | }) |
| | | } |
| | | children = <div className="content-wrap" onClick={this.focus}>{val}</div> |
| | | } |
| | |
| | | class VoucherTable extends Component { |
| | | static propTpyes = { |
| | | config: PropTypes.object, // 菜单Id |
| | | subjects: PropTypes.array, // 会计科目 |
| | | BID: PropTypes.any, // 主表ID |
| | | data: PropTypes.any, // 表格数据 |
| | | total: PropTypes.any, // 总数 |
| | |
| | | } |
| | | |
| | | UNSAFE_componentWillMount () { |
| | | const { config, subjects, data } = this.props |
| | | const { config, data } = this.props |
| | | |
| | | let columns = [ |
| | | { |
| | |
| | | width: '34%', |
| | | onCell: record => ({ |
| | | record, |
| | | subjects, |
| | | col: {uuid: 'subjectscode', field: 'subjectscode', tableId: config.uuid}, |
| | | }) |
| | | }, |
| | |
| | | UNSAFE_componentWillReceiveProps(nextProps) { |
| | | if (!is(fromJS(this.props.data), fromJS(nextProps.data))) { |
| | | this.resetData(fromJS(nextProps.data).toJS()) |
| | | } else if (!is(fromJS(this.props.subjects), fromJS(nextProps.subjects))) { |
| | | this.resetSubjects(nextProps.subjects) |
| | | } |
| | | } |
| | | |
| | | resetSubjects = (subjects) => { |
| | | const { config } = this.props |
| | | let columns = fromJS(this.state.columns).toJS() |
| | | |
| | | this.setState({ |
| | | columns: columns.map(col => { |
| | | if (col.key === 'subjectscode') { |
| | | return { |
| | | title: '会计科目', |
| | | dataIndex: 'subjectscode', |
| | | key: 'subjectscode', |
| | | width: '34%', |
| | | onCell: record => ({ |
| | | record, |
| | | subjects, |
| | | col: {uuid: 'subjectscode', field: 'subjectscode', tableId: config.uuid}, |
| | | }) |
| | | } |
| | | } |
| | | return col |
| | | }) |
| | | }) |
| | | } |
| | | |
| | | resetData = (data) => { |