From c547c75fce3c2d9badcb496da7d8e5443e22dbfc Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期六, 03 八月 2024 17:10:41 +0800
Subject: [PATCH] Merge branch 'develop'
---
src/tabviews/custom/components/module/invoice/invoiceTable/index.jsx | 148 ++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 114 insertions(+), 34 deletions(-)
diff --git a/src/tabviews/custom/components/module/invoice/invoiceTable/index.jsx b/src/tabviews/custom/components/module/invoice/invoiceTable/index.jsx
index 791d755..f9cbe0c 100644
--- a/src/tabviews/custom/components/module/invoice/invoiceTable/index.jsx
+++ b/src/tabviews/custom/components/module/invoice/invoiceTable/index.jsx
@@ -27,11 +27,14 @@
})
}
- onChange = (value, key) => {
+ onChange = (value, key, nextkey) => {
let line = {...this.props.line}
if (['bill_count', 'unitprice', 'amount_line'].includes(key)) {
line[key] = value || 0
+ if (isNaN(line[key])) {
+ line[key] = 0
+ }
if (line[key]) {
if (key === 'bill_count') {
line[key] = Math.round(line[key] * 10000000000) / 10000000000
@@ -51,6 +54,15 @@
line.bill_count = Math.round(line.amount_line / line.unitprice * 10000000000) / 10000000000
}
}
+ } else if (key === 'amount_line') {
+ line.bill_count = 0
+ }
+
+ if (line.amount_line) {
+ line.tax_amount = line.amount_line - line.amount_line / (line.tax_rate + 1)
+ line.tax_amount = Math.round(line.tax_amount * 100) / 100
+ } else {
+ line.tax_amount = 0
}
} else {
line[key] = value
@@ -63,10 +75,32 @@
})
this.props.changeLine(line, key)
+
+ if (nextkey) {
+ let node = document.getElementById(nextkey)
+ if (node) {
+ if (node.select) {
+ node.select()
+ } else if (node.focus) {
+ node.focus()
+ }
+ }
+ }
+ }
+
+ onSkip = (key) => {
+ let node = document.getElementById(key)
+ if (node) {
+ if (node.select) {
+ node.select()
+ } else if (node.focus) {
+ node.focus()
+ }
+ }
}
render() {
- const { line, delLine, trigger } = this.props
+ const { line, delLine, trigger, field, pid } = this.props
const { bill_count, unitprice, amount_line } = this.state
return <div className="mk-tr active">
@@ -74,22 +108,22 @@
<div className="mk-input">{line.productname || ''}<EllipsisOutlined onClick={trigger}/></div>
</div>
<div className="mk-td">
- <Input defaultValue={line.spec || ''} onChange={(e) => this.onChange(e.target.value, 'spec')}/>
+ <Input defaultValue={line.spec || ''} autoFocus={field === 'spec'} onChange={(e) => this.onChange(e.target.value, 'spec')} onPressEnter={() => this.onSkip(pid + 'mk-invoice-unit')}/>
</div>
<div className="mk-td">
- <Input defaultValue={line.unit || ''} onChange={(e) => this.onChange(e.target.value, 'unit')}/>
+ <Input id={pid + 'mk-invoice-unit'} defaultValue={line.unit || ''} autoFocus={field === 'unit'} onChange={(e) => this.onChange(e.target.value, 'unit')} onPressEnter={() => this.onSkip(pid + 'mk-invoice-billcount')}/>
</div>
<div className="mk-td">
- <InputNumber value={bill_count} onChange={(val) => this.setState({bill_count: val})} onBlur={(e) => this.onChange(e.target.value, 'bill_count')}/>
+ <InputNumber id={pid + 'mk-invoice-billcount'} value={bill_count} autoFocus={field === 'bill_count'} formatter={value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')} parser={value => value.replace(/,*/g, '')} onChange={(val) => this.setState({bill_count: val})} onPressEnter={() => this.onChange(bill_count, 'bill_count', pid + 'mk-invoice-unitprice')} onBlur={() => this.onChange(bill_count, 'bill_count')}/>
</div>
<div className="mk-td">
- <InputNumber value={unitprice} onChange={(val) => this.setState({unitprice: val})} onBlur={(e) => this.onChange(e.target.value, 'unitprice')}/>
+ <InputNumber id={pid + 'mk-invoice-unitprice'} value={unitprice} autoFocus={field === 'unitprice'} formatter={value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')} parser={value => value.replace(/,*/g, '')} onChange={(val) => this.setState({unitprice: val})} onPressEnter={() => this.onChange(unitprice, 'unitprice', pid + 'mk-invoice-amount')} onBlur={() => this.onChange(unitprice, 'unitprice')}/>
</div>
<div className="mk-td">
- <InputNumber value={amount_line} onChange={(val) => this.setState({amount_line: val})} onBlur={(e) => this.onChange(e.target.value, 'amount_line')}/>
+ <InputNumber id={pid + 'mk-invoice-amount'} value={amount_line} autoFocus={field === 'amount_line'} formatter={value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')} parser={value => value.replace(/,*/g, '')} onChange={(val) => this.setState({amount_line: val})} onPressEnter={() => this.onChange(amount_line, 'amount_line')} onBlur={() => this.onChange(amount_line, 'amount_line')}/>
</div>
- <div className="mk-td">{line.tax_name}</div>
- <div className="mk-td mk-right">{line.tax_amount} <span className="del-line" onClick={() => delLine(line.uuid)}></span> </div>
+ <div className="mk-td mk-right">{line.tax_name}</div>
+ <div className="mk-td mk-right">{line.tax_amount.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ',')} <span className="del-line" onClick={(e) => delLine(line.uuid, e)}></span> </div>
</div>
}
}
@@ -97,6 +131,8 @@
class InvoiceTable extends Component {
static propTpyes = {
config: PropTypes.object,
+ timestamp: PropTypes.string,
+ read_only: PropTypes.any,
data: PropTypes.any,
onChange: PropTypes.func
}
@@ -104,6 +140,7 @@
state = {
data: [],
editKey: '',
+ key: '',
total: {}
}
@@ -128,6 +165,21 @@
componentDidMount () {
MKEmitter.addListener('resetDetails', this.resetDetails)
+ }
+
+ UNSAFE_componentWillReceiveProps(nextProps) {
+ if (this.props.timestamp !== nextProps.timestamp) {
+ let _data = fromJS(nextProps.data).toJS()
+ if (!_data.length) {
+ _data = [{uuid: Utils.getguid(), productname: '', spec: '', unit: '', bill_count: '', unitprice: 0, amount_line: 0, tax_rate: '', tax_name: '', tax_amount: 0}]
+ }
+
+ this.setState({
+ data: _data
+ }, () => {
+ this.getTotal(_data)
+ })
+ }
}
/**
@@ -226,11 +278,14 @@
data.forEach(item => {
if (!item.productcode) return
- price += item.amount_line
- tax += item.tax_amount
+ price += item.amount_line * 100
+ tax += item.tax_amount * 100
})
- this.setState({total: {price, tax, sum: price + tax, sumName: this.changeMoneyToChinese(price + tax)}})
+ price = price / 100
+ tax = tax / 100
+
+ this.setState({total: {price, tax, sum: price, sumName: this.changeMoneyToChinese(price)}})
}
resetDetails = (data) => {
@@ -253,9 +308,11 @@
this.setState({data: [...data, line]})
}
- delLine = () => {
- const { editKey, data } = this.state
+ delLine = (uuid, e) => {
+ const { data } = this.state
+ e.stopPropagation()
+
if (data.length === 1) {
notification.warning({
top: 92,
@@ -265,7 +322,7 @@
return
}
- let _data = data.filter(item => item.uuid !== editKey)
+ let _data = data.filter(item => item.uuid !== uuid)
this.setState({data: _data}, () => {
this.getTotal(_data)
@@ -291,8 +348,18 @@
this.props.onChange(_data)
}
- checkLine = (uuid) => {
- this.setState({editKey: uuid})
+ checkLine = (uuid, key, e) => {
+ const { read_only } = this.props
+
+ e && e.stopPropagation()
+
+ if (read_only) return
+
+ this.setState({editKey: uuid, key: key || ''}, () => {
+ if (key === 'productname') {
+ this.setState({visible: true})
+ }
+ })
}
changeDetail = (prod) => {
@@ -304,8 +371,16 @@
item.spec = prod.spec
item.unit = prod.unit
item.unitprice = prod.unitprice
- item.tax_rate = prod.tax_rate
- item.tax_name = prod.tax_rate
+ item.tax_rate = prod.tax_rate || 0
+ item.tax_name = prod.tax_rate * 100 + '%'
+ item.free_tax_mark = prod.free_tax_mark || ''
+ item.vat_special_management = prod.vat_special_management || ''
+ item.tax_item = prod.tax_item || ''
+ item.tax_method = prod.tax_method || ''
+
+ if (prod.vat_special_management && prod.free_tax_mark === 'true') {
+ item.tax_name = prod.vat_special_management
+ }
item.productcode = prod.productcode
item.Description = prod.Description
@@ -315,7 +390,12 @@
if (item.bill_count && item.unitprice) {
item.amount_line = Math.round(item.unitprice * item.bill_count * 100) / 100
}
- // item.tax_amount = prod.productname
+ if (item.amount_line) {
+ item.tax_amount = item.amount_line - item.amount_line / (item.tax_rate + 1)
+ item.tax_amount = Math.round(item.tax_amount * 100) / 100
+ } else {
+ item.tax_amount = 0
+ }
}
return item
@@ -329,8 +409,8 @@
}
render() {
- const { config } = this.props
- const { editKey, data, total, visible } = this.state
+ const { config, tax_type } = this.props
+ const { editKey, key, data, total, visible } = this.state
return (
<div className="detail-wrap">
@@ -347,18 +427,18 @@
</div>
{data.map(item => {
if (editKey === item.uuid) {
- return <DetailLine key={item.uuid} line={item} changeLine={this.changeLine} delLine={this.delLine} trigger={() => this.setState({visible: true})}/>
+ return <DetailLine key={item.uuid} pid={config.uuid} line={item} field={key} changeLine={this.changeLine} delLine={this.delLine} trigger={() => this.setState({visible: true})}/>
}
return <div className="mk-tr" key={item.uuid} onClick={() => this.checkLine(item.uuid)}>
- <div className="mk-td mk-left">{item.productname || '**'}</div>
- <div className="mk-td mk-left">{item.spec || ''}</div>
- <div className="mk-td mk-left">{item.unit || ''}</div>
- <div className="mk-td mk-right">{item.bill_count || ''}</div>
- <div className="mk-td mk-right">{item.unitprice || ''}</div>
- <div className="mk-td mk-right">{item.amount_line || ''}</div>
+ <div className="mk-td mk-left" onClick={(e) => this.checkLine(item.uuid, item.productname ? '' : 'productname', e)}>{item.productname || ''}</div>
+ <div className="mk-td mk-left" onClick={(e) => this.checkLine(item.uuid, 'spec', e)}>{item.spec || ''}</div>
+ <div className="mk-td mk-left" onClick={(e) => this.checkLine(item.uuid, 'unit', e)}>{item.unit || ''}</div>
+ <div className="mk-td mk-right" onClick={(e) => this.checkLine(item.uuid, 'bill_count', e)}>{`${item.bill_count || ''}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}</div>
+ <div className="mk-td mk-right" onClick={(e) => this.checkLine(item.uuid, 'unitprice', e)}>{`${item.unitprice || ''}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}</div>
+ <div className="mk-td mk-right" onClick={(e) => this.checkLine(item.uuid, 'amount_line', e)}>{`${item.amount_line || ''}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}</div>
<div className="mk-td mk-right">{item.tax_name}</div>
- <div className="mk-td mk-right">{item.tax_amount}</div>
+ <div className="mk-td mk-right">{item.tax_amount.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ',')}<span className="del-line" onClick={(e) => this.delLine(item.uuid, e)}></span></div>
</div>
})}
<div className="mk-total">
@@ -367,14 +447,14 @@
<div className="mk-td"></div>
<div className="mk-td"></div>
<div className="mk-td"></div>
- <div className="mk-td">锟total.price}</div>
+ <div className="mk-td">锟`${total.price}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}</div>
<div className="mk-td"></div>
- <div className="mk-td">锟total.tax}</div>
+ <div className="mk-td">锟`${total.tax}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}</div>
</div>
<div className="mk-upcase">
<div className="mk-td">浠风◣鍚堣锛堝ぇ鍐欙級</div>
<div className="mk-td">{total.sumName}</div>
- <div className="mk-td">锛堝皬鍐欙級锟total.sum}</div>
+ <div className="mk-td">锛堝皬鍐欙級锟`${total.sum}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}</div>
</div>
<Modal
title="鍟嗗搧淇℃伅"
@@ -384,7 +464,7 @@
onCancel={() => { this.setState({ visible: false }) }}
footer={null}
>
- <SubTable config={config} onChange={this.changeDetail}/>
+ <SubTable config={config} tax_type={tax_type} onChange={this.changeDetail}/>
</Modal>
</div>
)
--
Gitblit v1.8.0