From 6d837c791e3c303e9176575559a2bb41af6154f5 Mon Sep 17 00:00:00 2001
From: haoxuan <haoxuan>
Date: 星期四, 25 四月 2024 18:45:00 +0800
Subject: [PATCH] 检查计费公式的校验,常用符号不能相邻,被除数不能为0,可选数据不能相邻等逻辑校验

---
 src/views/employeeSalary/salaryPlan/components/addDialog.vue |  445 +++++++++++++++++++++++++++++++++---------------------
 1 files changed, 271 insertions(+), 174 deletions(-)

diff --git a/src/views/employeeSalary/salaryPlan/components/addDialog.vue b/src/views/employeeSalary/salaryPlan/components/addDialog.vue
index cd33fac..17dd835 100644
--- a/src/views/employeeSalary/salaryPlan/components/addDialog.vue
+++ b/src/views/employeeSalary/salaryPlan/components/addDialog.vue
@@ -30,7 +30,7 @@
               v-for="item in workTypeList"
               :key="item.ID"
               :label="item.workName"
-              :value="item"
+              :value="{ value: item.ID, label: item.workName }"
             >
             </el-option>
           </el-select>
@@ -55,21 +55,27 @@
             @click="handleUnitShow"
           ></i>
         </el-form-item>
-        <el-form-item prop="salaryFormula" label="璁¤垂鍏紡瀹氫箟">
+        <el-form-item prop="salaryFormulaHtml" label="璁¤垂鍏紡瀹氫箟">
           <!-- <el-input
             type="textarea"
             :autosize="{ minRows: 4, maxRows: 6}"
             disabled
             placeholder="璇疯緭鍏ュ唴瀹�"
-            v-model="form.salaryFormula"
+            v-model="form.salaryFormulaHtml"
           >
           </el-input> -->
-          <div class="formula-input" v-html="form.salaryFormula"></div>
-          <el-button class='formula-btn' type="text" @click="checkFormula()">妫�鏌ュ叕寮�</el-button>
+          <div class="formula-input" v-html="form.salaryFormulaHtml"></div>
+          <el-button class="formula-btn" type="text" @click="checkFormula()"
+            >妫�鏌ュ叕寮�</el-button
+          >
         </el-form-item>
-        <div class="formula-error" >
-         <span v-if="form.error==1"> 鏃犻敊璇紝鍙斁蹇冧娇鐢� ! </span>
-         <span v-if="form.error==2"> 鍏紡鏈夐敊璇紝璇锋鏌� ! </span>
+        <div class="formula-error">
+          <span v-if="form.error == 1" class="color_blue">
+            鏃犻敊璇紝鍙斁蹇冧娇鐢� !
+          </span>
+          <span v-if="form.error == 2" class="color_red">
+            鍏紡鏈夐敊璇紝璇锋鏌� !
+          </span>
         </div>
         <div class="formula-box">
           <div class="table-bottom-tabs">
@@ -97,35 +103,51 @@
           <div class="formula-bottom-box">
             <div class="formula-l">
               <div class="formula-p">鍙�夋暟鎹�</div>
-              <div class="formula-bottom" v-if="activeName==1">
-                <div  :class="item.width==2?'formula-item-100':'formula-item'" v-for='item in formulaName' :key="item.name">
+              <div class="formula-bottom" v-if="activeName == 1">
+                <div
+                  :class="item.width == 2 ? 'formula-item-100' : 'formula-item'"
+                  v-for="item in formulaName"
+                  :key="item.name"
+                >
                   <span @click="formulaClick(item)"> {{ item.name }}</span>
-                    <i
-                      v-if="item.type==1"
-                      class="el-icon-setting margin_left_5px  cursor_pointer"
-                      style="font-size: 18px; color: gray"
-                      @click="handleSlikSetShow"
-                    ></i>
+                  <i
+                    v-if="item.type == 1"
+                    class="el-icon-setting margin_left_5px cursor_pointer"
+                    style="font-size: 18px; color: gray"
+                    @click="handleSlikSetShow"
+                  ></i>
                 </div>
               </div>
-              <div class="formula-bottom" v-if="activeName==2">
-                <div  :class="item.width==2?'formula-item-100':'formula-item'" v-for='item in formulaNameTwo' :key="item.name">
-                 <span @click="formulaClick(item)"> {{ item.name }}</span>
-                 <i
-                      v-if="item.type==2"
-                      class="el-icon-setting margin_left_5px  cursor_pointer"
-                      style="font-size: 18px; color: gray"
-                      @click="handleConstSetShow(2)"
-                    ></i>
+              <div class="formula-bottom" v-if="activeName == 2">
+                <div
+                  :class="item.width == 2 ? 'formula-item-100' : 'formula-item'"
+                  v-for="item in formulaNameTwo"
+                  :key="item.name"
+                >
+                  <span @click="formulaClick(item)"> {{ item.name }}</span>
+                  <i
+                    v-if="item.type == 2"
+                    class="el-icon-setting margin_left_5px cursor_pointer"
+                    style="font-size: 18px; color: gray"
+                    @click="handleConstSetShow(2)"
+                  ></i>
                 </div>
               </div>
             </div>
             <div class="formula-r">
               <div class="formula-p">甯哥敤绗﹀彿/浜ч噺</div>
               <div class="formula-bottom">
-                <div  :class="item.width==2?'formula-item-100':'formula-item'" v-for='item in formulaSymbol' :key="item.name">
-                  <span v-if="item.type==3" @click="handleConstSetShow(3)"> {{ item.name }}</span>
-                  <span v-else @click="formulaClick(item)"> {{ item.name }}</span>
+                <div
+                  :class="item.width == 2 ? 'formula-item-100' : 'formula-item'"
+                  v-for="item in formulaSymbol"
+                  :key="item.name"
+                >
+                  <span v-if="item.type == 3" @click="handleConstSetShow(3)">
+                    {{ item.name }}</span
+                  >
+                  <span v-else @click="formulaClick(item)">
+                    {{ item.name }}</span
+                  >
                 </div>
               </div>
             </div>
@@ -154,7 +176,7 @@
       @confirmValueSave="confirmValueSave"
       :constType="constType"
       :editRow="form"
-      :title="constType==2?'閰嶇疆':'杈撳叆'"
+      :title="constType == 2 ? '閰嶇疆' : '杈撳叆'"
     ></ConstantSetDialog>
   </div>
 </template>
@@ -167,14 +189,14 @@
 } from "@/api/employeeSalary/salaryPlan.js";
 import { getWorkTypeList } from "@/api/employeeManage/employeeInfo.js";
 import BomDialog from "@/views/employeeSalary/salaryPlan/components/bomDialog.vue";
-import SilkSetDialog from "@/views/employeeSalary/salaryPlan/components/SilkSetDialog.vue"; 
-import ConstantSetDialog from "@/views/employeeSalary/salaryPlan/components/ConstantSetDialog.vue"; 
+import SilkSetDialog from "@/views/employeeSalary/salaryPlan/components/SilkSetDialog.vue";
+import ConstantSetDialog from "@/views/employeeSalary/salaryPlan/components/ConstantSetDialog.vue";
 export default {
-  components: { 
+  components: {
     BomDialog,
     SilkSetDialog,
-    ConstantSetDialog
-   },
+    ConstantSetDialog,
+  },
   props: {
     editRow: {
       type: Object,
@@ -188,91 +210,92 @@
         workTypes: [],
         salaryType: "",
         salaryFormula: "",
-        error:'',
-        purchaseTypeList:[1],
-        cycle:1,
+        salaryFormulaHtml: "",
+        error: "",
+        purchaseTypeList: [1],
+        cycle: '1',
       },
       activeName: 1,
-      formulaName:[
+      formulaName: [
         {
-          name:'鏃ヤ骇涓濋噺',
+          name: "鏃ヤ骇涓濋噺",
         },
         {
-          name:'閲庣氦鏁伴噺',
-          type:1,
+          name: "閲庣氦鏁伴噺",
+          type: 1,
         },
         {
-          name:'鐢熶笣鍗曚环',
+          name: "鐢熶笣鍗曚环",
         },
         {
-          name:'閲庣氦鍗曚环',
+          name: "閲庣氦鍗曚环",
         },
         {
-          name:'妗舵暟(鏃�)',
+          name: "妗舵暟(鏃�)",
         },
         {
-          name:'鍑哄嫟澶╂暟',
+          name: "鍑哄嫟澶╂暟",
         },
         {
-          name:'鍚岀粍鎸¤溅宸ユ湀骞冲潎宸ヨ祫',
-          width:2
+          name: "鍚岀粍鎸¤溅宸ユ湀骞冲潎宸ヨ祫",
+          width: 2,
         },
         {
-          name:'鍚岀粍杞﹀ご宸ュ伐璧�',
-          width:2
-        }
-      ],
-      formulaNameTwo:[
-        {
-          name:'宸ヤ綔鏃ュ姞鐝椂闀�',
-        },
-        {
-          name:'婊″嫟濂�',
-          type:2,
-        },
-        {
-          name:'浼戞伅鏃ュ姞鐝椂闀�',
-        },
-        {
-          name:'璇峰亣澶╂暟',
-        },
-        {
-          name:'甯﹀緬澶╂暟',
-        },
-        {
-          name:'宸ラ緞',
-        },
-        {
-          name:'鍑哄嫟澶╂暟',
+          name: "鍚岀粍杞﹀ご宸ュ伐璧�",
+          width: 2,
         },
       ],
-      formulaSymbol:[
+      formulaNameTwo: [
         {
-          name:'+',
-          background:'background_red',
+          name: "宸ヤ綔鏃ュ姞鐝椂闀�",
         },
         {
-          name:'-',
-          background:'background_red',
+          name: "婊″嫟濂�",
+          type: 2,
         },
         {
-          name:'/',
-          background:'background_red',
+          name: "浼戞伅鏃ュ姞鐝椂闀�",
         },
         {
-          name:'*',
-          background:'background_red',
+          name: "璇峰亣澶╂暟",
         },
         {
-          name:'(',
+          name: "甯﹀緬澶╂暟",
         },
         {
-          name:')',
+          name: "宸ラ緞",
         },
         {
-          name:'甯搁噺鏁板瓧',
-          type:3,
-          width:2
+          name: "鍑哄嫟澶╂暟",
+        },
+      ],
+      formulaSymbol: [
+        {
+          name: "+",
+          background: "background_red",
+        },
+        {
+          name: "-",
+          background: "background_red",
+        },
+        {
+          name: "/",
+          background: "background_red",
+        },
+        {
+          name: "*",
+          background: "background_red",
+        },
+        {
+          name: "(",
+        },
+        {
+          name: ")",
+        },
+        {
+          name: "甯搁噺鏁板瓧",
+          type: 3,
+          width: 2,
         },
       ],
       workTypeList: [], //宸ョ
@@ -290,12 +313,12 @@
         salaryType: [
           { required: true, message: "璇烽�夋嫨", trigger: ["blur", "change"] },
         ],
-        salaryFormula: [
+        salaryFormulaHtml: [
           { required: true, message: "璇烽�夋嫨", trigger: ["blur", "change"] },
         ],
       },
       unitList: [],
-      constType:'',
+      constType: "",
     };
   },
   computed: {},
@@ -319,40 +342,107 @@
       this.activeName = activeName;
     },
     // 鐐瑰嚮鐢熶骇鏁版嵁鍜岃�冨嫟鍙婅ˉ璐存暟鎹� 璧嬪�艰璐瑰叕寮忓畾涔�
-    formulaClick(item,value){
-      let string=''
-      let name=(item.type==3&&item.name=='甯搁噺鏁板瓧')?value:item.name
-      if(item.background){
-        string="<span class='formula-input-item background_red color_fff'>"+ name +"</span>"
-      }else{
-        string="<span class='formula-input-item background_e3e3e3'>"+ name +"</span>"
+    formulaClick(item, value) {
+      let string = "";
+      let name = item.type == 3 && item.name == "甯搁噺鏁板瓧" ? value : item.name;
+      if (item.background) {
+        string =
+          "<span class='formula-input-item background_red color_fff'>" +
+          name +
+          "</span>";
+      } else {
+        string =
+          "<span class='formula-input-item background_e3e3e3'>" +
+          name +
+          "</span>";
       }
-      this.form.salaryFormula= this.form.salaryFormula+string;
-      this.$forceUpdate()
+      this.form.salaryFormula = this.form.salaryFormula + name + "锛�";
+      this.form.salaryFormulaHtml = this.form.salaryFormulaHtml + string;
+      this.$forceUpdate();
     },
-    checkFormula(){
+    checkFormula() {
+      if (this.form.salaryFormula) {
+        let string = true;
+        let isString = '+-*/';
+        let arr = this.form.salaryFormula.split("锛�");
+        arr=arr.splice(0,arr.length-1)
+        for (let i=0;i<arr.length;i++) {
+          if (arr[i] != "") {
+            // 闄ゆ暟涓嶈兘涓�0, 绗﹀彿閭h竟闇�瑕佹湁鍊�
+            if (isString.indexOf(arr[i]) != -1 || arr[i] == "(") {
+              if (i != 0) {
+                if (isString.indexOf(arr[i - 1]) != -1) {
+                  string = false;
+                  break;
+                }
+              }
+              if (i == arr.length - 1) {
+                string = false;
+                break;
+              }
+              if (i < arr.length - 1) {
+                if (isString.indexOf(arr[i + 1]) != -1) {
+                  string = false;
+                  break;
+                } else if (arr[i] == "/" && arr[i + 1] == 0) {
+                  string = false;
+                  break;
+                }
+              }
+            } else if (arr[i] == ")") {
+              if (i < arr.length - 1) {
+                if (isString.indexOf(arr[i+1]) == -1) {
+                  string = false;
+                  break;
+                }
+              }
+            } else {
+              if (i != 0) {
+                if (isString.indexOf(arr[i - 1]) == -1 && arr[i - 1] != "(") {
+                  string = false;
+                  break;
+                }
+              }
+              if (i < arr.length - 1) {
+                if (isString.indexOf(arr[i + 1]) == -1 && arr[i + 1] != ")") {
+                  string = false;
+                  break;
+                }
+              }
+            }
+          }
+        }
 
+        if (!string) {
+          this.form.error = 2;
+        } else {
+          this.form.error = 1;
+        }
+      }
     },
-    confirmValueSave(form,type){
-      if(type==1){
-        this.form.purchaseTypeList=form.purchaseTypeList;
-      }else if(type==2){
-        this.form.cycle=form.cycle
-      }else if(type==3){
-        this.formulaClick({
-          name:'甯搁噺鏁板瓧',
-          type:3,
-          width:2
-        },form.number)
+    confirmValueSave(form, type) {
+      if (type == 1) {
+        this.form.purchaseTypeList = form.purchaseTypeList;
+      } else if (type == 2) {
+        this.form.cycle = form.cycle+'';
+      } else if (type == 3) {
+        this.formulaClick(
+          {
+            name: "甯搁噺鏁板瓧",
+            type: 3,
+            width: 2,
+          },
+          form.number
+        );
       }
     },
     // 閲庣氦鏁伴噺
-    handleSlikSetShow(){
+    handleSlikSetShow() {
       this.$refs.silkSetDialog.islook = true;
     },
     // 婊″嫟濂�
-    handleConstSetShow(val){
-      this.constType=val;
+    handleConstSetShow(val) {
+      this.constType = val;
       this.$refs.constantSetDialog.islook = true;
     },
     // 鍗曚綅
@@ -387,9 +477,10 @@
           workTypes: [],
           salaryType: "",
           salaryFormula: "",
-          error:'',
-          purchaseTypeList:[1],
-          cycle:1,
+          salaryFormulaHtml: "",
+          error: "",
+          purchaseTypeList: [1],
+          cycle: '1',
         };
         this.$nextTick(() => {
           this.$refs["form"].resetFields();
@@ -421,8 +512,11 @@
       this.$refs[formName].validate((valid) => {
         if (valid) {
           let form = JSON.parse(JSON.stringify(this.form));
-          if(form.purchaseTypeList.length==0){
-            this.$message.error('璇风偣鍑婚噹绾ゆ暟閲忛厤缃敓涓濇爣鍑嗭紒')
+          let arr = form.salaryFormula.split("锛�");
+           arr=arr.splice(0,arr.length-1)
+           form.salaryFormula=arr.join("锛�")
+          if (form.purchaseTypeList.length == 0) {
+            this.$message.error("璇风偣鍑婚噹绾ゆ暟閲忛厤缃敓涓濇爣鍑嗭紒");
             return true;
           }
           saveSalaryPlan(form).then((res) => {
@@ -448,78 +542,81 @@
   width: 90%;
   margin-bottom: 40px;
   margin: 0 auto;
-  .formula-box{
-    height:auto;
-    width:calc(100% - 110px);
-    font-size:14px;
-    line-height:25px;
-    padding-left:110px;
-    .formula-bottom-box{
-      width:100%;
-      height:auto;
-      overflow:hidden;
-      margin-bottom:30px;
-      .formula-p{
-        line-height:40px;
+  .formula-box {
+    height: auto;
+    width: calc(100% - 110px);
+    font-size: 14px;
+    line-height: 25px;
+    padding-left: 110px;
+    .formula-bottom-box {
+      width: 100%;
+      height: auto;
+      overflow: hidden;
+      margin-bottom: 30px;
+      .formula-p {
+        line-height: 40px;
       }
-      .formula-l,.formula-r{
-        height:auto;
-        float:left;
+      .formula-l,
+      .formula-r {
+        height: auto;
+        float: left;
       }
-      .formula-l{
-        width:calc(75% - 10px);
-        margin-right:20px;
+      .formula-l {
+        width: calc(75% - 10px);
+        margin-right: 20px;
       }
-      .formula-r{
-        width:calc(25% - 10px);
+      .formula-r {
+        width: calc(25% - 10px);
       }
-      .formula-item-100{
-        width:100%;
-        margin-bottom:10px;
-        span{
+      .formula-item-100 {
+        width: 100%;
+        margin-bottom: 10px;
+        span {
           cursor: pointer;
-          padding:5px 10px;
+          padding: 5px 10px;
         }
       }
-      .formula-item{
-        width:calc(50% - 5px);
-        margin-bottom:10px;
-        float:left;
+      .formula-item {
+        width: calc(50% - 5px);
+        margin-bottom: 10px;
+        float: left;
         &:nth-of-type(odd) {
           margin-right: 10px;
         }
-        span{
+        span {
           cursor: pointer;
-          padding:5px 10px;
+          padding: 5px 10px;
         }
       }
-      .formula-bottom{
-        padding:15px 10px;
-        background:#f3f3f3;
-        overflow:hidden;
+      .formula-bottom {
+        padding: 15px 10px;
+        background: #f3f3f3;
+        overflow: hidden;
       }
     }
   }
-  .formula-input{
-      width:calc(100% - 100px);
-      height:100px;
-      padding:10px 10px;
-      overflow-y:auto;
-      background:#F5F7FA;
-      border:1px solid #E4E7ED;
-      cursor:not-allowed;
-      float:left;
-      margin-right:20px;
-    }
-    .formula-btn{
-      float:left;
-      margin-top:80px;
-    }
-    .formula-error{
-      width:100%;
-      line-height:28px;
-      font-size:12px;
-    }
+  .formula-input {
+    width: calc(100% - 100px);
+    height: 100px;
+    padding: 10px 10px;
+    overflow-y: auto;
+    background: #f5f7fa;
+    border: 1px solid #e4e7ed;
+    cursor: not-allowed;
+    float: left;
+    margin-right: 20px;
+  }
+  .formula-btn {
+    float: left;
+    margin-top: 80px;
+  }
+  .formula-error {
+    width: calc(100% - 110px);
+    line-height: 28px;
+    font-size: 14px;
+    margin-left: 110px;
+    margin-bottom: 10px;
+  }
 }
 
 ::v-deep {

--
Gitblit v1.8.0