From 6f817bf3ae4e6f51f982c07b0713adb3caf9fac2 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期四, 02 二月 2023 17:14:16 +0800
Subject: [PATCH] 2023-02-02

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

diff --git a/src/tabviews/custom/components/module/voucher/voucherTable/index.jsx b/src/tabviews/custom/components/module/voucher/voucherTable/index.jsx
index 3cc17cb..9a37f76 100644
--- a/src/tabviews/custom/components/module/voucher/voucherTable/index.jsx
+++ b/src/tabviews/custom/components/module/voucher/voucherTable/index.jsx
@@ -120,7 +120,10 @@
     editing: false,
     visible: false,
     counting: false,
-    priceing: false
+    priceing: false,
+    curring: false,
+    ratioing: false,
+    origining: false,
   }
 
   componentDidMount () {
@@ -174,6 +177,14 @@
       }
     }
 
+    if (line.foreign_currency_type === 'Y' && line.origin) {
+      if (line.debtor) {
+        line.unitratio = Math.round(line.debtor / line.origin * 100000) / 100000
+      } else if (line.creditor) {
+        line.unitratio = Math.round(line.creditor / line.origin * 100000) / 100000
+      }
+    }
+
     MKEmitter.emit('changeRecord', col.tableId, line)
 
     setTimeout(() => {
@@ -195,10 +206,8 @@
 
     if (col.field === 'subjectscode') {
       this.setState({editing: true}, () => {
-        try {
-          let node = document.getElementById(col.uuid + record.uuid)
-          node.click()
-        } catch(e) {}
+        let node = document.getElementById(col.uuid + record.uuid)
+        node && node.click()
       })
     } else {
       this.setState({editing: true, value: record[col.field]}, () => {
@@ -234,6 +243,14 @@
           line.price = Math.round(line.debtor / line.count * 10000) / 10000
         } else if (line.creditor) {
           line.price = Math.round(line.creditor / line.count * 10000) / 10000
+        }
+      }
+
+      if (line.foreign_currency_type === 'Y' && line.origin) {
+        if (line.debtor) {
+          line.unitratio = Math.round(line.debtor / line.origin * 100000) / 100000
+        } else if (line.creditor) {
+          line.unitratio = Math.round(line.creditor / line.origin * 100000) / 100000
         }
       }
 
@@ -282,6 +299,16 @@
       })
     }
 
+    if (line.foreign_currency_type === 'Y' && line.foreign_currency) {
+      let msg = window.GLOB.CacheVoucher.get(col.tableId)
+      let cur = msg ? msg.currency.filter(n => n.exratename === line.foreign_currency)[0] : null
+      if (cur) {
+        line = {...line, ...cur}
+      }
+
+      this.currencyChange(line)
+    }
+
     MKEmitter.emit('changeRecord', col.tableId, line)
 
     if (line.sup_accounting) {
@@ -292,6 +319,11 @@
       this.setState({counting: true, value: line.count || 0}, () => {
         let node = document.getElementById(col.uuid + record.uuid + 'count')
         node && node.select()
+      })
+    } else if (line.foreign_currency_type === 'Y') {
+      this.setState({curring: true}, () => {
+        let node = document.getElementById(col.uuid + record.uuid + 'currency')
+        node && node.click()
       })
     } else {
       this.setState({editing: false, visible: false, counting: false, priceing: false})
@@ -371,9 +403,7 @@
       line.count = 0
     }
 
-    if (line.count && line.price) {
-      line.debtor = Math.round(line.count * line.price * 100) / 100
-    }
+    this.countChange(line)
 
     MKEmitter.emit('changeRecord', col.tableId, line)
 
@@ -396,9 +426,7 @@
       line.count = 0
     }
 
-    if (line.count && line.price) {
-      line.debtor = Math.round(line.count * line.price * 100) / 100
-    }
+    this.countChange(line)
     
     MKEmitter.emit('changeRecord', col.tableId, line)
   }
@@ -414,9 +442,7 @@
       line.price = 0
     }
 
-    if (line.count && line.price) {
-      line.debtor = Math.round(line.count * line.price * 100) / 100
-    }
+    this.countChange(line)
 
     MKEmitter.emit('changeRecord', col.tableId, line)
 
@@ -439,16 +465,181 @@
       line.price = 0
     }
 
-    if (line.count && line.price) {
-      line.debtor = Math.round(line.count * line.price * 100) / 100
-    }
+    this.countChange(line)
     
     MKEmitter.emit('changeRecord', col.tableId, line)
   }
 
+  editCurrency = (e) => {
+    const { col, record } = this.props
+    e.stopPropagation()
+
+    this.setState({curring: true}, () => {
+      let node = document.getElementById(col.uuid + record.uuid + 'currency')
+      node && node.click()
+    })
+  }
+
+  onCurrSelectChange = (val, option) => {
+    const { col, record } = this.props
+
+    let line = {...record, ...option.props.extra}
+
+    this.currencyChange(line)
+
+    MKEmitter.emit('changeRecord', col.tableId, line)
+
+    if (line.exratename === 'CNY') {
+      this.setState({curring: false, origining: true, value: line.origin || 0}, () => {
+        let node = document.getElementById(col.uuid + record.uuid + 'origin')
+        node && node.select()
+      })
+    } else {
+      this.setState({curring: false, ratioing: true, value: line.unitratio || 1}, () => {
+        let node = document.getElementById(col.uuid + record.uuid + 'ratio')
+        node && node.select()
+      })
+    }
+  }
+
+  editRatio = (e) => {
+    const { col, record } = this.props
+    e.stopPropagation()
+
+    this.setState({ratioing: true, value: record.unitratio || 1}, () => {
+      let node = document.getElementById(col.uuid + record.uuid + 'ratio')
+      node && node.select()
+    })
+  }
+
+  ratioPress = () => {
+    const { col, record } = this.props
+    const { value } = this.state
+
+    let line = {...record}
+    line.unitratio = value || 1
+
+    if (isNaN(line.unitratio)) {
+      line.unitratio = 1
+    }
+
+    this.currencyChange(line)
+
+    MKEmitter.emit('changeRecord', col.tableId, line)
+
+    this.setState({ratioing: false, origining: true, value: line.origin || 0}, () => {
+      let node = document.getElementById(col.uuid + record.uuid + 'origin')
+        node && node.select()
+    })
+  }
+
+  ratioBlur = () => {
+    const { col, record } = this.props
+    const { value } = this.state
+
+    this.setState({ratioing: false})
+
+    let line = {...record}
+    line.unitratio = value || 1
+
+    if (isNaN(line.unitratio)) {
+      line.unitratio = 1
+    }
+
+    this.currencyChange(line)
+    
+    MKEmitter.emit('changeRecord', col.tableId, line)
+  }
+
+  editOrigin = (e) => {
+    const { col, record } = this.props
+    e.stopPropagation()
+
+    this.setState({origining: true, value: record.origin || 1}, () => {
+      let node = document.getElementById(col.uuid + record.uuid + 'origin')
+      node && node.select()
+    })
+  }
+
+  originPress = () => {
+    const { col, record } = this.props
+    const { value } = this.state
+
+    let line = {...record}
+    line.origin = value || 0
+
+    if (isNaN(line.origin)) {
+      line.origin = 0
+    }
+
+    this.currencyChange(line)
+
+    MKEmitter.emit('changeRecord', col.tableId, line)
+
+    this.setState({origining: false})
+
+    setTimeout(() => {
+      MKEmitter.emit('tdFocus', 'debtor' + record.uuid)
+    }, 50)
+  }
+
+  originBlur = () => {
+    const { col, record } = this.props
+    const { value } = this.state
+
+    this.setState({origining: false})
+
+    let line = {...record}
+    line.origin = value || 0
+
+    if (isNaN(line.origin)) {
+      line.origin = 0
+    }
+
+    this.currencyChange(line)
+    
+    MKEmitter.emit('changeRecord', col.tableId, line)
+  }
+
+  countChange = (line) => {
+    if (line.count && line.price) {
+      if (line.creditor) {
+        line.creditor = Math.round(line.count * line.price * 100) / 100
+      } else {
+        line.debtor = Math.round(line.count * line.price * 100) / 100
+      }
+
+      if (line.foreign_currency_type === 'Y' && line.origin) {
+        if (line.debtor) {
+          line.unitratio = Math.round(line.debtor / line.origin * 100000) / 100000
+        } else if (line.creditor) {
+          line.unitratio = Math.round(line.creditor / line.origin * 100000) / 100000
+        }
+      }
+    }
+  }
+
+  currencyChange = (line) => {
+    if (line.unitratio && line.origin) {
+      if (line.creditor) {
+        line.creditor = Math.round(line.unitratio * line.origin * 100) / 100
+      } else {
+        line.debtor = Math.round(line.unitratio * line.origin * 100) / 100
+      }
+
+      if (line.count_type === 'Y' && line.count) {
+        if (line.debtor) {
+          line.price = Math.round(line.debtor / line.count * 10000) / 10000
+        } else if (line.creditor) {
+          line.price = Math.round(line.creditor / line.count * 10000) / 10000
+        }
+      }
+    }
+  }
+
   render() {
     let { col, record, className } = this.props
-    const { editing, visible, counting, priceing } = this.state
+    const { editing, visible, counting, priceing, curring, ratioing, origining } = this.state
 
     let children = null
     let colSpan = 1
@@ -501,7 +692,7 @@
             >
               {subjects.map((item, i) => (<Select.Option key={i} extra={item} value={item.subjectscode}>{item.subjectscode + ' ' + item.subjectsname}</Select.Option>))}
             </Select>
-            <Popover overlayClassName="subject-pop-wrap" placement="bottom" title="杈呭姪鏍哥畻" visible={visible} content={<Accounting confirm={this.confirm} cancel={this.cancel} tableId={col.tableId} data={record}/>}>
+            <Popover overlayClassName="subject-pop-wrap" placement="bottom" title="" visible={visible} content={<Accounting confirm={this.confirm} cancel={this.cancel} tableId={col.tableId} data={record}/>}>
               <span className="pop-anchor"></span>
             </Popover>
           </>
@@ -517,53 +708,129 @@
             })
           }
 
+          let countNode = null
+          let currencyNode = null
+
           if (record.count_type === 'Y') {
             if (counting) {
-              children = <div className="content-wrap" onClick={this.focus}>
-                <div>{val}</div>
-                <div className="count-wrap">
-                  <span style={{marginRight: '5px'}}>
-                    <span>鏁伴噺锛�</span>
-                    <span><InputNumber className="inner-input" id={col.uuid + record.uuid + 'count'} defaultValue={record.count || 0} onChange={(val) => this.onChange(val)} onPressEnter={this.countPress} onBlur={this.countBlur}/></span>
-                  </span>
-                  <span onClick={this.editPrice}>
-                    <span>鍗曚环锛�</span>
-                    <span>{record.price || 0}</span>
-                  </span>
-                </div>
+              countNode = <div className="count-wrap">
+                <span style={{marginRight: '5px'}} onClick={(e) => e.stopPropagation()}>
+                  <span>鏁伴噺锛�</span>
+                  <span><InputNumber precision={4} className="inner-input" id={col.uuid + record.uuid + 'count'} defaultValue={record.count || 0} onChange={(val) => this.onChange(val)} onPressEnter={this.countPress} onBlur={this.countBlur}/></span>
+                </span>
+                <span onClick={this.editPrice}>
+                  <span>鍗曚环锛�</span>
+                  <span>{record.price || 0}</span>
+                </span>
               </div>
             } else if (priceing) {
-              children = <div className="content-wrap" onClick={this.focus}>
-                <div>{val}</div>
-                <div className="count-wrap">
-                  <span style={{marginRight: '5px'}} onClick={this.editCount}>
-                    <span>鏁伴噺锛�</span>
-                    <span>{record.count || 0}</span>
-                  </span>
-                  <span>
-                    <span>鍗曚环锛�</span>
-                    <span><InputNumber className="inner-input" id={col.uuid + record.uuid + 'price'} defaultValue={record.price || 0} onChange={(val) => this.onChange(val)} onPressEnter={this.pricePress} onBlur={this.priceBlur}/></span>
-                  </span>
-                </div>
+              countNode = <div className="count-wrap">
+                <span style={{marginRight: '5px'}} onClick={this.editCount}>
+                  <span>鏁伴噺锛�</span>
+                  <span>{record.count || 0}</span>
+                </span>
+                <span onClick={(e) => e.stopPropagation()}>
+                  <span>鍗曚环锛�</span>
+                  <span><InputNumber precision={4} className="inner-input" id={col.uuid + record.uuid + 'price'} defaultValue={record.price || 0} onChange={(val) => this.onChange(val)} onPressEnter={this.pricePress} onBlur={this.priceBlur}/></span>
+                </span>
               </div>
             } else {
-              children = <div className="content-wrap" onClick={this.focus}>
-                <div>{val}</div>
-                <div className="count-wrap">
-                  <span style={{marginRight: '5px'}} onClick={this.editCount}>
-                    <span>鏁伴噺锛�</span>
-                    <span>{record.count || 0}</span>
-                  </span>
-                  <span onClick={this.editPrice}>
-                    <span>鍗曚环锛�</span>
-                    <span>{record.price || 0}</span>
-                  </span>
-                </div>
+              countNode = <div className="count-wrap">
+                <span style={{marginRight: '5px'}} onClick={this.editCount}>
+                  <span>鏁伴噺锛�</span>
+                  <span>{record.count || 0}</span>
+                </span>
+                <span onClick={this.editPrice}>
+                  <span>鍗曚环锛�</span>
+                  <span>{record.price || 0}</span>
+                </span>
               </div>
             }
-          } else {
-            children = <div className="content-wrap" onClick={this.focus}>{val}</div>
           }
+
+          if (record.foreign_currency_type === 'Y') {
+            if (curring) {
+              let msg = window.GLOB.CacheVoucher.get(col.tableId)
+              let currency = msg ? msg.currency : []
+
+              currencyNode = <div className="count-wrap">
+                <span style={{marginRight: '5px'}} onClick={(e) => e.stopPropagation()}>
+                  <span>璐у竵锛�</span>
+                  <span>
+                    <Select
+                      className="currency-select"
+                      defaultValue={record.exratename || ''}
+                      dropdownClassName="edit-table-dropdown"
+                      id={col.uuid + record.uuid + 'currency'}
+                      onBlur={() => this.setState({curring: false})}
+                      onSelect={this.onCurrSelectChange}
+                    >
+                      {currency.map((item, i) => (<Select.Option key={i} extra={item} value={item.exratename}>{item.exratename}</Select.Option>))}
+                    </Select>
+                  </span>
+                </span>
+                <span style={{marginRight: '5px'}} onClick={this.editRatio}>
+                  <span>姹囩巼锛�</span>
+                  <span>{record.unitratio || 1}</span>
+                </span>
+                <span onClick={this.editOrigin}>
+                  <span>鍘熷竵锛�</span>
+                  <span>{record.origin || 0}</span>
+                </span>
+              </div>
+            } else if (ratioing) {
+              currencyNode = <div className="count-wrap">
+                <span style={{marginRight: '5px'}} onClick={this.editCurrency}>
+                  <span>璐у竵锛�</span>
+                  <span>{record.exratename || ''}</span>
+                </span>
+                <span style={{marginRight: '5px'}} onClick={(e) => e.stopPropagation()}>
+                  <span>姹囩巼锛�</span>
+                  <span><InputNumber precision={5} className="inner-input" id={col.uuid + record.uuid + 'ratio'} defaultValue={record.unitratio || 1} onChange={(val) => this.onChange(val)} onPressEnter={this.ratioPress} onBlur={this.ratioBlur}/></span>
+                </span>
+                <span onClick={this.editOrigin}>
+                  <span>鍘熷竵锛�</span>
+                  <span>{record.origin || 0}</span>
+                </span>
+              </div>
+            } else if (origining) {
+              currencyNode = <div className="count-wrap">
+                <span style={{marginRight: '5px'}} onClick={this.editCurrency}>
+                  <span>璐у竵锛�</span>
+                  <span>{record.exratename || ''}</span>
+                </span>
+                <span style={{marginRight: '5px'}} onClick={this.editRatio}>
+                  <span>姹囩巼锛�</span>
+                  <span>{record.unitratio || 1}</span>
+                </span>
+                <span onClick={(e) => e.stopPropagation()}>
+                  <span>鍘熷竵锛�</span>
+                  <span><InputNumber precision={2} className="inner-input" id={col.uuid + record.uuid + 'origin'} defaultValue={record.origin || 0} onChange={(val) => this.onChange(val)} onPressEnter={this.originPress} onBlur={this.originBlur}/></span>
+                </span>
+              </div>
+            } else {
+              currencyNode = <div className="count-wrap">
+                <span style={{marginRight: '5px'}} onClick={this.editCurrency}>
+                  <span>璐у竵锛�</span>
+                  <span>{record.exratename || ''}</span>
+                </span>
+                <span style={{marginRight: '5px'}} onClick={this.editRatio}>
+                  <span>姹囩巼锛�</span>
+                  <span>{record.unitratio || 1}</span>
+                </span>
+                <span onClick={this.editOrigin}>
+                  <span>鍘熷竵锛�</span>
+                  <span>{record.origin || 0}</span>
+                </span>
+              </div>
+            }
+          }
+
+          children = <div className="content-wrap" onClick={this.focus}>
+            {val}
+            {countNode}
+            {currencyNode}
+          </div>
         }
       }
     } else if (col.field === 'debtor') {
@@ -749,22 +1016,23 @@
 
   initData = (data) => {
     let _data = data.map((item, i) => {
-      item.uuid = Utils.getuuid()
+      // item.uuid = Utils.getguid()
       item.index = i
+      item.$origin = true
       
       return item
     })
 
     if (_data.length < 4) {
       for (let i = _data.length - 1; i < 4; i++) {
-        _data.push({uuid: Utils.getuuid(), index: i + 1, remark: '', subjectscode: '', subjectsname: '', debtor: '', creditor: ''})
+        _data.push({uuid: Utils.getguid(), index: i + 1, remark: '', subjectscode: '', subjectsname: '', debtor: '', creditor: ''})
       }
     }
     return _data
   }
 
   getTotalLine = (data) => {
-    let totalLine = {uuid: Utils.getuuid(), type: 'total'}
+    let totalLine = {uuid: Utils.getguid(), type: 'total'}
     let debtor = ''
     let creditor = ''
 
@@ -886,7 +1154,7 @@
       MKEmitter.emit('tdFocus', 'remark' + edData[record.index + 1].uuid)
     } else {
       let _data = fromJS(edData).toJS()
-      let line = {uuid: Utils.getuuid(), index: _data.length - 1, remark: record.remark || '', subjectscode: '', subjectsname: '', debtor: '', creditor: ''}
+      let line = {uuid: Utils.getguid(), index: _data.length - 1, remark: record.remark || '', subjectscode: '', subjectsname: '', debtor: '', creditor: ''}
 
       _data.splice(_data.length - 1, 0, line)
 
@@ -903,7 +1171,7 @@
     if (tid !== tableId) return
 
     let _data = fromJS(edData).toJS()
-    let line = {uuid: Utils.getuuid(), index: 0, remark: '', subjectscode: '', subjectsname: '', debtor: '', creditor: ''}
+    let line = {uuid: Utils.getguid(), index: 0, remark: '', subjectscode: '', subjectsname: '', debtor: '', creditor: ''}
 
     _data.splice(record.index, 0, line)
     _data = _data.map((item, index) => {
@@ -926,7 +1194,7 @@
 
     if (_data.length < 4) {
       for (let i = _data.length; i < 4; i++) {
-        _data.push({uuid: Utils.getuuid(), index: 0, remark: '', subjectscode: '', subjectsname: '', debtor: '', creditor: ''})
+        _data.push({uuid: Utils.getguid(), index: 0, remark: '', subjectscode: '', subjectsname: '', debtor: '', creditor: ''})
       }
     }
 
@@ -938,7 +1206,7 @@
     _data.push(this.getTotalLine(_data))
 
     this.setState({edData: _data})
-    this.props.onChange(_data)
+    this.props.onChange(_data, record.$origin ? record : null)
   }
 
   changeRecord = (tableId, record) => {
@@ -955,7 +1223,7 @@
     _data.pop()
 
     if (record.index === _data.length - 1) {
-      _data.push({uuid: Utils.getuuid(), index: record.index + 1, remark: '', subjectscode: '', subjectsname: '', debtor: '', creditor: ''})
+      _data.push({uuid: Utils.getguid(), index: record.index + 1, remark: '', subjectscode: '', subjectsname: '', debtor: '', creditor: ''})
     }
 
     _data.push(this.getTotalLine(_data))

--
Gitblit v1.8.0