| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { is, fromJS } from 'immutable' |
| | | import { Button, Select, Input, DatePicker, notification } from 'antd' |
| | | import { Button, Select, Input, Modal, DatePicker, notification } from 'antd' |
| | | import moment from 'moment' |
| | | |
| | | import Api from '@/api' |
| | |
| | | import MKEmitter from '@/utils/events.js' |
| | | import './index.scss' |
| | | |
| | | const { confirm } = Modal |
| | | const VoucherTable = asyncComponent(() => import('./voucherTable')) |
| | | |
| | | class VoucherModule extends Component { |
| | |
| | | |
| | | state = { |
| | | BID: '', |
| | | type: 'createVoucher', |
| | | config: null, |
| | | loading: false, |
| | | data: [], |
| | | disableAdd: false, |
| | | disableSave: false, |
| | | tbdata: [], |
| | | typeOptions: [], |
| | | charType: '', |
| | | charInt: '', |
| | | vouDate: null, |
| | | book: null, |
| | | username: sessionStorage.getItem('User_Name'), |
| | | change: false |
| | | status: '' // 新建时,empty、change、saved |
| | | } |
| | | |
| | | UNSAFE_componentWillMount () { |
| | |
| | | } |
| | | |
| | | window.GLOB.CacheVoucher.delete(config.uuid) |
| | | let type = config.wrap.type || 'createVoucher' |
| | | |
| | | this.setState({ |
| | | config: fromJS(config).toJS(), |
| | | type: type, |
| | | BID: BID || '', |
| | | status: 'empty', |
| | | book: window.GLOB.CacheData.get(config.wrap.supBook) || null |
| | | }, () => { |
| | | this.loadData() |
| | | this.getVoucher() |
| | | }) |
| | | } |
| | | |
| | |
| | | if (!config.wrap.supModule || config.wrap.supModule !== MenuID) return |
| | | if (id !== this.state.BID || id !== '') { |
| | | this.setState({ BID: id, BData: data }, () => { |
| | | this.loadData() |
| | | this.getVoucher() |
| | | }) |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | window.GLOB.CacheVoucher.set(config.uuid, message) |
| | | |
| | | setTimeout(() => { |
| | | this.getVoucher() |
| | | }, 200) |
| | | }) |
| | | } |
| | | |
| | | |
| | | getVoucher = () => { |
| | | const { BID, type } = this.state |
| | | |
| | | if (!BID || type === 'createVoucher' || type === 'createTemp') return |
| | | |
| | | let param = { |
| | | func: 's_get_fcc_voucher', |
| | | BID: BID |
| | | } |
| | | |
| | | let data = [ |
| | | {remark: '提现', subjectscode: '1001', subjectsname: '库存现金', debtor: 124, creditor: ''}, |
| | | {remark: '购入固定资产', subjectscode: '1001', subjectsname: '库存现金', debtor: '', creditor: 124}, |
| | |
| | | {remark: '提现', subjectscode: '1001', subjectsname: '库存现金', debtor: 34, creditor: '', i: Math.random()}, |
| | | ] |
| | | |
| | | this.setState({ |
| | | data: data |
| | | Api.genericInterface(param).then(res => { |
| | | if (!res.status) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: res.message, |
| | | duration: 5 |
| | | }) |
| | | return |
| | | } |
| | | |
| | | this.setState({ |
| | | data: data, |
| | | tbdata: fromJS(data).toJS() |
| | | }) |
| | | }) |
| | | } |
| | | |
| | | triggeradd = () => { |
| | | |
| | | triggersave = (t) => { |
| | | const { tbdata } = this.state |
| | | |
| | | let err = '' |
| | | let tip = '' |
| | | let list = [] |
| | | |
| | | tbdata.forEach((line, index) => { |
| | | if (err) return |
| | | if (line.type === 'total') { |
| | | if (line.debtor !== line.creditor) { |
| | | err = '借贷不平衡!' |
| | | } |
| | | return |
| | | } |
| | | |
| | | let _index = index + 1 |
| | | |
| | | if (!line.remark && !line.subjectscode && !line.debtor && line.debtor !== 0 && !line.creditor && line.creditor !== 0) { |
| | | if (_index === 1) { |
| | | err = '第1行不可为空。' |
| | | } |
| | | return |
| | | } |
| | | |
| | | if (!line.remark) { |
| | | err = `第${_index}行,摘要不可为空。` |
| | | } else if (!line.subjectscode) { |
| | | err = `第${_index}行,科目不可为空。` |
| | | } else if (!line.debtor && line.debtor !== 0 && !line.creditor && line.creditor !== 0) { |
| | | err = `第${_index}行,请输入金额。` |
| | | } else if (line.debtor === 0 || line.creditor === 0) { |
| | | err = `第${_index}行,金额不能为0。` |
| | | } else if (line.sup_accounting) { |
| | | line.sup_accounting.split(',').forEach(item => { |
| | | if (!line[item]) { |
| | | err = `第${_index}行,请选择辅助核算。` |
| | | } |
| | | }) |
| | | } |
| | | |
| | | if (line.count_type === 'Y' && !err) { |
| | | if (!line.count) { |
| | | tip += `第${_index}行,数量为空或为0!;` |
| | | } else if (line.price) { |
| | | if (line.debtor && line.debtor !== line.count * line.price) { |
| | | tip += `第${_index}行,数量和金额不匹配!;` |
| | | } else if (line.creditor && line.creditor !== line.count * line.price) { |
| | | tip += `第${_index}行,数量和金额不匹配!;` |
| | | } |
| | | } |
| | | } |
| | | |
| | | list.push(line) |
| | | }) |
| | | |
| | | if (!err && list.length === 0) { |
| | | err = '第1行不可为空。' |
| | | } |
| | | |
| | | if (err) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: err, |
| | | duration: 5 |
| | | }) |
| | | return |
| | | } |
| | | |
| | | if (tip) { |
| | | const _this = this |
| | | confirm({ |
| | | content: tip + '确认要保存吗?', |
| | | onOk() { |
| | | _this.voucherSave(list, t) |
| | | }, |
| | | onCancel() {} |
| | | }) |
| | | } else { |
| | | this.voucherSave(list, t) |
| | | } |
| | | } |
| | | |
| | | triggersave = () => { |
| | | voucherSave = (list, t) => { |
| | | const { BID, config, charInt, charType, book } = this.state |
| | | |
| | | if (!book) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: '请选择账套!', |
| | | duration: 5 |
| | | }) |
| | | return |
| | | } |
| | | |
| | | let param = { |
| | | func: 's_fcc_voucher_addupt', |
| | | BID: BID, |
| | | voucher_code: '', |
| | | voucher_text: '', |
| | | remark: '', |
| | | account_year_code: '', |
| | | voucher_type: '', |
| | | voucher_type_text: '', |
| | | orgcode: '', |
| | | orgname: '', |
| | | voucher_class: '', |
| | | years: book.years, |
| | | business_type: '', |
| | | voucher_sign: '', |
| | | voucher_char: charType, |
| | | voucher_char_int: charInt, |
| | | account_code: book.account_code || '', |
| | | fibvoucherdate: '', |
| | | UserName: sessionStorage.getItem('User_Name') || '', |
| | | FullName: sessionStorage.getItem('Full_Name') || '', |
| | | sup_data: '', |
| | | subject_data: '' |
| | | } |
| | | |
| | | Api.genericInterface(param).then(res => { |
| | | if (!res.status) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: res.message, |
| | | duration: 5 |
| | | }) |
| | | return |
| | | } |
| | | |
| | | if (t === 'add') { |
| | | this.setState({ |
| | | status: 'empty', |
| | | tbdata: [], |
| | | charInt: charInt + 1 |
| | | }) |
| | | MKEmitter.emit('cleartable', config.uuid) |
| | | } else { |
| | | this.setState({ |
| | | status: 'saved' |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | triggerprint = () => { |
| | | |
| | | } |
| | | |
| | | dataChange = (data) => { |
| | | this.setState({ |
| | | status: 'change', |
| | | tbdata: data |
| | | }) |
| | | } |
| | | |
| | | render() { |
| | | const { config, disableSave, disableAdd, typeOptions, charType, charInt, data, vouDate, username } = this.state |
| | | const { type, status, loading, config, typeOptions, charType, charInt, data, vouDate, username } = this.state |
| | | |
| | | return ( |
| | | <div className="menu-voucher-wrap" style={config.style}> |
| | | <div className="voucher-header"> |
| | | <Button className="add-background header-btn" disabled={disableAdd} onClick={this.triggeradd}>新增</Button> |
| | | <Button className="add-background header-btn" disabled={disableSave} onClick={this.triggersave}>保存</Button> |
| | | <Button className="print-background header-btn" disabled={disableSave} onClick={this.triggerprint}>打印</Button> |
| | | <Button className="system-background header-btn" disabled={disableSave} onClick={this.triggerprint}>导入</Button> |
| | | <Button className="out-background header-btn" disabled={disableSave} onClick={this.triggerprint}>导出</Button> |
| | | </div> |
| | | {config.wrap.type === 'edit' ? <div className="voucher-body"> |
| | | <div className="pre-wrap"> |
| | | {type === 'createVoucher' ? <div className="voucher-header"> |
| | | <Button className="add-background header-btn" disabled={status === 'empty'} onClick={() => this.triggersave('add')}>保存并新增</Button> |
| | | <Button className="add-background header-btn" disabled={status === 'empty' || status === 'saved'} onClick={() => this.triggersave()}>保存</Button> |
| | | <Button className="print-background header-btn" disabled={status !== 'saved'} onClick={this.triggerprint}>打印</Button> |
| | | <Button className="out-background header-btn" onClick={this.triggerprint}>更多</Button> |
| | | </div> : null} |
| | | <div className="voucher-body"> |
| | | {type === 'createVoucher' ? <div className="pre-wrap"> |
| | | <div className="voucher-code"> |
| | | <Select value={charType} dropdownClassName="mk-vcode-dropdown" onChange={(val, option) => this.setState({charType: val, charInt: option.props.charint})}> |
| | | {typeOptions.map(option => |
| | |
| | | <Button type="link" className="" onClick={this.triggerprint}>附件</Button> |
| | | <Button type="link" className="" onClick={this.triggerprint}>备注</Button> |
| | | </div> |
| | | </div> |
| | | <VoucherTable config={config} data={data}/> |
| | | </div> : null} |
| | | {config.wrap.type === 'check' ? <div className="voucher-body"> |
| | | <div className="pre-wrap"> |
| | | <div className="voucher-code"> |
| | | 记 1 号 |
| | | </div> |
| | | <div className="voucher-date"> |
| | | 日期:2022-02-24 |
| | | </div> |
| | | <div className="voucher-affix"> |
| | | 附单据 2 张 |
| | | <Button type="link" className="" onClick={this.triggerprint}>附件</Button> |
| | | <Button type="link" className="" onClick={this.triggerprint}>备注</Button> |
| | | </div> |
| | | </div> |
| | | <VoucherTable config={config} data={data}/> |
| | | </div> : null} |
| | | </div> : null} |
| | | <VoucherTable config={config} loading={loading} data={data} onChange={this.dataChange}/> |
| | | </div> |
| | | <div className="user">制单人:{username}</div> |
| | | </div> |
| | | ) |