From feb1479b80e84e11d1008e87765593e6f5468622 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期二, 13 五月 2025 11:18:28 +0800
Subject: [PATCH] 2025-05-13

---
 src/tabviews/custom/components/module/voucher/index.jsx | 1320 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 1,255 insertions(+), 65 deletions(-)

diff --git a/src/tabviews/custom/components/module/voucher/index.jsx b/src/tabviews/custom/components/module/voucher/index.jsx
index e423749..fb67d1d 100644
--- a/src/tabviews/custom/components/module/voucher/index.jsx
+++ b/src/tabviews/custom/components/module/voucher/index.jsx
@@ -1,15 +1,20 @@
 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, InputNumber, Dropdown } from 'antd'
 import moment from 'moment'
 
 import Api from '@/api'
-import asyncComponent from '@/utils/asyncComponent'
+import Utils from '@/utils/utils.js'
 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 VoucherTable = asyncComponent(() => import('./voucherTable'))
+const { confirm } = Modal
 
 class VoucherModule extends Component {
   static propTpyes = {
@@ -18,13 +23,33 @@
 
   state = {
     BID: '',
+    type: 'createVoucher',
     config: null,
     loading: false,
-    data: null,
-    disableAdd: false,
-    disableSave: false,
+    data: [],
+    tbdata: [],
     typeOptions: [],
-    book: null
+    charType: '',
+    charName: '',
+    charInt: '',
+    vouDate: null,
+    book: null,
+    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,
+    voucherCode: ''
   }
 
   UNSAFE_componentWillMount () {
@@ -32,7 +57,7 @@
 
     let BID = ''
     let BData = ''
-
+    
     if (config.wrap.supModule) {
       BData = window.GLOB.CacheData.get(config.wrap.supModule)
     } else {
@@ -42,12 +67,44 @@
       BID = BData.$BID || ''
     }
 
+    let book = null
+    let vouDate = null
+    if (config.wrap.supBook) {
+      book = window.GLOB.CacheData.get(config.wrap.supBook) || null
+
+      if (book) {
+        let month = book.months
+        vouDate = moment()
+  
+        if (month && month < moment().format('YYYY-MM')) {
+          vouDate = moment(month, 'YYYY-MM').endOf('month')
+        }
+      }
+    }
+
+    // config.wrap.type = 'checkVoucher'
+    // BID = '20230228173542370E2F4FC1773704C29A6A4'
+
+    // config.wrap.type = 'checkTemp'
+    // BID = '20230214174458780MFR8IA576ON4VKNOLVH'
+
+    window.GLOB.CacheVoucher.delete(config.uuid)
+    let type = config.wrap.type || 'createVoucher'
+
+    if (type === 'createVoucher' || type === 'createTemp') {
+      BID = Utils.getguid()
+    }
+
     this.setState({
+      book: book,
+      vouDate: vouDate,
       config: fromJS(config).toJS(),
+      type: type,
       BID: BID || '',
-      book: window.GLOB.CacheData.get(config.wrap.supBook) || null
+      status: 'empty'
     }, () => {
       this.loadData()
+      this.getVoucher()
     })
   }
 
@@ -71,32 +128,43 @@
   }
 
   resetParentParam = (MenuID, id, data) => {
-    const { config } = this.state
+    const { config, type } = this.state
 
     if (config.wrap.supBook === MenuID) {
-      this.setState({ book: data }, () => {
+      let month = data.months
+      let vouDate = moment()
+
+      if (month && month < moment().format('YYYY-MM')) {
+        vouDate = moment(month, 'YYYY-MM').endOf('month')
+      }
+
+      this.setState({ book: data, vouDate }, () => {
         this.loadData()
+        this.getVoucher()
       })
       return
     }
 
-    if (!config.wrap.supModule || config.wrap.supModule !== MenuID) return
+    if (!config.wrap.supModule || config.wrap.supModule !== MenuID || type === 'createVoucher' || type === 'createTemp') return
     if (id !== this.state.BID || id !== '') {
-      this.setState({ BID: id, BData: data }, () => {
-        this.loadData()
+      this.setState({ BID: id }, () => {
+        this.getVoucher()
       })
     }
   }
 
   loadData = () => {
-    const { book } = this.state
+    const { book, config, type } = this.state
 
     if (!book) return
 
     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'),
+      account_year_code: book.account_year_code || '',
+      months: book.months ? book.months : moment().format('YYYY-MM'),
+      BID: book.id
     }
 
     Api.genericInterface(param).then(res => {
@@ -109,73 +177,1195 @@
         return
       }
 
+      let typeOptions = res.char || []
+      if (type === 'createVoucher') {
+        let charInt = typeOptions[0] ? typeOptions[0].voucher_char_int + 1 : 1
+
+        this.setState({
+          typeOptions: typeOptions,
+          charType: typeOptions[0] ? typeOptions[0].voucher_class : '',
+          charName: typeOptions[0] ? typeOptions[0].voucher_char : '',
+          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 || []
+        })
+      }
+
+      let names = {}
+      let supplier = []
+      let customer = []
+      let department = []
+      let project = []
+      let inventory = []
+      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
+      })
+
+      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 => {
+        customer.push({value: item.customercode, label: item.customername})
+      })
       
+      res.co_pro && res.co_pro.forEach(item => {
+        department.push({value: item.co_pro_code, label: item.co_pro_name})
+      })
+        
+      res.pm && res.pm.forEach(item => {
+        project.push({value: item.projectcode, label: item.projectname})
+      })
+        
+      res.materiel && res.materiel.forEach(item => {
+        inventory.push({value: item.productcode, label: item.productname})
+      })
+        
+      res.workers && res.workers.forEach(item => {
+        employee.push({value: item.workercode, label: item.workername})
+      })
+        
+      res.cash_flow && res.cash_flow.forEach(item => {
+        cash_flow.push({value: item.cash_flow_code, label: item.cash_flow_name})
+      })
+
+      res.others && res.others.forEach(item => {
+        others.push({value: item.sup_acc_code, label: item.sup_acc_name, parentId: item.sup_acc_type})
+      })
+
+      let message = {
+        subjects: res.subjects || [],
+        names: names,
+        supplier: supplier,
+        logistics: logistics,
+        lessor: lessor,
+        customer: customer,
+        department: department,
+        project: project,
+        inventory: inventory,
+        currency: res.currency || [],
+        employee: employee,
+        cash_flow: cash_flow,
+        others: others,
+        account_code: res.account_code,
+        account_year_code: res.account_year_code
+      }
+
+      window.GLOB.CacheVoucher.set(config.uuid, message)
     })
   }
 
-  triggeradd = () => {
+  getVoucher = () => {
+    const { book, BID, type } = this.state
+
+    if (!book || !BID || type === 'createVoucher' || type === 'createTemp') return
+
+    let param = {
+      func: 's_get_fcc_voucher',
+      BID: book.id,
+      ID: BID
+    }
+
+    if (type === 'checkTemp') {
+      param.func = 's_get_fcc_voucher_temp'
+    }
+
+    Api.genericInterface(param).then(res => {
+      if (!res.status) {
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
+        })
+        return
+      }
+
+      let data = []
+      if (res.voucher) {
+        let disabled = res.voucher_status === 'true'
+        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 || ''
+          line.$disabled = disabled
+
+          if (line.sup) {
+            line.supAccounts = line.sup.map(cell => {
+              cell.uuid = cell.sup_id
+              return cell
+            })
+            delete line.sup
+          }
+
+          return line
+        })
+      }
+
+      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'
+        })
+      }
+    })
+  }
+
+  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.debit !== line.credit) {
+          err = '鍊熻捶涓嶅钩琛★紒'
+        }
+        return
+      }
+
+      let _index = index + 1
+
+      if (!line.subject_voucher_text && !line.subject_code && !line.debit && line.debit !== 0 && !line.credit && line.credit !== 0) {
+        if (_index === 1) {
+          err = '绗�1琛屼笉鍙负绌恒��'
+        }
+
+        return
+      }
+
+      if (!line.subject_voucher_text) {
+        err = `绗�${_index}琛岋紝鎽樿涓嶅彲涓虹┖銆俙
+      } else if (!line.subject_code) {
+        err = `绗�${_index}琛岋紝绉戠洰涓嶅彲涓虹┖銆俙
+      } else if (!line.debit && line.debit !== 0 && !line.credit && line.credit !== 0) {
+        err = `绗�${_index}琛岋紝璇疯緭鍏ラ噾棰濄�俙
+      } else if (line.debit === 0 || line.credit === 0) {
+        err = `绗�${_index}琛岋紝閲戦涓嶈兘涓�0銆俙
+      } else if (line.foreign_currency_type === 'Y' && !line.foreign_amount) {
+        err = `绗�${_index}琛岋紝鍘熷竵涓嶅彲涓虹┖鎴栦负0銆俙
+      } 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}琛岋紝璇烽�夋嫨杈呭姪鏍哥畻銆俙
+          }
+        })
+      }
+
+      if (line.count_type === 'Y' && !err) {
+        if (!line.fcc_count) {
+          tip += `绗�${_index}琛岋紝鏁伴噺涓虹┖鎴栦负0锛侊紱`
+        } else if (line.net_unitprice) {
+          if (line.debit && line.debit !== line.fcc_count * line.net_unitprice) {
+            tip += `绗�${_index}琛岋紝鏁伴噺鍜岄噾棰濅笉鍖归厤锛侊紱`
+          } else if (line.credit && line.credit !== line.fcc_count * line.net_unitprice) {
+            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 that = this
+      confirm({
+        content: tip + '纭瑕佷繚瀛樺悧锛�',
+        onOk() {
+          that.voucherSave(list, t)
+        },
+        onCancel() {}
+      })
+    } else {
+      this.voucherSave(list, t)
+    }
+  }
+
+  voucherSave = (list, t) => {
+    const { type, BID, data, config, voucherCode, charInt, charType, vouDate, book, remark, charName, attachments, title, orgcode, orgname, attachlist, oriAttachs } = this.state
+
+    let err = ''
+    if (!book) {
+      err = '璇烽�夋嫨璐﹀锛�'
+    } else if (!vouDate) {
+      err = '璇烽�夋嫨鏃ユ湡锛�'
+    } else if (!charName || !charInt) {
+      err = '璇烽�夋嫨鍑瘉鍙凤紒'
+    }
+
+    if (err) {
+      notification.warning({
+        top: 92,
+        message: err,
+        duration: 5
+      })
+      return
+    }
+
+    let param = {
+      func: 's_fcc_voucher_addupt',
+      BID: book.id,
+      ID: BID,
+      voucher_code: voucherCode || '',
+      voucher_text: title,
+      remark: remark,
+      account_year_code: book.account_year_code || '',
+      voucher_type: config.wrap.voucherType || '',
+      voucher_type_text: config.wrap.voucherTypeText || '',
+      orgcode: orgcode || '',
+      orgname: orgname || '',
+      voucher_class: charType,
+      years: book.years,
+      months: moment(vouDate).format('YYYY-MM'),
+      business_type: config.wrap.businessType || '',
+      voucher_sign: config.wrap.voucherSign || '',
+      voucher_char: charName,
+      voucher_char_int: charInt,
+      account_code: book.account_code || '',
+      fibvoucherdate: moment(vouDate).format('YYYY-MM-DD'),
+      UserName: sessionStorage.getItem('User_Name') || '',
+      FullName: sessionStorage.getItem('Full_Name') || '',
+      attachments_int: attachments,
+      sup_data: '',
+      subject_data: '',
+      attachments_data: ''
+    }
+
+    // id,deleted
+    // 闄勪欢鍒楄〃
+
+    // 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,sup_acc_name,sup_acc_type,sup_bid,deleted
+    // 杈呭姪绉戠洰琛宨d锛屾柊澧炴椂绌猴紝鍑瘉琛屽彿绌猴紝杈呭姪绉戠洰琛屽彿绌猴紝绉戠洰缂栫爜锛岀鐩悕绉帮紝杈呭姪绉戠洰鎽樿绌猴紝鏂瑰悜'debit'銆�'credit'锛岃閲戦锛屽鎴风紪鐮侊紝瀹㈡埛鍚嶇О锛屼緵搴斿晢缂栫爜锛屼緵搴斿晢鍚嶇О锛岄儴闂ㄧ紪鐮侊紝閮ㄩ棬鍚嶇О锛岃亴鍛樼紪鐮侊紝鑱屽憳鍚嶇О锛岄」鐩紪鐮侊紝椤圭洰鍚嶇О锛屼骇鍝佺紪鐮侊紝浜у搧鍚嶇О锛岀幇閲戠紪鐮侊紝鐜伴噾鍚嶇О锛岃嚜瀹氫箟绉戠洰缂栫爜锛岃嚜瀹氫箟绉戠洰鍚嶇О锛岃緟鍔╃鐩被鍨嬶紝鍑瘉琛孖D锛屽垹闄ゆ爣璁�
     
+    let sup_data = []
+    let voucherMap = new Map()
+    let supMap = new Map()
+    let extract = localStorage.getItem(window.GLOB.sysSign + '_voucher_extract')
+    extract = extract ? JSON.parse(extract) : []
+
+    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.debit ? 'debit' : 'credit'
+          _cell.sup_net_amount = item.debit || item.credit
+
+          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.debit ? 'debit' : 'credit'
+      
+      if (type === 'createVoucher' && item.subject_voucher_text && item.subject_voucher_text.length < 20) {
+        extract.unshift(item.subject_voucher_text)
+      }
+
+      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},'${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 : ''}','${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') {
+      extract = Array.from(new Set(extract))
+      if (extract.length > 20) {
+        extract.length = 20
+      }
+      localStorage.setItem(window.GLOB.sysSign + '_voucher_extract', JSON.stringify(extract))
+    }
+
+    voucherMap.forEach(item => {
+      let count = item.count_type === 'Y'
+      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 : ''}','${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,'${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) {
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
+        })
+        return
+      }
+
+      notification.success({
+        top: 92,
+        message: '淇濆瓨鎴愬姛锛�' + (res.voucher_char_int !== charInt ? charInt + '鍙峰嚟璇佸彿宸茬粡瀛樺湪锛屽凡涓烘偍鏇存柊涓�' + res.voucher_char_int + '鍙峰嚟璇併��'  : ''),
+        duration: 5
+      })
+
+      if (t === 'add') {
+        this.setState({
+          status: 'empty',
+          remark: '',
+          tbdata: [],
+          oriAttachs: fromJS(attachlist).toJS(),
+          charInt: res.voucher_char_int + 1,
+          BID: Utils.getguid(),
+          saved: false
+        })
+        MKEmitter.emit('cleartable', config.uuid)
+      } else {
+        this.setState({
+          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)
+      }
+    })
   }
 
-  triggersave = () => {
+  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)
   }
 
-  triggerprint = () => {
+  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) => {
+    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, status: 'change'})
+  }
+
+  changeVouDate = (val) => {
+    const { type, status, saved } = this.state
+
+    this.setState({vouDate: val, status: 'change'})
+
+    if (type === 'createVoucher' && val && !saved && (status === 'empty' || status === 'change')) {
+      this.updateVoucherChar(val)
+    }
+  }
+
+  updateVoucherChar = (val) => {
+    const { book, config } = this.state
+
+    if (!book) return
+
+    let param = {
+      func: 's_get_fcc_account_data',
+      search_type: 'Y',
+      fcc_date: book.months ? book.months + '-01' : moment().format('YYYY-MM-DD'),
+      account_year_code: book.account_year_code || '',
+      months: moment(val).format('YYYY-MM'),
+      BID: book.id
+    }
+
+    Api.genericInterface(param).then(res => {
+      if (!res.status) {
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
+        })
+        return
+      }
+
+      let typeOptions = res.char || []
+
+      if (typeOptions.length > 0) {
+        let charType = this.state.charType
+        let charName = this.state.charName
+        let charInt = this.state.charInt
+  
+        if (charType && typeOptions.filter(n => n.voucher_class === charType) > 0) {
+          typeOptions.forEach(n => {
+            if (n.voucher_class === charType) {
+              charName = n.voucher_char
+              charInt = n.voucher_char_int + 1
+            }
+          })
+        } else {
+          charType = typeOptions[0].voucher_class
+          charName = typeOptions[0].voucher_char
+          charInt = typeOptions[0].voucher_char_int + 1
+        }
+
+        this.setState({
+          typeOptions: typeOptions,
+          charType: charType,
+          charName: charName,
+          charInt: charInt
+        })
+      }
+
+      let msg = window.GLOB.CacheVoucher.get(config.uuid) || {}
+      msg.currency = res.currency || []
+
+      window.GLOB.CacheVoucher.set(config.uuid, msg)
+    })
+  }
+
+  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 { config, disableSave, disableAdd, typeOptions, data } = 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}>
-        <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>
+    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>
+            <VoucherTable config={config} loading={loading} data={data} onChange={this.dataChange}/>
+          </div>
+          <div className="user" style={{paddingLeft: `${config.wrap.space || 0}px`}}>鍒跺崟浜猴細{username}</div>
         </div>
-        {config.wrap.type === 'edit' ? <div className="voucher-body">
-          <div className="pre-wrap">
-            <div className="voucher-code">
-              <Select dropdownClassName="mk-vcode-dropdown">
-                {typeOptions.map(option =>
-                  <Select.Option value={option.value}>{option.label}</Select.Option>
-                )}
-              </Select>
-              <Input autoComplete="off" /> 鍙�
-            </div>
-            <div className="voucher-date">
-              鏃ユ湡锛�<DatePicker onChange={this.onChange}/>
-            </div>
-            <div className="voucher-affix">
-              闄勫崟鎹� <Input autoComplete="off" /> 寮�
-              <Button type="link" className="" onClick={this.triggerprint}>闄勪欢</Button>
-              <Button type="link" className="" onClick={this.triggerprint}>澶囨敞</Button>
-            </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>
-          <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 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>
-            <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>
+            <VoucherTable config={config} loading={loading} data={data} onChange={this.dataChange}/>
           </div>
-          <VoucherTable config={config} data={data}/>
-        </div> : null}
-      </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