| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { is, fromJS } from 'immutable' |
| | | import { Button, Select, Input, Modal, DatePicker, notification } from 'antd' |
| | | import { Button, Select, Input, Modal, DatePicker, notification, InputNumber } from 'antd' |
| | | import moment from 'moment' |
| | | |
| | | import Api from '@/api' |
| | | import Utils from '@/utils/utils.js' |
| | | import asyncComponent from '@/utils/asyncComponent' |
| | | import MKEmitter from '@/utils/events.js' |
| | | import './index.scss' |
| | | |
| | | const { confirm } = Modal |
| | | const { TextArea } = Input |
| | | const VoucherTable = asyncComponent(() => import('./voucherTable')) |
| | | |
| | | class VoucherModule extends Component { |
| | |
| | | tbdata: [], |
| | | typeOptions: [], |
| | | charType: '', |
| | | charName: '', |
| | | charInt: '', |
| | | vouDate: null, |
| | | book: null, |
| | | username: sessionStorage.getItem('User_Name'), |
| | | remark: '', |
| | | remarkVisible: false, |
| | | attachments: 0, |
| | | title: '', |
| | | delItems: [], |
| | | status: '' // 新建时,empty、change、saved |
| | | } |
| | | |
| | |
| | | |
| | | let param = { |
| | | func: 's_get_fcc_account_data', |
| | | account_code: book.account_code || '', |
| | | fcc_date: book.months ? book.months + '-01' : moment().format('YYYY-MM-DD') |
| | | // account_code: book.account_code || '', |
| | | fcc_date: book.months ? book.months + '-01' : moment().format('YYYY-MM-DD'), |
| | | BID: book.id |
| | | } |
| | | |
| | | Api.genericInterface(param).then(res => { |
| | |
| | | this.setState({ |
| | | typeOptions: typeOptions, |
| | | charType: typeOptions[0] ? typeOptions[0].voucher_class : '', |
| | | charName: typeOptions[0] ? typeOptions[0].voucher_char : '', |
| | | charInt: typeOptions[0] ? typeOptions[0].voucher_char_int : '', |
| | | }) |
| | | |
| | |
| | | department: department, |
| | | project: project, |
| | | inventory: inventory, |
| | | currency: res.currency || [], |
| | | employee: employee, |
| | | cash_flow: cash_flow, |
| | | orgcode: res.orgcode, |
| | | orgname: res.orgname, |
| | | account_code: res.account_code, |
| | | account_year_code: res.account_year_code |
| | | } |
| | | |
| | | window.GLOB.CacheVoucher.set(config.uuid, message) |
| | |
| | | } |
| | | |
| | | triggersave = (t) => { |
| | | const { tbdata } = this.state |
| | | const { tbdata, delItems } = this.state |
| | | |
| | | let err = '' |
| | | let tip = '' |
| | | let list = [] |
| | | let _Items = [...delItems] |
| | | |
| | | tbdata.forEach((line, index) => { |
| | | if (err) return |
| | |
| | | if (!line.remark && !line.subjectscode && !line.debtor && line.debtor !== 0 && !line.creditor && line.creditor !== 0) { |
| | | if (_index === 1) { |
| | | err = '第1行不可为空。' |
| | | } else if (line.$origin) { |
| | | _Items.push(line) |
| | | } |
| | | |
| | | return |
| | | } |
| | | |
| | |
| | | err = `第${_index}行,请输入金额。` |
| | | } else if (line.debtor === 0 || line.creditor === 0) { |
| | | err = `第${_index}行,金额不能为0。` |
| | | } else if (line.foreign_currency_type === 'Y' && !line.origin) { |
| | | err = `第${_index}行,原币不可为空或为0。` |
| | | } else if (line.sup_accounting) { |
| | | line.sup_accounting.split(',').forEach(item => { |
| | | if (!line[item]) { |
| | |
| | | confirm({ |
| | | content: tip + '确认要保存吗?', |
| | | onOk() { |
| | | _this.voucherSave(list, t) |
| | | _this.voucherSave(list, _Items, t) |
| | | }, |
| | | onCancel() {} |
| | | }) |
| | | } else { |
| | | this.voucherSave(list, t) |
| | | this.voucherSave(list, _Items, t) |
| | | } |
| | | } |
| | | |
| | | voucherSave = (list, t) => { |
| | | const { BID, config, charInt, charType, book } = this.state |
| | | voucherSave = (list, items, t) => { |
| | | const { config, charInt, charType, vouDate, book, remark, charName, attachments, title } = this.state |
| | | |
| | | if (!book) { |
| | | notification.warning({ |
| | |
| | | return |
| | | } |
| | | |
| | | let message = window.GLOB.CacheVoucher.get(config.uuid) || {} |
| | | |
| | | let param = { |
| | | func: 's_fcc_voucher_addupt', |
| | | BID: BID, |
| | | BID: book.id, |
| | | ID: Utils.getguid(), |
| | | voucher_code: '', |
| | | voucher_text: '', |
| | | remark: '', |
| | | account_year_code: '', |
| | | voucher_type: '', |
| | | voucher_type_text: '', |
| | | orgcode: '', |
| | | orgname: '', |
| | | voucher_class: '', |
| | | voucher_text: title, |
| | | remark: remark, |
| | | account_year_code: book.account_year_code || '', |
| | | voucher_type: config.wrap.voucherType || '', |
| | | voucher_type_text: config.wrap.voucherTypeText || '', |
| | | orgcode: message.orgcode || '', |
| | | orgname: message.orgname || '', |
| | | voucher_class: charType, |
| | | years: book.years, |
| | | business_type: '', |
| | | voucher_sign: '', |
| | | voucher_char: charType, |
| | | business_type: config.wrap.businessType || '', |
| | | voucher_sign: config.wrap.voucherSign || '', |
| | | voucher_char: charName, |
| | | voucher_char_int: charInt, |
| | | account_code: book.account_code || '', |
| | | fibvoucherdate: '', |
| | | fibvoucherdate: moment(vouDate).format('YYYY-MM-DD'), |
| | | UserName: sessionStorage.getItem('User_Name') || '', |
| | | FullName: sessionStorage.getItem('Full_Name') || '', |
| | | attachments_int: attachments, |
| | | sup_data: '', |
| | | subject_data: '' |
| | | } |
| | | |
| | | // subject_id,subject_voucher_code,voucher_lp,subject_code,subject_name |
| | | // ,subject_voucher_text,fcc_count,net_unitprice,unit,net_amount,direction_type |
| | | // ,exratecode,exratename,unitratio,sup_accounting ,direction_type_count,src_amount,deleted,local_exratecode |
| | | |
| | | // sup_id,sup_voucher_code,sup_voucher_lp,voucher_sup_lp,sup_subject_code,sup_subject_name,sup_voucher_text,sup_direction_type,sup_net_amount,customercode,customername,suppliercode,suppliername,co_pro_code,co_pro_name,workercode,workername,project_code,project_name,productcode,productname,cash_flow_code,cash_flow_name,sup_acc_code_01,sup_acc_name_01,sup_acc_code_02,sup_acc_name_02,sup_acc_code_03,sup_acc_name_03,sup_acc_code_04,sup_acc_name_04,sup_acc_code_05,sup_acc_name_05,sup_acc_code_06,sup_acc_name_06,sup_acc_code_07,sup_acc_name_07,sup_acc_code_08,sup_acc_name_08,sup_acc_code_09,sup_acc_name_09,sup_acc_code_10,sup_acc_name_10,sup_bid |
| | | |
| | | let sup_data = [] |
| | | |
| | | let subject_data = list.map(item => { |
| | | let count = item.count_type === 'Y' |
| | | let curr = item.foreign_currency_type === 'Y' |
| | | if (item.sup_accounting) { |
| | | item.sup_accounting.split(',').forEach(n => { |
| | | |
| | | }) |
| | | } |
| | | sup_data.push(`${item.uuid},sup_voucher_code,sup_voucher_lp,voucher_sup_lp,sup_subject_code,sup_subject_name,sup_voucher_text,sup_direction_type,sup_net_amount,customercode,customername,suppliercode,suppliername,co_pro_code,co_pro_name,workercode,workername,project_code,project_name,productcode,productname,cash_flow_code,cash_flow_name,sup_acc_code_01,sup_acc_name_01,sup_acc_code_02,sup_acc_name_02,sup_acc_code_03,sup_acc_name_03,sup_acc_code_04,sup_acc_name_04,sup_acc_code_05,sup_acc_name_05,sup_acc_code_06,sup_acc_name_06,sup_acc_code_07,sup_acc_name_07,sup_acc_code_08,sup_acc_name_08,sup_acc_code_09,sup_acc_name_09,sup_acc_code_10,sup_acc_name_10,sup_bid`) |
| | | return `${item.uuid},'','','${item.subjectscode}','${item.subjectsname}','${item.remark}',${count ? item.count || 0 : 0},${count ? item.price || 0 : 0},'${item.unit}',${item.debtor || item.creditor},'${item.debtor ? 'debit' : 'credit'}','${curr ? item.exratecode : '01010001'}','${curr ? item.exratename : 'CNY'}',${curr ? item.unitratio || 0 : 0},'${item.sup_accounting}',${item.debtor ? 1 : -1},${curr ? item.origin || 0 : 0},0,'${item.local_currency || ''}'` |
| | | }) |
| | | |
| | | items.forEach(item => { |
| | | let count = item.count_type === 'Y' |
| | | let curr = item.foreign_currency_type === 'Y' |
| | | subject_data.push(`${item.uuid},'','','${item.subjectscode}','${item.subjectsname}','${item.remark}',${count ? item.count || 0 : 0},${count ? item.price || 0 : 0},'${item.unit}',${item.debtor || item.creditor},'${item.debtor ? 'debit' : 'credit'}','${curr ? item.exratecode : '01010001'}','${curr ? item.exratename : 'CNY'}',${curr ? item.unitratio || 0 : 0},'${item.sup_accounting}',${item.debtor ? 1 : -1},${curr ? item.origin || 0 : 0},1,'${item.local_currency || ''}'`) |
| | | }) |
| | | |
| | | param.subject_data = window.btoa(window.encodeURIComponent(subject_data.join(';un'))) |
| | | |
| | | if (param) { |
| | | return |
| | | } |
| | | |
| | | Api.genericInterface(param).then(res => { |
| | |
| | | if (t === 'add') { |
| | | this.setState({ |
| | | status: 'empty', |
| | | remark: '', |
| | | tbdata: [], |
| | | delItems: [], |
| | | charInt: charInt + 1 |
| | | }) |
| | | MKEmitter.emit('cleartable', config.uuid) |
| | | } else { |
| | | this.setState({ |
| | | status: 'saved' |
| | | status: 'saved', |
| | | delItems: [], |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | triggerprint = () => { |
| | | |
| | | this.setState({remarkVisible: true}) |
| | | } |
| | | |
| | | dataChange = (data) => { |
| | | this.setState({ |
| | | status: 'change', |
| | | tbdata: data |
| | | }) |
| | | remarkSubmit = () => { |
| | | const { config } = this.state |
| | | let node = document.getElementById(config.uuid + 'remark') |
| | | let val = node.value |
| | | |
| | | if (val && val.length > 512) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: '当前内容超长,备注最多512个字符。', |
| | | duration: 5 |
| | | }) |
| | | return |
| | | } |
| | | this.setState({remark: val, remarkVisible: false}) |
| | | } |
| | | |
| | | dataChange = (data, item) => { |
| | | if (item) { |
| | | this.setState({ |
| | | status: 'change', |
| | | tbdata: data, |
| | | delItems: [...this.state.delItems, item] |
| | | }) |
| | | } else { |
| | | this.setState({ |
| | | status: 'change', |
| | | tbdata: data |
| | | }) |
| | | } |
| | | } |
| | | |
| | | changeAttach = (val) => { |
| | | let _val = val |
| | | |
| | | if (isNaN(val) || val < 0) { |
| | | _val = 0 |
| | | } else { |
| | | _val = parseInt(val) |
| | | } |
| | | |
| | | this.setState({attachments: _val}) |
| | | } |
| | | |
| | | render() { |
| | | const { type, status, loading, config, typeOptions, charType, charInt, data, vouDate, username } = this.state |
| | | const { type, status, loading, config, typeOptions, charType, charInt, data, vouDate, username, remark, remarkVisible, attachments, title } = this.state |
| | | |
| | | return ( |
| | | <div className="menu-voucher-wrap" style={config.style}> |
| | |
| | | <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})}> |
| | | <Select value={charType} dropdownClassName="mk-vcode-dropdown" onChange={(val, option) => this.setState({charType: val, charName: option.props.charName, charInt: option.props.charint})}> |
| | | {typeOptions.map(option => |
| | | <Select.Option key={option.voucher_char_int} value={option.voucher_class} charint={option.voucher_char_int}>{option.voucher_char}</Select.Option> |
| | | <Select.Option key={option.voucher_char_int} value={option.voucher_class} charName={option.voucher_char} charint={option.voucher_char_int}>{option.voucher_char}</Select.Option> |
| | | )} |
| | | </Select> |
| | | <Input value={charInt} autoComplete="off" onChange={(e) => this.setState({charInt: e.target.value})}/> 号 |
| | | <InputNumber precision={0} min={1} value={charInt} autoComplete="off" onChange={(val) => this.setState({charInt: val})}/> 号 |
| | | </div> |
| | | <div className="voucher-date"> |
| | | 日期:<DatePicker value={vouDate} onChange={(val) => this.setState({vouDate: val})}/> |
| | | </div> |
| | | <div className="voucher-text"> |
| | | <Input value={title} placeholder="凭证文本" autoComplete="off" onChange={(e) => this.setState({title: e.target.value})}/> |
| | | </div> |
| | | <div className="voucher-affix"> |
| | | 附单据 <Input autoComplete="off" /> 张 |
| | | 附单据 <InputNumber precision={0} value={attachments || 0} autoComplete="off" onChange={this.changeAttach}/> 张 |
| | | <Button type="link" className="" onClick={this.triggerprint}>附件</Button> |
| | | <Button type="link" className="" onClick={this.triggerprint}>备注</Button> |
| | | </div> |
| | |
| | | <VoucherTable config={config} loading={loading} data={data} onChange={this.dataChange}/> |
| | | </div> |
| | | <div className="user">制单人:{username}</div> |
| | | <Modal |
| | | title="备注" |
| | | visible={remarkVisible} |
| | | width={700} |
| | | maskClosable={false} |
| | | onOk={this.remarkSubmit} |
| | | onCancel={() => { this.setState({ remarkVisible: false })}} |
| | | destroyOnClose |
| | | > |
| | | <TextArea id={config.uuid + 'remark'} defaultValue={remark} rows={6}/> |
| | | </Modal> |
| | | </div> |
| | | ) |
| | | } |