JavascriptはExcelのような数式解析計算機能を実現します.
6278 ワード
目次背景 考え方 実現 背景
最近は給与システムを作っていますが、ある給与項目はユーザーがカスタマイズした公式によって自動的に計算できます.Excelで定義された公式のように計算できます.
例えば、給与計算式は、給与=基本給+業績評価賞+残業手当の実支給給与=給与の源泉徴収-住宅積立金の源泉徴収に対応するコードは、n 07=n 00+n 05 n 10=n 07-n 08-n 09です.
考え方正規表現マッチング計算式を使って、給与項目コード(n 00,n 04,n 05)を見つけました. は、マッチングした給与項目コードを対応する値 に置き換えます.は、eval()を使用して計算式導出結果を実行する .
実現する
変数
名前
部分データ展示
detail List
人員データ
n 00:10000、n 01:500、n 02:500、n 03:500、n 04:500、n 05:500、n 06:500、n 07:500、n 08:500、n 09:500、n 09:500、n 10:0、n 10:0、name:“李四”
detailヘッド
人的ヘッダデータ
「166 a dada 0 c 5992441 fba 1 bfc 1159 e 9 a 846」、itemid:「0」、itemName:「基本給」、itemCode:「n 00」、designFormulas:「」、「d26 afa 0 c 390202471 fba 1 bf 1 f 5 emf 5」、「dededededededededededededededededededededem」、「機能機能機能機能機能機能機能評価」、「機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能「324 afa 0 c 3902441 fba 1 bff1155 e 9 a 541」、itemid:「5」itemenName:「残業手当」、itemCode:「n 05」、designFormulas:「」、{id:「424 dfa0 c 3 a 02 a 41 fba1 bff1150 ae 9 a 516」、itemid:「7」、itemenName:「残業手当」、itemenCode:「n 07」、desigfffd+05「Formd+ffffd d d d+5+5+5+fffffffffd d d d d d d d d d d d d d+1+1+1+12+12+12++12+12++++12+12+++++12+1+1+12 affffffffffffffffd:「8」、iteme Name:「養老保険の掛け金代理」、itemaCode:「n 08」designFormulas:"""",{id:"b 24 dfa 0 c 3 a 02 f baba 1 bff1150 a 39 a 51 f",itemid:""""""""""",""""""",item Code:"住宅積立金",itemCode:"n 09",designFormulas:",",",,",",",",""",",","""","",""",",""""","""",""""""""",",",",",","""","""""""","""""""""""""","designFormulas:“n 07-n 08-n 09”}
design Formulas
数式を計算
アイテムコード
給与項目コード
計算式の項目に対応します.
したがって、計算式に対して計算並べ替えフィールドを追加し、ユーザーによってカスタマイズされ、順序付け順に計算します.
最近は給与システムを作っていますが、ある給与項目はユーザーがカスタマイズした公式によって自動的に計算できます.Excelで定義された公式のように計算できます.
例えば、給与計算式は、給与=基本給+業績評価賞+残業手当の実支給給与=給与の源泉徴収-住宅積立金の源泉徴収に対応するコードは、n 07=n 00+n 05 n 10=n 07-n 08-n 09です.
考え方
実現する
変数
名前
部分データ展示
detail List
人員データ
n 00:10000、n 01:500、n 02:500、n 03:500、n 04:500、n 05:500、n 06:500、n 07:500、n 08:500、n 09:500、n 09:500、n 10:0、n 10:0、name:“李四”
detailヘッド
人的ヘッダデータ
「166 a dada 0 c 5992441 fba 1 bfc 1159 e 9 a 846」、itemid:「0」、itemName:「基本給」、itemCode:「n 00」、designFormulas:「」、「d26 afa 0 c 390202471 fba 1 bf 1 f 5 emf 5」、「dededededededededededededededededededededem」、「機能機能機能機能機能機能機能評価」、「機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能機能「324 afa 0 c 3902441 fba 1 bff1155 e 9 a 541」、itemid:「5」itemenName:「残業手当」、itemCode:「n 05」、designFormulas:「」、{id:「424 dfa0 c 3 a 02 a 41 fba1 bff1150 ae 9 a 516」、itemid:「7」、itemenName:「残業手当」、itemenCode:「n 07」、desigfffd+05「Formd+ffffd d d d+5+5+5+fffffffffd d d d d d d d d d d d d d+1+1+1+12+12+12++12+12++++12+12+++++12+1+1+12 affffffffffffffffd:「8」、iteme Name:「養老保険の掛け金代理」、itemaCode:「n 08」designFormulas:"""",{id:"b 24 dfa 0 c 3 a 02 f baba 1 bff1150 a 39 a 51 f",itemid:""""""""""",""""""",item Code:"住宅積立金",itemCode:"n 09",designFormulas:",",",,",",",",""",",","""","",""",",""""","""",""""""""",",",",",","""","""""""","""""""""""""","designFormulas:“n 07-n 08-n 09”}
design Formulas
数式を計算
アイテムコード
給与項目コード
計算式の項目に対応します.
this.detailList.map(item=> {
this.detailHead.map(dh=> {
if(dh.designFormulas) {
let designFormulasCopy = dh.designFormulas;
let itemList = designFormulasCopy.match(/[A-Za-z]+[0-9]{2}/g) || [];
//
for(let i = 0; i < itemList.length; i++) {
let code = designFormulasCopy.match(/[A-Za-z]+[0-9]{2}/);
designFormulasCopy = designFormulasCopy.replace(code[0], item[code[0]]);
}
//
this.$set(item, dh.itemCode, eval(designFormulasCopy));
}
})
})
上の計算に問題があります.もし1行のデータに複数の給与項目が計算式があると、その中の一つの計算式の中の一つは別の計算式の結果に依存しますが、依存されている給与項目は後から計算されます.例えば実際の給料は給料に依存していますが、給料を支払うべきです.給料を計算してから実際の給料を支払うべきです.これは問題ないです.したがって、計算式に対して計算並べ替えフィールドを追加し、ユーザーによってカスタマイズされ、順序付け順に計算します.