From 3620d67cfd2f2af19ef4d656734badd4445c90b8 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期二, 14 二月 2023 18:35:16 +0800 Subject: [PATCH] 2023-02-14 --- src/tabviews/custom/components/module/voucher/index.jsx | 469 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 441 insertions(+), 28 deletions(-) diff --git a/src/tabviews/custom/components/module/voucher/index.jsx b/src/tabviews/custom/components/module/voucher/index.jsx index 2932113..b5cef0f 100644 --- a/src/tabviews/custom/components/module/voucher/index.jsx +++ b/src/tabviews/custom/components/module/voucher/index.jsx @@ -1,19 +1,20 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import { is, fromJS } from 'immutable' -import { Button, Select, Input, Modal, DatePicker, notification, InputNumber } from 'antd' +import { Button, Select, Input, Modal, DatePicker, notification, InputNumber, Dropdown } 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 VoucherTable from './voucherTable' +import SaveAsTemp from './saveAsTemp' +import ResetRemark from './resetRemark' +import ResetAttach from './resetAttach' +import LoadFromTemp from './loadFromTemp' import './index.scss' const { confirm } = Modal -const VoucherTable = asyncComponent(() => import('./voucherTable')) -const ResetRemark = asyncComponent(() => import('./resetRemark')) -const ResetAttach = asyncComponent(() => import('./resetAttach')) class VoucherModule extends Component { static propTpyes = { @@ -37,11 +38,16 @@ remark: '', attachments: 0, attachlist: [], + oriAttachs: [], + tempTypes: [], + tempTypeClass: '', + tempTypeName: '', title: '', orgcode: '', orgname: '', status: '', // 鏂板缓鏃讹紝empty銆乧hange銆乻aved - saved: false + saved: false, + voucherCode: '' } UNSAFE_componentWillMount () { @@ -74,11 +80,14 @@ } } + // config.wrap.type = 'checkVoucher' + // BID = '20230214130744811P0K95RQ155KG0QIQOFV' + + // config.wrap.type = 'checkTemp' + // BID = '20230214174458780MFR8IA576ON4VKNOLVH' + window.GLOB.CacheVoucher.delete(config.uuid) let type = config.wrap.type || 'createVoucher' - - // type = 'checkVoucher' - // BID = '202302081418373862P8Q29OUD19CT1AVMU6' if (type === 'createVoucher' || type === 'createTemp') { BID = Utils.getguid() @@ -177,12 +186,14 @@ charInt: charInt, orgcode: res.orgcode, orgname: res.orgname, + tempTypes: res.temp_type || [] }) } else { this.setState({ typeOptions: typeOptions, orgcode: res.orgcode, orgname: res.orgname, + tempTypes: res.temp_type || [] }) } @@ -263,6 +274,10 @@ ID: BID } + if (type === 'checkTemp') { + param.func = 's_get_fcc_voucher_temp' + } + Api.genericInterface(param).then(res => { if (!res.status) { notification.warning({ @@ -304,17 +319,47 @@ }) } - this.setState({ - data: data, - vouDate: res.fibvoucherdate ? moment(res.fibvoucherdate, 'YYYY-MM-DD') : null, - charType: res.voucher_class, - charName: res.voucher_char, - charInt: res.voucher_char_int, - // orgcode: res.orgcode, - // orgname: res.orgname, - tbdata: fromJS(data).toJS(), - status: 'saved' - }) + if (type !== 'checkTemp') { + let files = [] + + res.fcc_files && res.fcc_files.forEach(file => { + file.attachments.forEach(item => { + item.id = item.attach_id + item.data_code = file.data_code + item.data_name = file.data_name + item.BID = file.id + + files.push(item) + }) + }) + + this.setState({ + data: data, + attachlist: files, + vouDate: res.fibvoucherdate ? moment(res.fibvoucherdate, 'YYYY-MM-DD') : null, + charType: res.voucher_class, + charName: res.voucher_char, + charInt: res.voucher_char_int, + // orgcode: res.orgcode, + // orgname: res.orgname, + voucherCode: res.voucher_code || '', + tbdata: fromJS(data).toJS(), + oriAttachs: fromJS(files).toJS(), + attachments: res.attachments_int, + title: res.voucher_text || '', + remark: res.remark || '', + status: 'saved' + }) + } else { + this.setState({ + data: data, + tbdata: fromJS(data).toJS(), + title: res.voucher_text || '', + tempTypeClass: res.typechartwo || '', + tempTypeName: res.typecharthree || '', + status: 'saved' + }) + } }) } @@ -435,7 +480,7 @@ } voucherSave = (list, t) => { - const { type, data, config, charInt, charType, vouDate, book, remark, charName, attachments, title, orgcode, orgname } = this.state + const { type, BID, data, config, voucherCode, charInt, charType, vouDate, book, remark, charName, attachments, title, orgcode, orgname, attachlist, oriAttachs } = this.state let err = '' if (!book) { @@ -458,8 +503,8 @@ let param = { func: 's_fcc_voucher_addupt', BID: book.id, - ID: Utils.getguid(), - voucher_code: '', + ID: BID, + voucher_code: voucherCode || '', voucher_text: title, remark: remark, account_year_code: book.account_year_code || '', @@ -565,8 +610,26 @@ sup_data.push(`'${n.uuid}','${n.sup_voucher_code}','${n.sup_voucher_lp}','${n.voucher_sup_lp || ''}','${n.sup_subject_code}','${n.sup_subject_name}','${n.sup_voucher_text || ''}','${n.sup_direct}',${n.sup_net_amount},'${n.customercode || ''}','${n.customername || ''}','${n.suppliercode || ''}','${n.suppliername || ''}','${n.co_pro_code || ''}','${n.co_pro_name || ''}','${n.workercode || ''}','${n.workername || ''}','${n.project_code || ''}','${n.project_name || ''}','${n.productcode || ''}','${n.productname || ''}','${n.cash_flow_code || ''}','${n.cash_flow_name || ''}','${n.sup_acc_code || ''}','${n.sup_acc_name || ''}','${n.sup_acc_type || ''}','${n.sup_bid}',1`) }) + let attachments_data = [] + let ids = [] + + attachlist.forEach(item => { + ids.push(item.id) + + attachments_data.push(`'${item.id}',0`) + }) + + if (oriAttachs.length > 0) { + oriAttachs.forEach(item => { + if (!ids.includes(item.id)) { + attachments_data.push(`'${item.id}',1`) + } + }) + } + param.subject_data = window.btoa(window.encodeURIComponent(subject_data.join(';un'))) param.sup_data = window.btoa(window.encodeURIComponent(sup_data.join(';un'))) + param.attachments_data = window.btoa(window.encodeURIComponent(attachments_data.join(';un'))) Api.genericInterface(param).then(res => { if (!res.status) { @@ -589,6 +652,7 @@ status: 'empty', remark: '', tbdata: [], + oriAttachs: fromJS(attachlist).toJS(), charInt: res.voucher_char_int + 1, BID: Utils.getguid(), saved: false @@ -599,7 +663,244 @@ status: 'saved', charInt: res.voucher_char_int || charInt, data: fromJS(list).toJS(), + oriAttachs: fromJS(attachlist).toJS(), saved: true + }) + } + }) + } + + triggerTempsave = (name, typeChar, typeName) => { + const { tbdata } = this.state + + let err = '' + let list = [] + + tbdata.forEach((line, index) => { + if (err) return + + let _index = index + 1 + + if (!line.subject_voucher_text && !line.subject_code) { + if (_index === 1) { + err = '绗�1琛屼笉鍙负绌恒��' + } + + return + } + + if (!line.subject_voucher_text) { + err = `绗�${_index}琛岋紝鎽樿涓嶅彲涓虹┖銆俙 + } else if (!line.subject_code) { + err = `绗�${_index}琛岋紝绉戠洰涓嶅彲涓虹┖銆俙 + } else if (line.sup_accounting && !line.supAccounts) { + err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 + } else if (line.sup_accounting && line.supAccounts) { + line.supAccounts.forEach(item => { + if (item.sup_acc_type === 'supplier') { + if (!item.suppliercode || !item.suppliername) { + err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 + } + } else if (item.sup_acc_type === 'customer') { + if (!item.customercode || !item.customername) { + err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 + } + } else if (item.sup_acc_type === 'department') { + if (!item.co_pro_code || !item.co_pro_name) { + err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 + } + } else if (item.sup_acc_type === 'project') { + if (!item.projectcode || !item.projectname) { + err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 + } + } else if (item.sup_acc_type === 'inventory') { + if (!item.productcode || !item.productname) { + err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 + } + } else if (item.sup_acc_type === 'employee') { + if (!item.workercode || !item.workername) { + err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 + } + } else if (item.sup_acc_type === 'cash_flow') { + if (!item.cash_flow_code || !item.cash_flow_name) { + err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 + } + } else if (!item.sup_acc_type || !item.sup_acc_code || !item.sup_acc_name) { + err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 + } + }) + } + + list.push(line) + }) + + if (!err && list.length === 0) { + err = '绗�1琛屼笉鍙负绌恒��' + } + + if (err) { + notification.warning({ + top: 92, + message: err, + duration: 5 + }) + return + } + + this.voucherTempSave(list, name, typeChar, typeName) + } + + voucherTempSave = (list, name, typeChar, typeName) => { + const { type, BID, data, book, title, orgcode, orgname, tempTypeClass, tempTypeName } = this.state + + if (!book) { + notification.warning({ + top: 92, + message: '璇烽�夋嫨璐﹀锛�', + duration: 5 + }) + return + } else if (type !== 'createVoucher' && !title) { + notification.warning({ + top: 92, + message: '璇峰~鍐欐ā鏉垮悕绉帮紒', + duration: 5 + }) + return + } else if (type !== 'createVoucher' && !tempTypeClass) { + notification.warning({ + top: 92, + message: '璇烽�夋嫨妯℃澘绫诲瀷锛�', + duration: 5 + }) + return + } + + let id = BID + let _name = title + let _typeChar = tempTypeClass + let _typeName = tempTypeName + + if (type === 'createVoucher') { + id = Utils.getguid() + _name = name + _typeChar = typeChar + _typeName = typeName + } + + let param = { + func: 's_fcc_voucher_addupt_temp', + BID: book.id, + ID: id, + voucher_code: '', + voucher_text: _name, + remark: '', + account_year_code: book.account_year_code || '', + voucher_type: 'fcc_temp', + voucher_type_text: '鍑瘉妯℃澘', + orgcode: orgcode || '', + orgname: orgname || '', + voucher_class: 'temp', + years: book.years, + months: moment().format('YYYY-MM'), + business_type: '', + voucher_sign: 'temp', + voucher_char: '', + voucher_char_int: 0, + account_code: book.account_code || '', + fibvoucherdate: moment().format('YYYY-MM-DD'), + UserName: sessionStorage.getItem('User_Name') || '', + FullName: sessionStorage.getItem('Full_Name') || '', + attachments_int: 0, + typechartwo: _typeChar, + typecharthree: _typeName, + sup_data: '', + subject_data: '' + } + + let sup_data = [] + let voucherMap = new Map() + let supMap = new Map() + + if (type !== 'createVoucher') { + data.forEach(item => { + voucherMap.set(item.uuid, item) + + if (item.sup_accounting && item.supAccounts) { + item.supAccounts.forEach(cell => { + if (!cell.sup_acc_type) return + + let _cell = {...cell} + + _cell.sup_voucher_code = item.subject_voucher_code || '' + _cell.sup_voucher_lp = item.voucher_lp || '' + _cell.sup_subject_code = item.subject_code || '' + _cell.sup_subject_name = item.subject_name || '' + _cell.sup_bid = item.uuid || '' + _cell.sup_direct = !item.credit ? 'debit' : 'credit' + _cell.sup_net_amount = item.debit || item.credit || 0 + + supMap.set(item.uuid + cell.sup_acc_type, _cell) + }) + } + }) + } + + let subject_data = list.map(item => { + let count = item.count_type === 'Y' + let curr = item.foreign_currency_type === 'Y' + let direct = !item.credit ? 'debit' : 'credit' + + if (voucherMap.has(item.uuid)) { + voucherMap.delete(item.uuid) + } + if (item.sup_accounting && item.supAccounts) { + item.supAccounts.forEach(n => { + if (supMap.has(item.uuid + n.sup_acc_type)) { + supMap.delete(item.uuid + n.sup_acc_type) + } + + sup_data.push(`'${n.uuid}','${item.subject_voucher_code || ''}','${item.voucher_lp || ''}','${n.voucher_sup_lp || ''}','${item.subject_code}','${item.subject_name}','${n.sup_voucher_text || ''}','${direct}',${item.debit || item.credit || 0},'${n.customercode || ''}','${n.customername || ''}','${n.suppliercode || ''}','${n.suppliername || ''}','${n.co_pro_code || ''}','${n.co_pro_name || ''}','${n.workercode || ''}','${n.workername || ''}','${n.project_code || ''}','${n.project_name || ''}','${n.productcode || ''}','${n.productname || ''}','${n.cash_flow_code || ''}','${n.cash_flow_name || ''}','${n.sup_acc_code || ''}','${n.sup_acc_name || ''}','${n.sup_acc_type || ''}','${item.uuid}',0`) + }) + } + return `'${item.uuid}','${item.subject_voucher_code || ''}','${item.voucher_lp || ''}','${item.subject_code}','${item.subject_name}','${item.subject_voucher_text || ''}',${count ? item.fcc_count || 0 : 0},${count ? item.net_unitprice || 0 : 0},'${item.unit}',${item.debit || item.credit || 0},'${direct}','${curr ? item.exratecode : '01010001'}','${curr ? item.exratename : 'CNY'}',${curr ? item.unitratio || 0 : 0},'${item.sup_accounting}',${item.direct ? 1 : -1},${curr ? item.foreign_amount || 0 : 0},0,'${item.local_currency || ''}','${count ? 'Y' : ''}','${curr ? 'Y' : ''}'` + }) + + voucherMap.forEach(item => { + let count = item.count_type === 'Y' + let curr = item.foreign_currency_type === 'Y' + let direct = !item.credit ? 'debit' : 'credit' + + subject_data.push(`'${item.uuid}','${item.subject_voucher_code || ''}','${item.voucher_lp || ''}','${item.subject_code}','${item.subject_name}','${item.subject_voucher_text || ''}',${count ? item.fcc_count || 0 : 0},${count ? item.net_unitprice || 0 : 0},'${item.unit}',${item.debit || item.credit || 0},'${direct}','${curr ? item.exratecode : '01010001'}','${curr ? item.exratename : 'CNY'}',${curr ? item.unitratio || 0 : 0},'${item.sup_accounting}',${item.direct ? 1 : -1},${curr ? item.foreign_amount || 0 : 0},1,'${item.local_currency || ''}','${count ? 'Y' : ''}','${curr ? 'Y' : ''}'`) + }) + + supMap.forEach(n => { + sup_data.push(`'${n.uuid}','${n.sup_voucher_code}','${n.sup_voucher_lp}','${n.voucher_sup_lp || ''}','${n.sup_subject_code}','${n.sup_subject_name}','${n.sup_voucher_text || ''}','${n.sup_direct}',${n.sup_net_amount},'${n.customercode || ''}','${n.customername || ''}','${n.suppliercode || ''}','${n.suppliername || ''}','${n.co_pro_code || ''}','${n.co_pro_name || ''}','${n.workercode || ''}','${n.workername || ''}','${n.project_code || ''}','${n.project_name || ''}','${n.productcode || ''}','${n.productname || ''}','${n.cash_flow_code || ''}','${n.cash_flow_name || ''}','${n.sup_acc_code || ''}','${n.sup_acc_name || ''}','${n.sup_acc_type || ''}','${n.sup_bid}',1`) + }) + + param.subject_data = window.btoa(window.encodeURIComponent(subject_data.join(';un'))) + param.sup_data = window.btoa(window.encodeURIComponent(sup_data.join(';un'))) + + Api.genericInterface(param).then(res => { + if (!res.status) { + notification.warning({ + top: 92, + message: res.message, + duration: 5 + }) + return + } + + notification.success({ + top: 92, + message: '淇濆瓨鎴愬姛锛�', + duration: 5 + }) + + if (type !== 'createVoucher') { + this.setState({ + status: 'saved', + data: fromJS(list).toJS(), }) } }) @@ -696,16 +997,105 @@ }) } + resetAttachList = (vals) => { + const { attachlist } = this.state + let num = this.state.attachments + + if (num) { + num = num + (vals.length - attachlist.length) + } else { + num = vals.length + } + + if (num < 0) { + num = 0 + } + + this.setState({attachlist: vals, attachments: num}) + } + triggermore = () => { } triggerclose = () => { + const { config, status } = this.state + if (status === 'change') { + confirm({ + content: '鍐呭宸插彉鏇达紝纭畾瑕佸叧闂悧锛�', + onOk() { + MKEmitter.emit('closeTabView', config.$pageId) + }, + onCancel() {} + }) + } else { + MKEmitter.emit('closeTabView', config.$pageId) + } + } + + triggerTempLoad = (id) => { + const { book } = this.state + + if (!book) return + + let param = { + func: 's_get_fcc_voucher_temp', + BID: book.id, + ID: id + } + + Api.genericInterface(param).then(res => { + if (!res.status) { + notification.warning({ + top: 92, + message: res.message, + duration: 5 + }) + return + } + + let data = [] + if (res.voucher) { + data = res.voucher.map(line => { + line.uuid = line.subject_id || '' + + if (line.direction_type === 'credit') { + line.credit = line.net_amount || 0 + line.debit = '' + } else { + line.debit = line.net_amount || 0 + line.credit = '' + } + + line.unitratio = line.foreign_unitratio || 0 + line.exratecode = line.foreign_exratecode || '' + line.exratename = line.foreign_exratename || '' + line.local_currency = line.local_exratecode || '' + line.foreign_currency_type = line.foreign_type || '' + + if (line.sup) { + line.supAccounts = line.sup.map(cell => { + cell.uuid = cell.sup_id + return cell + }) + delete line.sup + } + + return line + }) + } + + this.setState({ + data: data, + tbdata: fromJS(data).toJS(), + status: 'change' + }) + }) } render() { - const { type, status, book, loading, config, orgcode, typeOptions, charType, charInt, data, vouDate, username, remark, attachments, title, attachlist } = this.state + const { type, status, loading, config, orgcode, typeOptions, tempTypes, charType, charInt, data, vouDate, username, remark, attachments, title, attachlist, tempTypeClass } = this.state return ( <div className="menu-voucher-wrap" style={config.style}> @@ -713,14 +1103,20 @@ <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.triggermore}>鏇村</Button> + <Dropdown overlay={<div className="mk-voucher-dropdown-wrap"> + <SaveAsTemp tempTypes={tempTypes} onChange={this.triggerTempsave}/> + <div className="split"></div> + <LoadFromTemp tempTypes={tempTypes} onChange={this.triggerTempLoad}/> + </div>} trigger={['click']}> + <Button className="out-background header-btn" onClick={this.triggermore}>鏇村</Button> + </Dropdown> </div> : null} {type === 'checkVoucher' ? <div className="voucher-header"> <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.triggerclose}>鍏抽棴</Button> </div> : null} - <div className="voucher-body"> + <div className="voucher-body" style={{padding: `0px ${config.wrap.space || 0}px`}}> {type === 'createVoucher' || type === 'checkVoucher' ? <div className="pre-wrap"> <div className="voucher-code"> <Select value={charType} dropdownClassName="mk-vcode-dropdown" onChange={(val, option) => this.setState({charType: val, charName: option.props.charName, charInt: option.props.charint})}> @@ -738,13 +1134,30 @@ </div> <div className="voucher-affix"> 闄勫崟鎹� <InputNumber precision={0} value={attachments || 0} autoComplete="off" onChange={this.changeAttach}/> 寮� - <ResetAttach config={config} book={book} orgcode={orgcode} attachlist={attachlist} onChange={(vals) => this.setState({attachlist: vals})}/> + <ResetAttach config={config} orgcode={orgcode} voucherCode={this.state.voucherCode} attachlist={attachlist} onChange={this.resetAttachList}/> <ResetRemark remark={remark} ID={config.uuid + 'remark'} onChange={(val) => this.setState({remark: val})}/> + </div> + </div> : null} + {type === 'createTemp' || type === 'checkTemp' ? <div className="pre-temp-wrap"> + <div className="temp-text"> + <span>妯℃澘鍚嶇О锛�</span><Input value={title} placeholder="妯℃澘鍚嶇О" autoComplete="off" onChange={(e) => this.setState({title: e.target.value})}/> + </div> + <div className="temp-text"> + <span>妯℃澘绫诲瀷锛�</span> + <Select value={tempTypeClass} dropdownClassName="mk-vcode-dropdown" onChange={(val, option) => this.setState({tempTypeClass: val, tempTypeName: option.props.children})}> + {tempTypes.map(option => + <Select.Option key={option.data_code} value={option.data_code}>{option.data_name}</Select.Option> + )} + </Select> + </div> + <div className="temp-action"> + <Button className="add-background header-btn" onClick={() => this.triggerTempsave()}>淇濆瓨</Button> + <Button className="out-background header-btn" onClick={this.triggerclose}>鍏抽棴</Button> </div> </div> : null} <VoucherTable config={config} loading={loading} data={data} onChange={this.dataChange}/> </div> - <div className="user">鍒跺崟浜猴細{username}</div> + {type === 'createVoucher' || type === 'checkVoucher' ? <div className="user">鍒跺崟浜猴細{username}</div> : null} </div> ) } -- Gitblit v1.8.0