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