king
2023-02-06 0a775d67b17400de3bbac4767d5ea25e6f0d14f9
src/tabviews/custom/components/module/voucher/index.jsx
@@ -1,15 +1,17 @@
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 {
@@ -26,10 +28,16 @@
    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
  }
@@ -113,8 +121,9 @@
    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 => {
@@ -132,6 +141,7 @@
      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 : '',
      })
@@ -184,8 +194,13 @@
        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)
@@ -227,11 +242,12 @@
  }
  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
@@ -247,7 +263,10 @@
      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
      }
@@ -259,6 +278,8 @@
        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]) {
@@ -300,17 +321,17 @@
      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({
@@ -321,29 +342,65 @@
      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 => {
@@ -359,31 +416,70 @@
      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}>
@@ -396,18 +492,21 @@
        <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>
@@ -415,6 +514,17 @@
          <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>
    )
  }