| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | 
							- <?php
 
- namespace app\common\util;
 
- use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
 
- class Salary
 
- {
 
-     
 
-     public function evaluate(string $expression)
 
-     {
 
-         $language = new ExpressionLanguage();
 
-         try {
 
-             $result = $language->evaluate($expression);
 
-             return ['code' => 0, 'msg' => '计算成功','data'=>$result];
 
-         } catch (\Exception $exception) {
 
-             return ['code' => 999, 'msg' => '公式格式不正确,请检查'];
 
-         }
 
-     }
 
-     
 
-     public function compile(): void
 
-     {
 
-         $language = new ExpressionLanguage();
 
-         var_dump($language->compile('1 + 2')); 
 
-     }
 
-       
 
-     function checkSalaryItem($value, $num): array
 
-     {
 
-         $bj_num = substr_count($value, '#');
 
-         if ($bj_num % 2 == 0) {
 
-             if ($bj_num == 0 && $num > 0) {
 
-                 return \app\facade\Salary::evaluate($value);
 
-             }
 
-             if (!str_contains($value, '#')) {
 
-                 return \app\facade\Salary::evaluate($value);
 
-             }
 
-             $var = $this->getBetweenAB($value);
 
-             $res2 = (new SalaryItemModel)->detail(['variable' => $var]);
 
-             if (!$res2) {
 
-                 return ['code' => 999, 'msg' => '公式错误,变量' . $var . '未找到'];
 
-             }
 
-             $value = str_replace('#' . $var . '#', $res2->value, $value);
 
-             $num += 1;
 
-             return $this->checkSalaryItem($value, $num);
 
-         } else {
 
-             return ['code' => 999, 'msg' => '公式错误,请检查变量#符号数量是否准确'];
 
-         }
 
-     }
 
-     
 
-     private function getBetweenAB($str, string $begin = "#", string $end = "#"): string
 
-     {
 
-         if ($begin == '') return '';
 
-         $beginPos = mb_strpos($str, $begin);
 
-         if ($beginPos === false) return '';       
 
-         $start = $beginPos + mb_strlen($begin);       
 
-         if ($end == '') $endPos = mb_strlen($str);
 
-         else $endPos = mb_strpos($str, $end, $start); 
 
-         if ($endPos === false) $endPos = mb_strlen($str);
 
-         $length = $endPos - $start;                   
 
-         return mb_substr($str, $start, $length);
 
-     }
 
- }
 
 
  |