king
2023-01-31 90fff0ec484bbb3a10248f389cb9c4bddeff93ed
src/tabviews/custom/components/module/voucher/index.jsx
@@ -1,7 +1,7 @@
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'
@@ -9,6 +9,7 @@
import MKEmitter from '@/utils/events.js'
import './index.scss'
const { confirm } = Modal
const VoucherTable = asyncComponent(() => import('./voucherTable'))
class VoucherModule extends Component {
@@ -18,18 +19,18 @@
  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 () {
@@ -48,13 +49,16 @@
    }
    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()
    })
  }
@@ -97,7 +101,7 @@
    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()
      })
    }
  }
@@ -185,15 +189,19 @@
      }
      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},
@@ -201,37 +209,192 @@
      {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 =>
@@ -248,25 +411,9 @@
              <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>
    )