zm
2020-05-18 a18bfacbf56b401f6e0fdae8710fbca4df8cff77
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package com.changhong.epc.parsing.service.transition.billInfo.formula;
 
import com.changhong.epc.parsing.service.transition.billInfo.function.IFuncActuator;
import com.changhong.epc.parsing.service.transition.billInfo.function.impl.FuncActuatorImpl;
import com.changhong.epc.parsing.service.transition.billInfo.models.TransverterBillInfoPre;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
 
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/**
 * 转换票据 公式解析器
 * @ClassName: ExpressionOarser
 * @author [九鼎联合科技]
 * @date 2017年7月23日 下午4:33:18
 */
@Slf4j
public class  ExpressionOarser {
    
    //条件
    private String condition;
    //元素函数表
    private String elementList;
    
    private IFuncActuator funcFactory = new FuncActuatorImpl(); 
    private List<Boolean> funResultList = new ArrayList<>();
    
    public ExpressionOarser(TransverterBillInfoPre pre) {
        condition     = pre.getCondition();
        elementList     = pre.getElementList();
        funcFactory.setDate(pre.getMatchingVal());
    }
    
    
    // ----- js
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("javascript");
    
    /**
     * @throws Exception 
     * 执行表达式
     * @Title: execute
     * @param
     * @return void    返回类型
     * @throws
     */
    public Boolean execute(){
        if(StringUtils.isBlank(condition)){
            return true;
        }
        
        try {
            log.debug("----------计算函数--------");
            // 1. 计算函数 ok
            funResultList  = funcFactory.exeFunList(elementList);
            // 2. 填充表达式 
            log.debug("----------填充表达式 --------");
            String fillParam = fillParam();
            // 3. 执行表达式
            log.debug("----------执行表达式 --------");
            return exeJS(fillParam);
        } catch (Exception e) {
            log.debug("----------匹配发生异常 --------");
            log.error(e.toString());
            return false;
        }
    }
    
 
    /**
     * 为表达式填充参数
     * @Title: addParam
     * @param @throws Exception    设定文件
     * @return void    返回类型
     * @throws
     */
    public String fillParam(){
        Pattern pattern = Pattern.compile("[\\d]+");
        Map<String,String> indexRes = new HashMap<>();
        Matcher matcher = pattern.matcher(condition);
        int c  = 97;
        while(matcher.find()){
            String group     = matcher.group(),
                    key        = String.format("{%c}", c++);
            condition = condition.replaceFirst(group, key);
            indexRes.put(key, group);
            
        }
        // System.out.println(condition);
        
        for (String key : indexRes.keySet()) {
            // System.out.println();
            condition = condition.replace(key, 
                    " "+String.valueOf(
                    funResultList.get(
                            Integer.valueOf(indexRes.get(key))
                    )) +" "
            );
            
        }
        condition = condition.replaceAll(" and ", " && ");
        condition = condition.replaceAll(" or ", " || ");
        return condition;
        
    }
    
    
    
    private Boolean exeJS(String exeStr){
        log.debug(exeStr);
        Boolean eval = false;
        try {
            eval = (Boolean) engine.eval(exeStr);
        } catch (ScriptException e) {
            // System.err.println(e.getMessage());
        }
        return eval;
    }
    
    
}