From 326aa6b3effaccc71cfe0775d47b0f29eb3695a6 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期日, 25 八月 2024 00:36:40 +0800 Subject: [PATCH] 2024-08-25 --- src/tabviews/custom/components/module/voucher/index.jsx | 765 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 692 insertions(+), 73 deletions(-) diff --git a/src/tabviews/custom/components/module/voucher/index.jsx b/src/tabviews/custom/components/module/voucher/index.jsx index 2932113..6e9f250 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 = { @@ -36,12 +37,19 @@ username: sessionStorage.getItem('User_Name'), remark: '', attachments: 0, + vouAduited: false, + vouReadOnly: false, attachlist: [], + oriAttachs: [], + tempTypes: [], + tempTypeClass: '', + tempTypeName: '', title: '', orgcode: '', orgname: '', status: '', // 鏂板缓鏃讹紝empty銆乧hange銆乻aved - saved: false + saved: false, + voucherCode: '' } UNSAFE_componentWillMount () { @@ -49,7 +57,7 @@ let BID = '' let BData = '' - + if (config.wrap.supModule) { BData = window.GLOB.CacheData.get(config.wrap.supModule) } else { @@ -74,11 +82,14 @@ } } + // config.wrap.type = 'checkVoucher' + // BID = '20230228173542370E2F4FC1773704C29A6A4' + + // 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 +188,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 || [] }) } @@ -195,6 +208,8 @@ let employee = [] let cash_flow = [] let others = [] + let logistics = [] + let lessor = [] res.sup && res.sup.forEach(item => { names[item.sup_type_code] = item.sup_type_name @@ -202,6 +217,14 @@ res.supplier && res.supplier.forEach(item => { supplier.push({value: item.suppliercode, label: item.suppliername}) + }) + + res.logistics && res.logistics.forEach(item => { + logistics.push({value: item.logistics_code, label: item.logistics_name}) + }) + + res.lessor && res.lessor.forEach(item => { + lessor.push({value: item.lessor_code, label: item.lessor_name}) }) res.customer && res.customer.forEach(item => { @@ -236,6 +259,8 @@ subjects: res.subjects || [], names: names, supplier: supplier, + logistics: logistics, + lessor: lessor, customer: customer, department: department, project: project, @@ -263,6 +288,10 @@ ID: BID } + if (type === 'checkTemp') { + param.func = 's_get_fcc_voucher_temp' + } + Api.genericInterface(param).then(res => { if (!res.status) { notification.warning({ @@ -275,6 +304,7 @@ let data = [] if (res.voucher) { + let disabled = res.voucher_status === 'true' data = res.voucher.map(line => { line.uuid = line.subject_id || '' @@ -291,6 +321,7 @@ line.exratename = line.foreign_exratename || '' line.local_currency = line.local_exratecode || '' line.foreign_currency_type = line.foreign_type || '' + line.$disabled = disabled if (line.sup) { line.supAccounts = line.sup.map(cell => { @@ -304,17 +335,49 @@ }) } - 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 || 'keeping', + vouAduited: res.voucher_status === 'true' || res.read_only === 'true', + vouReadOnly: res.read_only === 'true', + 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: res.copy_type === 'true' ? 'copy' : 'saved' + }) + } else { + this.setState({ + data: data, + tbdata: fromJS(data).toJS(), + title: res.voucher_text || '', + tempTypeClass: res.typechartwo || '', + tempTypeName: res.typecharthree || '', + status: 'saved' + }) + } }) } @@ -360,6 +423,14 @@ line.supAccounts.forEach(item => { if (item.sup_acc_type === 'supplier') { if (!item.suppliercode || !item.suppliername) { + err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 + } + } else if (item.sup_acc_type === 'logistics') { + if (!item.logistics_code || !item.logistics_name) { + err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 + } + } else if (item.sup_acc_type === 'lessor') { + if (!item.lessor_code || !item.lessor_name) { err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 } } else if (item.sup_acc_type === 'customer') { @@ -421,11 +492,11 @@ } if (tip) { - const _this = this + const that = this confirm({ content: tip + '纭瑕佷繚瀛樺悧锛�', onOk() { - _this.voucherSave(list, t) + that.voucherSave(list, t) }, onCancel() {} }) @@ -435,7 +506,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 +529,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 || '', @@ -539,10 +610,10 @@ 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},'${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`) + 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},'${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,'${n.lessor_code || ''}','${n.lessor_name || ''}','${n.logistics_code || ''}','${n.logistics_name || ''}'`) }) } - 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},'${direct}','${curr ? item.exratecode : '01010001'}','${curr ? item.exratename : 'CNY'}',${curr ? item.unitratio || 0 : 0},'${item.sup_accounting}',${item.debit ? 1 : -1},${curr ? item.foreign_amount || 0 : 0},0,'${item.local_currency || ''}','${count ? 'Y' : ''}','${curr ? 'Y' : ''}'` + 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},'${direct}','${curr ? item.exratecode : ''}','${curr ? item.exratename : ''}',${curr ? item.unitratio || 0 : 0},'${item.sup_accounting}',${item.debit ? 1 : -1},${curr ? item.foreign_amount || 0 : 0},0,'${item.local_currency || ''}','${count ? 'Y' : ''}','${curr ? 'Y' : ''}','${item.closing_foreign_exchange || ''}'` }) if (type === 'createVoucher') { @@ -558,15 +629,33 @@ let curr = item.foreign_currency_type === 'Y' let direct = item.debit ? '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},'${direct}','${curr ? item.exratecode : '01010001'}','${curr ? item.exratename : 'CNY'}',${curr ? item.unitratio || 0 : 0},'${item.sup_accounting}',${item.debit ? 1 : -1},${curr ? item.foreign_amount || 0 : 0},1,'${item.local_currency || ''}','${count ? 'Y' : ''}','${curr ? 'Y' : ''}'`) + 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},'${direct}','${curr ? item.exratecode : ''}','${curr ? item.exratename : ''}',${curr ? item.unitratio || 0 : 0},'${item.sup_accounting}',${item.debit ? 1 : -1},${curr ? item.foreign_amount || 0 : 0},1,'${item.local_currency || ''}','${count ? 'Y' : ''}','${curr ? 'Y' : ''}','${item.closing_foreign_exchange || ''}'`) }) 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`) + 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,'${n.lessor_code || ''}','${n.lessor_name || ''}','${n.logistics_code || ''}','${n.logistics_name || ''}'`) }) + + 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 +678,7 @@ status: 'empty', remark: '', tbdata: [], + oriAttachs: fromJS(attachlist).toJS(), charInt: res.voucher_char_int + 1, BID: Utils.getguid(), saved: false @@ -599,14 +689,273 @@ status: 'saved', charInt: res.voucher_char_int || charInt, data: fromJS(list).toJS(), + oriAttachs: fromJS(attachlist).toJS(), saved: true }) + } + + let tabId = '' + if (config.wrap.linkmenu && config.wrap.linkmenu.length > 0) { + tabId = config.wrap.linkmenu[config.wrap.linkmenu.length - 1] + } + + if (tabId) { + MKEmitter.emit('reloadMenuView', tabId) } }) } - triggerprint = () => { + 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 === 'logistics') { + if (!item.logistics_code || !item.logistics_name) { + err = `绗�${_index}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙 + } + } else if (item.sup_acc_type === 'lessor') { + if (!item.lessor_code || !item.lessor_name) { + 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, config, 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,'${n.lessor_code || ''}','${n.lessor_name || ''}','${n.logistics_code || ''}','${n.logistics_name || ''}'`) + }) + } + 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 : ''}','${curr ? item.exratename : ''}',${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' : ''}','${item.closing_foreign_exchange || ''}'` + }) + + 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 : ''}','${curr ? item.exratename : ''}',${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' : ''}','${item.closing_foreign_exchange || ''}'`) + }) + + 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,'${n.lessor_code || ''}','${n.lessor_name || ''}','${n.logistics_code || ''}','${n.logistics_name || ''}'`) + }) + + 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(), + }) + } + + let tabId = '' + if (config.wrap.linkmenu && config.wrap.linkmenu.length > 0) { + tabId = config.wrap.linkmenu[config.wrap.linkmenu.length - 1] + } + + if (tabId) { + MKEmitter.emit('reloadMenuView', tabId) + } + }) } dataChange = (data) => { @@ -625,12 +974,13 @@ _val = parseInt(val) } - this.setState({attachments: _val}) + this.setState({attachments: _val, status: 'change'}) } changeVouDate = (val) => { const { type, status, saved } = this.state - this.setState({vouDate: val}) + + this.setState({vouDate: val, status: 'change'}) if (type === 'createVoucher' && val && !saved && (status === 'empty' || status === 'change')) { this.updateVoucherChar(val) @@ -696,57 +1046,326 @@ }) } - triggermore = () => { + 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({status: 'change', attachlist: vals, attachments: num}) } 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' + }) + }) + } + + triggerPrint = () => { + const { config, BID } = this.state + + if (!config.wrap.printTemp) { + notification.warning({ + top: 92, + message: '灏氭湭璁剧疆鎵撳嵃妯℃澘锛�', + duration: 5 + }) + return + } + + window.open('#/billprint/' + window.btoa(window.encodeURIComponent(JSON.stringify({ id: BID, tempId: config.wrap.printTemp, pageId: config.$pageId || '', dataM: sessionStorage.getItem('dataM') })))) + } + + triggerAduit = () => { + const { book, BID, voucherCode, username } = this.state + + if (!book) { + notification.warning({ + top: 92, + message: '璇烽�夋嫨璐﹀锛�', + duration: 5 + }) + return + } + + let param = { + func: 's_fcc_voucher_sub', + ID: BID, + status: 10, + statusname: '宸插鏍�', + voucher_code: voucherCode || '', + username: username, + fullname: sessionStorage.getItem('Full_Name') || '' + } + + const that = this + + confirm({ + content: '纭畾瑕佸鏍稿悧锛�', + onOk() { + Api.genericInterface(param).then(res => { + if (!res.status) { + notification.warning({ + top: 92, + message: res.message, + duration: 5 + }) + return + } + + notification.success({ + top: 92, + message: '宸茬粡閫氳繃瀹℃牳', + duration: 2 + }) + + that.getVoucher() + }) + }, + onCancel() {} + }) + } + + triggerUnAduit = () => { + const { book, BID, voucherCode, username } = this.state + + if (!book) { + notification.warning({ + top: 92, + message: '璇烽�夋嫨璐﹀锛�', + duration: 5 + }) + return + } + + let param = { + func: 's_fcc_voucher_sub', + ID: BID, + status: 0, + statusname: '鍙栨秷瀹℃牳', + voucher_code: voucherCode || '', + username: username, + fullname: sessionStorage.getItem('Full_Name') || '' + } + + const that = this + + confirm({ + content: '纭瑕佸彇娑堝鏍稿悧锛�', + onOk() { + Api.genericInterface(param).then(res => { + if (!res.status) { + notification.warning({ + top: 92, + message: res.message, + duration: 5 + }) + return + } + + notification.success({ + top: 92, + message: '瀹℃牳宸插彇娑�', + duration: 2 + }) + + that.getVoucher() + }) + }, + onCancel() {} + }) } 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, vouAduited, vouReadOnly, voucherCode } = this.state - return ( - <div className="menu-voucher-wrap" style={config.style}> - {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.triggermore}>鏇村</Button> - </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"> - {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})}> - {typeOptions.map(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> - <InputNumber precision={0} min={1} value={charInt} autoComplete="off" onChange={(val) => this.setState({charInt: val})}/> 鍙� + if (type === 'checkVoucher') { + return ( + <div className="menu-voucher-wrap" style={config.style}> + <div className="voucher-header" style={{padding: `10px ${config.wrap.space || 0}px`}}> + {!vouAduited ? <Button disabled={status === 'empty' || status === 'saved'} onClick={() => this.triggersave()}>淇濆瓨</Button> : null} + {/* <PrintVoucher ID={config.uuid + 'print'} data={data} orgname={orgname} vouDate={vouDate} charName={charName} charInt={charInt} attachments={attachments} disabled={status !== 'saved'}/> */} + <Button disabled={status !== 'saved'} onClick={this.triggerPrint}>鎵撳嵃</Button> + {vouAduited && !vouReadOnly ? <Button onClick={this.triggerUnAduit}>鍙栨秷瀹℃牳</Button> : null} + {!vouAduited && !vouReadOnly ? <Button onClick={this.triggerAduit}>瀹℃牳</Button> : null} + <Button onClick={this.triggerclose}>鍏抽棴</Button> + </div> + <div className="voucher-body" style={{padding: `0px ${config.wrap.space || 0}px`}}> + <div className="pre-wrap"> + <div className="voucher-number"> + 鍑瘉鍙凤細{voucherCode} + </div> + <div className="voucher-code"> + <Select value={charType} disabled={vouAduited} dropdownClassName="mk-vcode-dropdown" onChange={(val, option) => this.setState({status: 'change', charType: val, charName: option.props.charname, charInt: option.props.charint})}> + {typeOptions.map(option => + <Select.Option key={option.id} value={option.voucher_class} charname={option.voucher_char} charint={option.voucher_char_int}>{option.voucher_char}</Select.Option> + )} + </Select> + <InputNumber precision={0} min={1} disabled={vouAduited} value={charInt} autoComplete="off" onChange={(val) => this.setState({status: 'change', charInt: val})}/> 鍙� + </div> + <div className="voucher-date"> + 鏃ユ湡锛�<DatePicker value={vouDate} disabled={vouAduited} onChange={this.changeVouDate}/> + </div> + <div className="voucher-text"> + <Input value={title} placeholder={vouAduited ? '' : '鍑瘉鏂囨湰'} disabled={vouAduited} autoComplete="off" onChange={(e) => this.setState({status: 'change', title: e.target.value})}/> + </div> + <div className="voucher-affix"> + 闄勫崟鎹� <InputNumber precision={0} disabled={vouAduited} value={attachments || 0} autoComplete="off" onChange={this.changeAttach}/> 寮� + <ResetAttach config={config} disabled={vouAduited} orgcode={orgcode} voucherCode={this.state.voucherCode} attachlist={attachlist} onChange={this.resetAttachList}/> + <ResetRemark remark={remark} disabled={vouAduited} ID={config.uuid + 'remark'} onChange={(val) => this.setState({status: 'change', remark: val})}/> + </div> </div> - <div className="voucher-date"> - 鏃ユ湡锛�<DatePicker value={vouDate} onChange={this.changeVouDate}/> - </div> - <div className="voucher-text"> - <Input value={title} placeholder="鍑瘉鏂囨湰" autoComplete="off" onChange={(e) => this.setState({title: e.target.value})}/> - </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})}/> - <ResetRemark remark={remark} ID={config.uuid + 'remark'} onChange={(val) => this.setState({remark: val})}/> - </div> - </div> : null} - <VoucherTable config={config} loading={loading} data={data} onChange={this.dataChange}/> + <VoucherTable config={config} loading={loading} data={data} onChange={this.dataChange}/> + </div> + <div className="user" style={{paddingLeft: `${config.wrap.space || 0}px`}}>鍒跺崟浜猴細{username}</div> </div> - <div className="user">鍒跺崟浜猴細{username}</div> - </div> - ) + ) + } else if (type === 'createVoucher') { + return ( + <div className="menu-voucher-wrap" style={config.style}> + <div className="voucher-header" style={{padding: `10px ${config.wrap.space || 0}px`}}> + <Button disabled={status === 'empty'} onClick={() => this.triggersave('add')}>淇濆瓨骞舵柊澧�</Button> + <Button disabled={status === 'empty' || status === 'saved'} onClick={() => this.triggersave()}>淇濆瓨</Button> + <Button disabled={status !== 'saved'} onClick={this.triggerPrint}>鎵撳嵃</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={['hover']} placement="bottomCenter"> + <Button>鏇村</Button> + </Dropdown> + </div> + <div className="voucher-body" style={{padding: `0px ${config.wrap.space || 0}px`}}> + <div className="pre-wrap"> + <div className="voucher-code"> + <Select value={charType} dropdownClassName="mk-vcode-dropdown" onChange={(val, option) => this.setState({status: 'change', charType: val, charName: option.props.charname, charInt: option.props.charint})}> + {typeOptions.map(option => + <Select.Option key={option.id} value={option.voucher_class} charname={option.voucher_char} charint={option.voucher_char_int}>{option.voucher_char}</Select.Option> + )} + </Select> + <InputNumber precision={0} min={1} value={charInt} autoComplete="off" onChange={(val) => this.setState({status: 'change', charInt: val})}/> 鍙� + </div> + <div className="voucher-date"> + 鏃ユ湡锛�<DatePicker value={vouDate} onChange={this.changeVouDate}/> + </div> + <div className="voucher-text"> + <Input value={title} placeholder="鍑瘉鏂囨湰" autoComplete="off" onChange={(e) => this.setState({status: 'change', title: e.target.value})}/> + </div> + <div className="voucher-affix"> + 闄勫崟鎹� <InputNumber precision={0} value={attachments || 0} autoComplete="off" onChange={this.changeAttach}/> 寮� + <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({status: 'change', remark: val})}/> + </div> + </div> + <VoucherTable config={config} loading={loading} data={data} onChange={this.dataChange}/> + </div> + <div className="user" style={{paddingLeft: `${config.wrap.space || 0}px`}}>鍒跺崟浜猴細{username}</div> + </div> + ) + } else { + return ( + <div className="menu-voucher-wrap" style={config.style}> + <div className="voucher-body" style={{padding: `0px ${config.wrap.space || 0}px`}}> + <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 onClick={() => this.triggerTempsave()}>淇濆瓨</Button> + <Button onClick={this.triggerclose}>鍏抽棴</Button> + </div> + </div> + <VoucherTable config={config} loading={loading} data={data} onChange={this.dataChange}/> + </div> + </div> + ) + } } } -- Gitblit v1.8.0