king
2025-05-13 1779677cece5864b62a65df4b01a4a69496e149a
src/tabviews/custom/components/module/voucher/index.jsx
@@ -12,10 +12,8 @@
import ResetRemark from './resetRemark'
import ResetAttach from './resetAttach'
import LoadFromTemp from './loadFromTemp'
import asyncComponent from '@/utils/asyncComponent'
import './index.scss'
const PrintVoucher = asyncComponent(() => import('./printVoucher'))
const { confirm } = Modal
class VoucherModule extends Component {
@@ -39,6 +37,8 @@
    username: sessionStorage.getItem('User_Name'),
    remark: '',
    attachments: 0,
    vouAduited: false,
    vouReadOnly: false,
    attachlist: [],
    oriAttachs: [],
    tempTypes: [],
@@ -304,6 +304,7 @@
      let data = []
      if (res.voucher) {
        let disabled = res.voucher_status === 'true'
        data = res.voucher.map(line => {
          line.uuid = line.subject_id || ''
@@ -320,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 => {
@@ -351,7 +353,9 @@
          data: data,
          attachlist: files,
          vouDate: res.fibvoucherdate ? moment(res.fibvoucherdate, 'YYYY-MM-DD') : null,
          charType: res.voucher_class,
          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,
@@ -488,11 +492,11 @@
    }
    if (tip) {
      const _this = this
      const that = this
      confirm({
        content: tip + '确认要保存吗?',
        onOk() {
          _this.voucherSave(list, t)
          that.voucherSave(list, t)
        },
        onCancel() {}
      })
@@ -563,7 +567,7 @@
    let sup_data = []
    let voucherMap = new Map()
    let supMap = new Map()
    let extract = localStorage.getItem(window.GLOB.host + '_voucher_extract')
    let extract = localStorage.getItem(window.GLOB.sysSign + '_voucher_extract')
    extract = extract ? JSON.parse(extract) : []
    data.forEach(item => {
@@ -617,7 +621,7 @@
      if (extract.length > 20) {
        extract.length = 20
      }
      localStorage.setItem(window.GLOB.host + '_voucher_extract', JSON.stringify(extract))
      localStorage.setItem(window.GLOB.sysSign + '_voucher_extract', JSON.stringify(extract))
    }
    voucherMap.forEach(item => {
@@ -696,7 +700,7 @@
      }
      if (tabId) {
        MKEmitter.emit('reloadMenuView', tabId, 'table')
        MKEmitter.emit('reloadMenuView', tabId)
      }
    })
  }
@@ -949,7 +953,7 @@
      }
      if (tabId) {
        MKEmitter.emit('reloadMenuView', tabId, 'table')
        MKEmitter.emit('reloadMenuView', tabId)
      }
    })
  }
@@ -1059,10 +1063,6 @@
    this.setState({status: 'change', attachlist: vals, attachments: num})
  }
  triggermore = () => {
  }
  triggerclose = () => {
    const { config, status } = this.state
@@ -1139,72 +1139,233 @@
    })
  }
  render() {
    const { type, status, loading, config, orgcode, orgname, typeOptions, tempTypes, charType, charName, charInt, data, vouDate, username, remark, attachments, title, attachlist, tempTypeClass } = this.state
  triggerPrint = () => {
    const { config, BID } = 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>
          <PrintVoucher ID={config.uuid + 'print'} data={data} orgname={orgname} vouDate={vouDate} charName={charName} charInt={charInt} attachments={attachments} disabled={status !== 'saved'}/>
          <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>
          <PrintVoucher ID={config.uuid + 'print'} data={data} orgname={orgname} vouDate={vouDate} charName={charName} charInt={charInt} attachments={attachments} disabled={status !== 'saved'}/>
          <Button className="out-background header-btn" onClick={this.triggerclose}>关闭</Button>
        </div> : null}
        <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({status: 'change', 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({status: 'change', charInt: val})}/> 号
    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, loading, config, orgcode, typeOptions, tempTypes, charType, charInt, data, vouDate, username, remark, attachments, title, attachlist, tempTypeClass, vouAduited, vouReadOnly, voucherCode } = this.state
    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({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> : 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="save-temp header-btn" onClick={() => this.triggerTempsave()}>保存</Button>
              <Button className="close-temp header-btn" onClick={this.triggerclose}>关闭</Button>
            </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>
        {type === 'createVoucher' || type === 'checkVoucher' ? <div className="user">制单人:{username}</div> : null}
      </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>
      )
    }
  }
}