From 2e5fe5427d6db393e0495598ff43d90a052f4791 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期日, 28 四月 2024 14:06:42 +0800
Subject: [PATCH] 2024-04-28

---
 src/tabviews/custom/components/module/invoice/index.jsx |  516 +++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 448 insertions(+), 68 deletions(-)

diff --git a/src/tabviews/custom/components/module/invoice/index.jsx b/src/tabviews/custom/components/module/invoice/index.jsx
index 6307d89..e0ca568 100644
--- a/src/tabviews/custom/components/module/invoice/index.jsx
+++ b/src/tabviews/custom/components/module/invoice/index.jsx
@@ -1,12 +1,13 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Select, Form, Input, Button, Modal } from 'antd'
+import { Select, Form, Input, Button, Modal, Spin, notification } from 'antd'
 import { EllipsisOutlined } from '@ant-design/icons'
 import moment from 'moment'
 
-// import Api from '@/api'
-// import Utils from '@/utils/utils.js'
+import Api from '@/api'
+import UtilsDM from '@/utils/utils-datamanage.js'
+import Utils from '@/utils/utils.js'
 import MKEmitter from '@/utils/events.js'
 import InvoiceTable from './invoiceTable'
 import SubTable from './subTable'
@@ -19,6 +20,8 @@
 
   state = {
     BID: '',
+    ID: Utils.getuuid(),
+    io: '',
     invTypes: [
       {value: '1', label: '鐢靛瓙鍙戠エ锛堝鍊肩◣涓撶敤鍙戠エ锛�'},
       {value: '2', label: '鐢靛瓙鍙戠エ锛堟櫘閫氬彂绁級'},
@@ -48,7 +51,14 @@
     payee: '',
     reviewer: '',
     drawer: '',
-    details: []
+    details: [],
+    oriDetails: [],
+    book: null,
+    loading: false,
+    saveType: '',
+    tax_type: '',
+    reqfields: [],
+    requireds: []
   }
 
   UNSAFE_componentWillMount () {
@@ -74,15 +84,35 @@
     _config.buyer = this.formatSetting(_config.buyer, 'buyer')
     _config.detail = this.formatSetting(_config.detail, 'detail')
 
+    let book = null
+    let pas = {}
+    if (config.wrap.supBook) {
+      book = window.GLOB.CacheData.get(config.wrap.supBook) || null
+
+      if (book) {
+        pas = this.resetParam(book)
+      }
+    }
+
     this.setState({
       BID: BID || '',
-      config: _config
+      config: _config,
+      book,
+      ...pas
     })
   }
 
   componentDidMount () {
-    this.loadData()
+    const { config } = this.props
+
     MKEmitter.addListener('reloadData', this.reloadData)
+    MKEmitter.addListener('resetSelectLine', this.resetParentParam)
+
+    if (config.wrap.datatype === 'dynamic' && config.setting.onload === 'true') {
+      setTimeout(() => {
+        this.loadData()
+      }, config.setting.delay || 0)
+    }
   }
 
   shouldComponentUpdate (nextProps, nextState) {
@@ -97,6 +127,7 @@
       return
     }
     MKEmitter.removeListener('reloadData', this.reloadData)
+    MKEmitter.removeListener('resetSelectLine', this.resetParentParam)
   }
 
   formatSetting = (item, type) => {
@@ -114,13 +145,18 @@
       })
     } else {
       item.columns = item.columns.map(cell => {
-        if (['Description', 'id'].includes(cell.field)) {
+        if (cell.field === 'general_tax_rate') {
+          cell.field = 'tax_rate'
+          cell.label = '绋庣巼'
+        }
+        if (['Description', 'id', 'small_tax_rate', 'free_tax_mark', 'vat_special_management'].includes(cell.field)) {
           cell.Hide = 'true'
         } else if (['spec'].includes(cell.field)) {
           cell.Width = 150
         } else if (['unit', 'unitprice', 'tax_rate'].includes(cell.field)) {
           cell.Width = 80
         }
+
         return cell
       })
     }
@@ -191,63 +227,388 @@
     return item
   }
 
-  reloadData = (menuId) => {
-    // const { config } = this.props
-    // const { activeItem } = this.state
-    
-    // if (config.uuid !== menuId) return
+  resetParentParam = (MenuID, id, data) => {
+    const { config } = this.state
 
-    // if (activeItem) {
-    //   MKEmitter.emit('resetSelectLine', config.uuid, activeItem.id, activeItem)
-    // } else {
-    //   this.loadData()
-    // }
+    if (config.wrap.supBook === MenuID) {
+      let pas = this.resetParam(data)
+
+      this.setState({ book: data, ...pas }, () => {
+        this.loadData()
+      })
+      return
+    }
+
+    if (!config.wrap.supModule || config.wrap.supModule !== MenuID) return
+    if (id !== this.state.BID || id !== '') {
+      this.setState({ BID: id }, () => {
+        this.loadData()
+      })
+    }
   }
 
-  loadData = () => {
-    // let param = {
-    //   func: 's_get_fcc_book_data',
-    //   dataM: sessionStorage.getItem('dataM') === 'true' ? 'Y' : '',
-    //   mk_organization: sessionStorage.getItem('organization') || ''
-    // }
+  resetParam = (book) => {
+    let invTypes = book.invoice_type || []
+    let invoice_type = sessionStorage.getItem('pre_invoice_type') || ''
+    if (invoice_type && invTypes.findIndex(item => item.value === invoice_type) === -1) {
+      invoice_type = ''
+    }
 
-    // Api.genericInterface(param).then(res => {
-    //   if (!res.status) {
-    //     notification.warning({
-    //       top: 92,
-    //       message: res.message,
-    //       duration: 5
-    //     })
-    //     return
-    //   }
+    this.getRequired(invoice_type)
 
-    //   let books = res.book || []
-    //   let activeItem = null
-    //   let map = new Map()
-    //   books = books.filter(item => {
-    //     if (!item.id) return false
-    //     if (map.has(item.id)) return false
-    //     map.set(item.id, true)
+    return {
+      invoice_type,
+      invTypes: invTypes,
+      orgname: book.orgname || '',
+      tax_no: book.tax_no || '',
+      addr: book.addr || '',
+      tel: book.tel || '',
+      bank_name: book.bank_name || '',
+      account_no: book.account_no || '',
+      payee: book.payee || '',
+      reviewer: book.reviewer || '',
+      drawer: book.drawer || '',
+      tax_type: book.tax_type || ''
+    }
+  }
 
-    //     if (item.selected === 'true' && !activeItem) {
-    //       activeItem = item
-    //     }
-    //     if (item.months) {
-    //       item.date = item.months.replace('-', '骞�') + '鏈�'
-    //     }
-    //     return true
-    //   })
+  reloadData = (menuId) => {
+    const { config } = this.state
+    
+    if (config.uuid !== menuId) return
 
-    //   this.setState({books, activeItem})
+    this.loadData()
+  }
 
-    //   if (activeItem) {
-    //     MKEmitter.emit('resetSelectLine', this.props.config.uuid, activeItem.id, activeItem)
-    //   }
-    // })
+  async loadData() {
+    const { config, BID } = this.state
+
+    if (config.wrap.datatype !== 'dynamic') return
+
+    let param = UtilsDM.getQueryDataParams(config.setting, [], config.setting.order, 1, 1, BID)
+
+    this.setState({
+      loading: true
+    })
+
+    let result = await Api.genericInterface(param)
+    if (result.status) {
+
+      this.setState({
+        ID: result.data[0][config.setting.primaryKey] || Utils.getuuid(),
+        io: '',
+        details: [],
+        oriDetails: [],
+        loading: false
+      })
+
+      UtilsDM.querySuccess(result)
+    } else {
+      this.setState({
+        loading: false
+      })
+      this.timer && this.timer.stop()
+
+      UtilsDM.queryFail(result)
+    }
   }
 
   changeType = (val) => {
+    sessionStorage.setItem('pre_invoice_type', val)
     this.setState({invoice_type: val})
+    this.getRequired(val)
+  }
+
+  getRequired = (invoice_type) => {
+    if (!invoice_type) return
+
+    let reqfields = []
+    let requireds = []
+    let rds = [
+      {value: 'from_to_name', label: '璐拱鏂瑰悕绉�'},
+      {value: 'from_to_tax_no', label: '璐拱鏂圭撼绋庝汉璇嗗埆鍙�'},
+      {value: 'from_to_addr', label: '璐拱鏂瑰湴鍧�'},
+      {value: 'from_to_tel', label: '璐拱鏂圭數璇�'},
+      {value: 'from_to_bank_name', label: '璐拱鏂瑰紑鎴疯'},
+      {value: 'from_to_account_no', label: '璐拱鏂硅处鍙�'},
+      {value: 'from_to_mob', label: '璐拱鏂规墜鏈哄彿'},
+      {value: 'from_to_email', label: '璐拱鏂归偖绠�'},
+
+      {value: 'orgname', label: '閿�鍞柟鍚嶇О'},
+      {value: 'tax_no', label: '閿�鍞柟绾崇◣浜鸿瘑鍒彿'},
+      {value: 'addr', label: '閿�鍞柟鍦板潃'},
+      {value: 'tel', label: '閿�鍞柟鐢佃瘽'},
+      {value: 'bank_name', label: '閿�鍞柟寮�鎴疯'},
+      {value: 'account_no', label: '閿�鍞柟璐﹀彿'},
+    ]
+    if (invoice_type === 'e_general') {
+      reqfields = ['from_to_name', 'from_to_tax_no', 'orgname', 'tax_no']
+      rds.forEach(item => {
+        if (reqfields.includes(item.value)) {
+          requireds.push(item)
+        }
+      })
+    } else if (invoice_type === 'e_special') {
+      reqfields = ['from_to_name', 'from_to_tax_no', 'from_to_addr', 'from_to_tel', 'from_to_bank_name', 'from_to_account_no', 'orgname', 'tax_no', 'addr', 'tel', 'bank_name', 'account_no']
+      rds.forEach(item => {
+        if (reqfields.includes(item.value)) {
+          requireds.push(item)
+        }
+      })
+    }
+    
+    this.setState({
+      reqfields,
+      requireds
+    })
+  }
+
+  saveBill = () => {
+    const { config, book, saveType } = this.state
+
+    if (saveType) return
+
+    setTimeout(() => {
+      this.getBillMsg().then(() => {
+        let sql = this.getPreSql(config.billSaveBtn)
+  
+        let param = {
+          func: 'sPC_TableData_InUpDe',
+          LText: sql,
+          exec_type: window.GLOB.execType || 'y',
+          timestamp: moment().format('YYYY-MM-DD HH:mm:ss'),
+          BID: book.id
+        }
+  
+        param.secretkey = Utils.encrypt('', param.timestamp)
+        param.LText = Utils.formatOptions(param.LText, param.exec_type)
+
+        this.setState({
+          saveType: 'bill'
+        })
+
+        Api.genericInterface(param).then(res => {
+          if (res.status) {
+            notification.success({
+              top: 92,
+              message: '淇濆瓨鎴愬姛銆�',
+              duration: 5
+            })
+          } else {
+            notification.warning({
+              top: 92,
+              message: res.message,
+              duration: 5
+            })
+          }
+          this.setState({
+            saveType: ''
+          })
+        })
+      }, (error) => {
+        notification.warning({
+          top: 92,
+          message: error,
+          duration: 5
+        })
+        return
+      })
+    }, 20)
+  }
+
+  outBill = () => {
+    const { config, book, saveType } = this.state
+
+    if (saveType) return
+
+    setTimeout(() => {
+      this.getBillMsg().then(() => {
+        let sql = this.getPreSql(config.billOutBtn)
+  
+        let param = {
+          func: 'sPC_TableData_InUpDe',
+          LText: sql,
+          key_back_type: 'Y',
+          exec_type: window.GLOB.execType || 'y',
+          timestamp: moment().format('YYYY-MM-DD HH:mm:ss'),
+          BID: book.id
+        }
+  
+        param.secretkey = Utils.encrypt('', param.timestamp)
+        param.LText = Utils.formatOptions(param.LText, param.exec_type)
+
+        console.info(sql)
+      }, (error) => {
+        notification.warning({
+          top: 92,
+          message: error,
+          duration: 5
+        })
+        return
+      })
+    })
+  }
+
+  getPreSql = (btn) => {
+    const { book, ID, io, details, oriDetails, invoice_type, from_to_name, from_to_tax_no, from_to_addr, from_to_tel, from_to_bank_name, from_to_account_no, from_to_mob, from_to_email, from_to_code, orgname, tax_no, addr, tel, bank_name, account_no, remark, reviewer, drawer, payee } = this.state
+
+    let BID = book.id
+    let userName = sessionStorage.getItem('User_Name') || '' 
+    let fullName = sessionStorage.getItem('Full_Name') || ''
+    let RoleID = sessionStorage.getItem('role_id') || ''
+    let departmentcode = sessionStorage.getItem('departmentcode') || ''
+    let organization = sessionStorage.getItem('organization') || ''
+    let mk_user_type = sessionStorage.getItem('mk_user_type') || ''
+    let nation = sessionStorage.getItem('nation') || ''
+    let province = sessionStorage.getItem('province') || ''
+    let city = sessionStorage.getItem('city') || ''
+    let district = sessionStorage.getItem('district') || ''
+    let address = sessionStorage.getItem('address') || ''
+    let options = fromJS(oriDetails).toJS()
+    let price = 0
+    let tax = 0
+
+    let lines = details.map(line => {
+      let _sql = `Select '${line.productcode}', '${line.productname}', '${line.spec}', '${line.unit}', ${line.bill_count}, ${line.unitprice}, ${line.amount_line}, '${line.tax_classify_code}', '${line.tax_classify_name}', ${line.tax_rate}, ${line.tax_amount}, '${line.invoice_lp || ''}', '${line.uuid}'`
+      let data_type = 'add'
+
+      price += line.amount_line * 100
+      tax += line.tax_amount * 100
+
+      if (options.length) {
+        options = options.filter(option => {
+          if (option.uuid === line.uuid) {
+            data_type = 'upt'
+            return false
+          }
+          return true
+        })
+      }
+
+      return _sql + `, '${data_type}'`
+    })
+
+    let _total = (price - tax) / 100
+    price = price / 100
+    tax = tax / 100
+
+    if (options.length) {
+      options.forEach(line => {
+        lines.push(`Select '${line.productcode}', '${line.productname}', '${line.spec}', '${line.unit}', ${line.bill_count}, ${line.unitprice}, ${line.amount_line}, '${line.tax_classify_code}', '${line.tax_classify_name}', ${line.tax_rate}, ${line.tax_amount}, '${line.invoice_lp || ''}', '${line.uuid}', 'del'`)
+      })
+    }
+
+    lines = lines.join(' union all ')
+
+    let _script = ''
+    btn.scripts.forEach(item => {
+      if (item.status === 'false') return
+      _script += `
+      ${item.sql}
+      `
+    })
+
+    let sql = `/* 绯荤粺瀛楁 */
+      Declare @UserName nvarchar(50), @FullName nvarchar(50), @RoleID nvarchar(512), @mk_departmentcode nvarchar(512), @mk_organization nvarchar(512), @mk_user_type nvarchar(20), @mk_nation nvarchar(50), @mk_province nvarchar(50), @mk_city nvarchar(50), @mk_district nvarchar(50), @mk_address nvarchar(100), @ErrorCode nvarchar(50), @retmsg nvarchar(4000), @account_id nvarchar(50), @account_year_id nvarchar(50), @account_code nvarchar(50), @account_year_code nvarchar(50), @bid nvarchar(50), @tbid nvarchar(50)
+
+      Select @UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}', @ErrorCode='', @retmsg='', @account_id='${book.account_id || ''}', @account_year_id='${book.account_year_id || ''}', @account_code='${book.account_code || ''}', @account_year_code='${book.account_year_code || ''}', @bid=''
+
+      /* 鍙戠エ涓昏〃瀛楁 */
+      Declare @invoice_type Nvarchar(50), @from_to_name Nvarchar(50), @from_to_tax_no Nvarchar(50), @from_to_addr Nvarchar(100), @from_to_tel Nvarchar(50), @from_to_bank_name Nvarchar(50), @from_to_account_no Nvarchar(50), @from_to_mob Nvarchar(50), @from_to_email Nvarchar(50), @from_to_code Nvarchar(50), @orgname Nvarchar(50), @tax_no Nvarchar(50), @addr Nvarchar(100), @tel Nvarchar(50), @bank_name Nvarchar(50), @account_no Nvarchar(50), @remark Nvarchar(512), @payee Nvarchar(50), @reviewer Nvarchar(50), @drawer Nvarchar(50), @io Nvarchar(50), @orgcode Nvarchar(50), @total_net_amount Decimal(18,2), @total_tax Decimal(18,2), @total_amount Decimal(18,2)
+
+      Select @invoice_type='${invoice_type}', @from_to_name='${from_to_name}', @from_to_tax_no='${from_to_tax_no}', @from_to_addr='${from_to_addr}', @from_to_tel='${from_to_tel}', @from_to_bank_name='${from_to_bank_name}', @from_to_account_no='${from_to_account_no}', @from_to_mob='${from_to_mob}', @from_to_email='${from_to_email}', @from_to_code='${from_to_code}', @orgname='${orgname}', @tax_no='${tax_no}', @addr='${addr}', @tel='${tel}', @bank_name='${bank_name}', @account_no='${account_no}', @remark='${remark}', @payee='${payee}', @reviewer='${reviewer}', @drawer='${drawer}', @io='${io}', @orgcode='${book.orgcode || ''}', @total_net_amount=${_total}, @total_tax=${tax}, @total_amount=${price}
+
+      /* 鍙戠エ鏄庣粏涓存椂琛� */
+
+      Declare @details_list table (productcode Nvarchar(50), productname Nvarchar(50), spec Nvarchar(50), unit Nvarchar(50), bill_count Decimal(18,10), unitprice Decimal(18,10), amount_line Decimal(18,2), tax_classify_code Nvarchar(50), tax_classify_name Nvarchar(50), tax_rate Decimal(18,2), tax_amount Decimal(18,2), invoice_lp Nvarchar(50), jskey Nvarchar(50), data_type Nvarchar(50))
+
+      Insert into @details_list (productcode, productname, spec, unit, bill_count, unitprice, amount_line, tax_classify_code, tax_classify_name, tax_rate, tax_amount, invoice_lp, jskey, data_type)
+
+      ${lines}
+
+      /* 鑷畾涔夎剼鏈� */
+      ${_script}
+
+      aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
+
+    sql = sql.replace(/@ID@/ig, `'${ID}'`)
+    sql = sql.replace(/@BID@/ig, `'${BID}'`)
+    sql = sql.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
+    sql = sql.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
+    sql = sql.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
+    sql = sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
+    sql = sql.replace(/@typename@/ig, `'admin'`)
+
+    if (window.GLOB.externalDatabase !== null) {
+      sql = sql.replace(/@db@/ig, window.GLOB.externalDatabase)
+    }
+
+    if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
+      sql = sql.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, `'Y'`)
+    } else {
+      sql = sql.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, `''`)
+    }
+
+    if (window.GLOB.debugger === true) {
+      console.info(sql.replace(/\n\s{6}/ig, '\n'))
+    }
+
+    return sql
+  }
+
+  getBillMsg = () => {
+    const { requireds, invoice_type, details, remark, from_to_addr, addr } = this.state
+
+    return new Promise((resolve, reject) => {
+      let error = ''
+
+      if (!invoice_type) {
+        error = '璇烽�夋嫨鍙戠エ绫诲瀷锛�'
+      }
+      
+      if (!error) {
+        requireds.forEach(item => {
+          if (!this.state[item.value] && !error) {
+            error = '璇疯緭鍏�' + item.label + '锛�'
+          }
+        })
+      }
+
+      if (!error && remark.length > 512) {
+        error = '澶囨敞涓嶅彲瓒呰繃512涓瓧绗︼紒'
+      }
+      if (!error && from_to_addr.length > 100) {
+        error = '璐拱鏂瑰湴鍧�涓嶅彲瓒呰繃100涓瓧绗︼紒'
+      }
+      if (!error && addr.length > 100) {
+        error = '閿�鍞柟鍦板潃涓嶅彲瓒呰繃100涓瓧绗︼紒'
+      }
+
+      if (!error) {
+        if (details.length === 0) {
+          error = '璇锋坊鍔犳槑缁嗭紒'
+        } else {
+          details.forEach((line, index) => {
+            if (error) return
+            if (line.productcode) {
+              if (!line.bill_count) {
+                error = '鏄庣粏绗�' + (index + 1) + '琛岋紝璇疯緭鍏ユ暟閲忥紒'
+              } else if (!line.unitprice) {
+                error = '鏄庣粏绗�' + (index + 1) + '琛岋紝璇疯緭鍏ュ崟浠凤紒'
+              }
+            } else {
+              error = '鏄庣粏绗�' + (index + 1) + '琛岋紝璇烽�夋嫨璐х墿鎴栧簲绋庡姵鍔°�佹湇鍔″悕绉帮紒'
+            }
+          })
+        }
+      }
+
+      if (error) {
+        reject(error)
+      } else {
+        resolve()
+      }
+    })
   }
 
   changeBuyer = (item) => {
@@ -266,20 +627,39 @@
   }
 
   render() {
-    const { config, invTypes, date, from_to_name, from_to_tax_no, from_to_addr, from_to_tel, from_to_bank_name, from_to_account_no, from_to_mob, from_to_email, orgname, tax_no, addr, tel, bank_name, account_no, remark, reviewer, drawer, payee, details, visible } = this.state
+    const { config, book, loading, invTypes, reqfields, saveType, date, invoice_type, from_to_name, from_to_tax_no, from_to_addr, from_to_tel, from_to_bank_name, from_to_account_no, from_to_mob, from_to_email, orgname, tax_no, addr, tel, bank_name, account_no, remark, reviewer, drawer, payee, details, visible, tax_type } = this.state
+
+    if (!book || (config.wrap.datatype === 'dynamic' && !tax_no)) {
+      return <div className="menu-invoice-wrap" style={config.style}>
+        <div className="loading-mask">
+          <div className="ant-spin-blur"></div>
+          <Spin />
+        </div>
+      </div>
+    }
 
     return (
       <div className="menu-invoice-wrap" style={config.style}>
+        {loading ?
+          <div className="loading-mask">
+            <div className="ant-spin-blur"></div>
+            <Spin />
+          </div> : null
+        }
         <div className="inv-action">
-          <Button className="mk-bill">淇濆瓨鍗曟嵁</Button>
-          <Button className="mk-submit">鎻愪氦寮�绁�</Button>
+          <Button className="mk-bill" loading={saveType === 'bill'} onClick={this.saveBill}>淇濆瓨鍗曟嵁</Button>
+          <Button className="mk-submit" loading={saveType === 'out'} onClick={this.outBill}>鎻愪氦寮�绁�</Button>
         </div>
         <div className="inv-header">
-          <Select placeholder="璇烽�夋嫨鍙戠エ绉嶇被" onChange={this.changeType} dropdownClassName="inv-type-select">
+          {invoice_type ? <Select defaultValue={invoice_type} onChange={this.changeType} dropdownClassName="inv-type-select">
             {invTypes.map(item => (
               <Select.Option key={item.value} value={item.value}>{item.label}</Select.Option>
             ))}
-          </Select>
+          </Select> : <Select placeholder="璇烽�夋嫨鍙戠エ绉嶇被" onChange={this.changeType} dropdownClassName="inv-type-select">
+            {invTypes.map(item => (
+              <Select.Option key={item.value} value={item.value}>{item.label}</Select.Option>
+            ))}
+          </Select>}
           <div className="date">寮�绁ㄦ棩鏈燂細{date}</div>
         </div>
         <div className="inv-body">
@@ -287,17 +667,17 @@
             <div className="inv-buyer">
               <div className="inv-label">璐拱鏂�</div>
               <div className="inv-content">
-                <Form.Item label={<>鍚�<span></span>绉�</>} extra={<EllipsisOutlined onClick={() => this.setState({visible: true})}/>}>
+                <Form.Item required={reqfields.includes('from_to_name')} label={<>鍚�<span></span>绉�</>} extra={<EllipsisOutlined onClick={() => this.setState({visible: true})}/>}>
                   <Input placeholder="璇疯緭鍏ヨ喘涔版柟鍚嶇О" allowClear value={from_to_name} autoComplete="off" onChange={(e) => this.setState({from_to_name: e.target.value})}/>
                 </Form.Item>
-                <Form.Item label="绾崇◣浜鸿瘑鍒彿">
+                <Form.Item required={reqfields.includes('from_to_tax_no')} label="绾崇◣浜鸿瘑鍒彿">
                   <Input placeholder="璇疯緭鍏ヨ喘涔版柟绾崇◣浜鸿瘑鍒彿" allowClear value={from_to_tax_no} autoComplete="off" onChange={(e) => this.setState({from_to_tax_no: e.target.value})}/>
                 </Form.Item>
-                <Form.Item className="mutil-input" label={<>鍦�<span></span>鍧�<span></span>銆�<span></span>鐢�<span></span>璇�</>}>
+                <Form.Item required={reqfields.includes('from_to_addr')} className="mutil-input" label={<>鍦�<span></span>鍧�<span></span>銆�<span></span>鐢�<span></span>璇�</>}>
                   <Input placeholder="璇疯緭鍏ヨ喘涔版柟鍦板潃" allowClear value={from_to_addr} autoComplete="off" onChange={(e) => this.setState({from_to_addr: e.target.value})}/>
                   <Input placeholder="璇疯緭鍏ヨ喘涔版柟鐢佃瘽" allowClear value={from_to_tel} autoComplete="off" onChange={(e) => this.setState({from_to_tel: e.target.value})}/>
                 </Form.Item>
-                <Form.Item className="mutil-input" label="寮�鎴疯鍙婅处鍙�">
+                <Form.Item required={reqfields.includes('from_to_bank_name')} className="mutil-input" label="寮�鎴疯鍙婅处鍙�">
                   <Input placeholder="璇疯緭鍏ヨ喘涔版柟寮�鎴疯" allowClear value={from_to_bank_name} autoComplete="off" onChange={(e) => this.setState({from_to_bank_name: e.target.value})}/>
                   <Input placeholder="璇疯緭鍏ヨ喘涔版柟璐﹀彿" allowClear value={from_to_account_no} autoComplete="off" onChange={(e) => this.setState({from_to_account_no: e.target.value})}/>
                 </Form.Item>
@@ -306,33 +686,33 @@
             <div className="inv-notice">
               <div className="inv-label">閫氱煡鍒�</div>
               <div className="inv-content">
-                <Form.Item label={<>鎵�<span></span>鏈�<span></span>鍙�</>}>
+                <Form.Item required={reqfields.includes('from_to_mob')} label={<>鎵�<span></span>鏈�<span></span>鍙�</>}>
                   <Input placeholder="璇疯緭鍏ヨ喘涔版柟鎵嬫満鍙�" allowClear value={from_to_mob} autoComplete="off" onChange={(e) => this.setState({from_to_mob: e.target.value})}/>
                 </Form.Item>
-                <Form.Item label={<>閭�<span></span>绠�</>}>
+                <Form.Item required={reqfields.includes('from_to_email')} label={<>閭�<span></span>绠�</>}>
                   <Input placeholder="璇疯緭鍏ヨ喘涔版柟閭" allowClear value={from_to_email} autoComplete="off" onChange={(e) => this.setState({from_to_email: e.target.value})}/>
                 </Form.Item>
               </div>
             </div>
           </div>
           <div className="inv-details">
-            <InvoiceTable data={details} config={config.detail} onChange={(details) => this.setState({details})}/>
+            <InvoiceTable data={details} config={config.detail} tax_type={tax_type} onChange={(details) => this.setState({details})}/>
           </div>
           <div className="inv-main-content">
             <div className="inv-buyer">
               <div className="inv-label">閿�鍞柟</div>
               <div className="inv-content">
-                <Form.Item label={<>鍚�<span></span>绉�</>}>
+                <Form.Item required={reqfields.includes('orgname')} label={<>鍚�<span></span>绉�</>}>
                   <Input placeholder="璇疯緭鍏ラ攢鍞柟鍚嶇О" value={orgname} autoComplete="off" onChange={(e) => this.setState({orgname: e.target.value})}/>
                 </Form.Item>
-                <Form.Item label="绾崇◣浜鸿瘑鍒彿">
+                <Form.Item required={reqfields.includes('tax_no')} label="绾崇◣浜鸿瘑鍒彿">
                   <Input placeholder="璇疯緭鍏ラ攢鍞柟绾崇◣浜鸿瘑鍒彿" disabled value={tax_no} autoComplete="off"/>
                 </Form.Item>
-                <Form.Item className="mutil-input" label={<>鍦�<span></span>鍧�<span></span>銆�<span></span>鐢�<span></span>璇�</>}>
+                <Form.Item required={reqfields.includes('addr')} className="mutil-input" label={<>鍦�<span></span>鍧�<span></span>銆�<span></span>鐢�<span></span>璇�</>}>
                   <Input placeholder="璇疯緭鍏ラ攢鍞柟鍦板潃" value={addr} autoComplete="off" onChange={(e) => this.setState({addr: e.target.value})}/>
                   <Input placeholder="璇疯緭鍏ラ攢鍞柟鐢佃瘽" value={tel} autoComplete="off" onChange={(e) => this.setState({tel: e.target.value})}/>
                 </Form.Item>
-                <Form.Item className="mutil-input" label="寮�鎴疯鍙婅处鍙�">
+                <Form.Item required={reqfields.includes('bank_name')} className="mutil-input" label="寮�鎴疯鍙婅处鍙�">
                   <Input placeholder="璇疯緭鍏ラ攢鍞柟寮�鎴疯" value={bank_name} autoComplete="off" onChange={(e) => this.setState({bank_name: e.target.value})}/>
                   <Input placeholder="璇疯緭鍏ラ攢鍞柟璐﹀彿" value={account_no} autoComplete="off" onChange={(e) => this.setState({account_no: e.target.value})}/>
                 </Form.Item>

--
Gitblit v1.8.0