settingIndexDrawer.vue 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051
  1. <script setup lang="ts">
  2. import { ref, reactive, watch } from "vue";
  3. import { ElMessageBox, ElMessage } from "element-plus";
  4. import { calculator } from "./evaluate";
  5. import {
  6. getIndexInfo,
  7. postUpdate,
  8. calculateScoreByConditionMoCondition
  9. } from "@/api/templateInfo";
  10. import { conditionVerify } from "@/api/formula";
  11. import jishuanqi from "./jishuanqi.vue";
  12. import type { DrawerProps, FormItemProps, FormProps } from "element-plus";
  13. // const itemLabelPosition = ref<FormItemProps["labelPosition"]>("");
  14. const drawer = ref(false);
  15. const disabledValue = ref(true);
  16. const direction = ref<DrawerProps["direction"]>("rtl");
  17. const formLabelAlign = reactive({
  18. name: "",
  19. region: "",
  20. grade: "",
  21. compute: "1",
  22. type: ""
  23. });
  24. const params = reactive({
  25. id: "",
  26. tpId: "",
  27. dimId: "",
  28. indId: "",
  29. valueInput: "",
  30. scoreStandard: 0,
  31. remark: "",
  32. scoreRule: "",
  33. targetValue: "",
  34. finalValue: "",
  35. formulaType: 0,
  36. challengeValue: "",
  37. startValue: "",
  38. datasoure: "",
  39. weight: "",
  40. scoreValue: "",
  41. formula: {
  42. noConditionFormula: ""
  43. }
  44. });
  45. // 详情信息
  46. const getIndexInfoApi = async id => {
  47. const { data, code, msg } = await getIndexInfo(id);
  48. // console.log("1111", data);
  49. if (code === 200) {
  50. Object.assign(params, data);
  51. if (isValidJSON(data.formula)) {
  52. if (params.formulaType == 0) {
  53. params.formula = JSON.parse(data.formula);
  54. } else if (params.formulaType == 1) {
  55. let aa = JSON.parse(data.formula);
  56. let bb = JSON.parse(aa.noConditionFormula);
  57. Object.assign(addmanyChange, bb);
  58. }
  59. }
  60. if (!data.formula) {
  61. params.formula = {
  62. noConditionFormula: ""
  63. };
  64. } else {
  65. }
  66. if (!data.formulaType) {
  67. params.formulaType = 0;
  68. }
  69. } else {
  70. ElMessage.error(msg);
  71. }
  72. };
  73. // 更新指标
  74. const postUpdateApi = async () => {
  75. if (params.formulaType == 0) {
  76. params.formula = JSON.stringify(params.formula);
  77. } else {
  78. params.formula = {
  79. noConditionFormula: ""
  80. };
  81. params.formula.noConditionFormula = JSON.stringify(addmanyChange);
  82. params.formula = JSON.stringify(params.formula);
  83. }
  84. const { msg, code } = await postUpdate(params);
  85. if (code === 200) {
  86. ElMessage({
  87. message: "编辑成功",
  88. type: "success"
  89. });
  90. disabledValue.value = true;
  91. editShow.value = true;
  92. drawer.value = !drawer.value;
  93. } else {
  94. ElMessage.error(msg);
  95. }
  96. };
  97. // 公式验证
  98. const dialogFormVisibleFormula = ref(false);
  99. const formulaForm = ref([]);
  100. const grade = ref();
  101. const conditionVerifyApi = async () => {
  102. dialogFormVisibleFormula.value = true;
  103. try {
  104. formulaForm.value = [];
  105. grade.value = "";
  106. console.log("params", params);
  107. const keywords = ["完成值", "目标值", "门槛值", "挑战值", "增幅", "降幅"];
  108. let str = params.formula.noConditionFormula;
  109. // 创建一个正则表达式,匹配这些关键词
  110. const regex = new RegExp(keywords.join("|"), "g");
  111. // 提取字符串中的所有关键词
  112. let matches = str.match(regex);
  113. console.log("匹配到的关键词:", matches);
  114. matches.forEach(matchItem => {
  115. formulaForm.value.push({
  116. name: matchItem,
  117. value: ""
  118. });
  119. });
  120. let result = str.replace(regex, match => {
  121. return `${match}`;
  122. });
  123. } catch (err) {
  124. //
  125. }
  126. };
  127. // 计算
  128. const countComputed = async () => {
  129. try {
  130. if (params.formulaType == 0) {
  131. const formula = JSON.stringify(params.formula);
  132. const aa = JSON.stringify(formula);
  133. console.log("formula", aa);
  134. const { code, msg } = await conditionVerify({
  135. formulaType: params.formulaType,
  136. formula: aa
  137. });
  138. if (code == 200) {
  139. const keywords = [
  140. "完成值",
  141. "目标值",
  142. "门槛值",
  143. "挑战值",
  144. "增幅",
  145. "降幅"
  146. ];
  147. let str = params.formula.noConditionFormula;
  148. // 创建一个正则表达式,匹配这些关键词
  149. const regex = new RegExp(keywords.join("|"), "g");
  150. let result = str.replace(regex, match => {
  151. // 在 formulaForm.value 中查找匹配的项
  152. let matchedItem = formulaForm.value.find(item => item.name === match);
  153. // 如果找到匹配项,返回其 value,否则返回原始匹配值
  154. if (matchedItem) {
  155. return matchedItem.value; // 替换为对应的值
  156. }
  157. return match; // 如果没有匹配项,返回原始匹配值
  158. });
  159. calculator.calculate(result);
  160. grade.value = calculator.get();
  161. } else {
  162. ElMessageBox.confirm(
  163. "如果不修改将无法计算得分",
  164. "公式计算错误,修改后确认",
  165. {
  166. type: "warning"
  167. }
  168. ).then(() => {
  169. dialogFormVisibleFormula.value = false;
  170. });
  171. }
  172. } else if (params.formulaType == 1) {
  173. let aa = JSON.parse(JSON.stringify(addmanyChange));
  174. aa.outerConditionValue = formulaForm.value[0].value;
  175. formulaForm.value.map((item, index) => {
  176. console.log("item", aa);
  177. if (index > 0) {
  178. delete aa.innerConditionExpression[index - 1].select;
  179. aa.innerConditionExpression[
  180. index - 1
  181. ].scoreRuleMoreInnerVO[0].innerConditionValue = item.value;
  182. }
  183. });
  184. const { code, msg, data } =
  185. await calculateScoreByConditionMoCondition(aa);
  186. console.log("aaa", aa);
  187. if (code == 200) {
  188. grade.value = data;
  189. } else {
  190. ElMessageBox.confirm(
  191. "如果不修改将无法计算得分",
  192. "公式计算错误,修改后确认",
  193. {
  194. type: "warning"
  195. }
  196. ).then(() => {
  197. dialogFormVisibleFormula.value = false;
  198. });
  199. }
  200. }
  201. } catch (err) {
  202. console.log(err);
  203. }
  204. };
  205. // 判断是否为json
  206. function isValidJSON(str) {
  207. try {
  208. JSON.parse(str);
  209. return true; // 如果解析成功,返回true
  210. } catch (e) {
  211. return false; // 如果解析失败,返回false
  212. }
  213. }
  214. const handleClose = (done: () => void) => {
  215. drawer.value = false;
  216. disabledValue.value = true;
  217. editShow.value = true;
  218. // ElMessageBox.confirm("配置项未保存,确认关闭", {
  219. // type: "warning"
  220. // }).then(() => {
  221. // });
  222. };
  223. function cancelClick() {
  224. drawer.value = false;
  225. disabledValue.value = true;
  226. editShow.value = true;
  227. }
  228. function confirmClick() {
  229. postUpdateApi();
  230. }
  231. const open = row => {
  232. drawer.value = true;
  233. Object.assign(params, {
  234. id: "",
  235. tpId: "",
  236. dimId: "",
  237. indId: "",
  238. valueInput: "",
  239. scoreStandard: 0,
  240. remark: "",
  241. scoreRule: "",
  242. targetValue: "",
  243. finalValue: "",
  244. formulaType: 0,
  245. challengeValue: "",
  246. startValue: "",
  247. datasoure: "",
  248. weight: "",
  249. scoreValue: "",
  250. formula: {
  251. noConditionFormula: ""
  252. }
  253. });
  254. Object.assign(addmanyChange, {
  255. outerConditionValue: "",
  256. innerConditionExpression: [
  257. {
  258. startValue: null,
  259. endValue: null,
  260. select: null,
  261. comparisonStart: null,
  262. comparisonEnd: null,
  263. scoreRuleMoreInnerVO: []
  264. }
  265. ]
  266. });
  267. getIndexInfoApi(row.id);
  268. };
  269. const editShow = ref(true);
  270. defineExpose({
  271. open
  272. });
  273. const timer = ref("");
  274. // 公式计算
  275. const compute = [
  276. {
  277. value: 0,
  278. label: "无条件公式"
  279. },
  280. {
  281. value: 1,
  282. label: "多条件公式"
  283. }
  284. ];
  285. const bgColor = ref(null);
  286. const rolesList = reactive({
  287. data: [
  288. { name: "完成值 / 目标值", id: 1 },
  289. { name: "完成值 - 目标值", id: 2 },
  290. { name: "目标值 - 完成值", id: 3 },
  291. { name: "门槛值", id: 4 },
  292. { name: "目标值", id: 5 },
  293. { name: "挑战值", id: 6 },
  294. { name: "完成值", id: 7 },
  295. { name: "增幅", id: 8 },
  296. { name: "降幅", id: 9 }
  297. ],
  298. value: "",
  299. num: null
  300. });
  301. // 监听formulaType变化
  302. const watchFormulaType = value => {
  303. if (value == 0 && typeof params.formula == "string") {
  304. let aa = JSON.parse(params.formula);
  305. params.formula = aa;
  306. params.formula.noConditionFormula = "";
  307. }
  308. };
  309. const lookRoles = item => {
  310. console.log("item", item);
  311. console.log("params", params);
  312. if (isValidJSON(params.formula)) {
  313. params.formula = JSON.parse(params.formula);
  314. }
  315. bgColor.value = item.id;
  316. params.formula.noConditionFormula =
  317. params.formula.noConditionFormula + item.name;
  318. };
  319. // 字符拼接
  320. const countNumber = (item: string) => {
  321. params.formula.noConditionFormula = params.formula.noConditionFormula + item;
  322. };
  323. // 清除
  324. const remove = () => {
  325. if (params.formula.noConditionFormula.length > 0) {
  326. params.formula.noConditionFormula = params.formula.noConditionFormula.slice(
  327. 0,
  328. -1
  329. );
  330. }
  331. };
  332. // 清空
  333. const removeVoid = () => {
  334. params.formula.noConditionFormula = "";
  335. };
  336. // 计算确认
  337. //
  338. const calculatorShow = ref(true);
  339. const count = item => {
  340. ElMessageBox.confirm("配置项确认保存?确认关闭", {
  341. type: "warning"
  342. }).then(() => {
  343. calculatorShow.value = false;
  344. });
  345. // try {
  346. // calculator.calculate(rolesList.value);
  347. // rolesList.num = calculator.get();
  348. // } catch (error) {
  349. // ElMessage({
  350. // message: "计算错误",
  351. // type: "warning"
  352. // });
  353. // console.log(error);
  354. // }
  355. };
  356. // 多条件公式
  357. const addmanyChange = reactive({
  358. outerConditionValue: "",
  359. innerConditionExpression: [
  360. {
  361. startValue: null,
  362. endValue: null,
  363. select: null,
  364. comparisonStart: null,
  365. comparisonEnd: null,
  366. scoreRuleMoreInnerVO: [
  367. // {
  368. // innerConditionValue: null,
  369. // scoreRules: [
  370. // {
  371. // score: null,
  372. // startValue: null,
  373. // select: "",
  374. // endValue: null,
  375. // comparisonStart: null,
  376. // comparisonEnd: null
  377. // }
  378. // ]
  379. // }
  380. ]
  381. }
  382. ]
  383. });
  384. // 添加子条件
  385. const addItemFormulaList = (item, index) => {
  386. addmanyChange.innerConditionExpression[index].scoreRuleMoreInnerVO = [
  387. {
  388. innerConditionValue: null,
  389. scoreRules: [
  390. {
  391. score: null,
  392. startValue: null,
  393. endValue: null,
  394. select: null,
  395. comparisonStart: null,
  396. comparisonEnd: null
  397. }
  398. ]
  399. }
  400. ];
  401. };
  402. const deleteItem = index => {
  403. addmanyChange.innerConditionExpression.splice(index, 1);
  404. };
  405. const dataleListItem = (index, indexList) => {
  406. addmanyChange.innerConditionExpression[
  407. index
  408. ].scoreRuleMoreInnerVO[0].scoreRules.splice(indexList, 1);
  409. };
  410. // 条件变量
  411. const dataleListItemAll = (item, index) => {
  412. item.scoreRuleMoreInnerVO = [];
  413. };
  414. const addNewItem = () => {
  415. addmanyChange.innerConditionExpression.push({
  416. startValue: null,
  417. endValue: null,
  418. select: null,
  419. comparisonStart: null,
  420. comparisonEnd: null,
  421. scoreRuleMoreInnerVO: []
  422. });
  423. };
  424. const addNewItemOldValue = item => {
  425. addmanyChange.innerConditionExpression.push({
  426. startValue: item.endValue,
  427. select: null,
  428. endValue: null,
  429. comparisonStart: item.comparisonEnd,
  430. comparisonEnd: null,
  431. scoreRuleMoreInnerVO: []
  432. });
  433. };
  434. const addItemDataList = (
  435. index: number,
  436. itemList: any,
  437. indexList: number,
  438. item
  439. ) => {
  440. addmanyChange.innerConditionExpression[
  441. index
  442. ].scoreRuleMoreInnerVO[0].scoreRules.push({
  443. select: null,
  444. score: null,
  445. startValue: itemList.endValue,
  446. endValue: null,
  447. comparisonStart: itemList.comparisonEnd,
  448. comparisonEnd: null
  449. });
  450. };
  451. // 多条件公式验证
  452. const manyConditions = () => {
  453. // outerConditionValue
  454. dialogFormVisibleFormula.value = true;
  455. formulaForm.value = [];
  456. console.log("1addmanyChange", addmanyChange);
  457. formulaForm.value.push({
  458. name: addmanyChange.outerConditionValue,
  459. value: null
  460. });
  461. addmanyChange.innerConditionExpression.map((item, index) => {
  462. formulaForm.value.push({
  463. name: item.scoreRuleMoreInnerVO[0].innerConditionValue,
  464. value: null
  465. });
  466. });
  467. };
  468. // 计算器
  469. const jishuanqiRef = ref();
  470. const countNoConditionFormula = item => {
  471. addmanyChange.outerConditionValue = item;
  472. };
  473. const jishuanqiRef1 = ref();
  474. const countNoConditionFormula1 = (item, index) => {
  475. addmanyChange.innerConditionExpression[index].endValue = item;
  476. };
  477. const jishuanqiRef2 = ref();
  478. const countNoConditionFormula2 = (item, index) => {
  479. // innerConditionValue
  480. addmanyChange.innerConditionExpression[
  481. index
  482. ].scoreRuleMoreInnerVO[0].innerConditionValue = item;
  483. };
  484. const jishuanqiRef3 = ref();
  485. const countNoConditionFormula3 = (item, index, indexList) => {
  486. addmanyChange.innerConditionExpression[
  487. index
  488. ].scoreRuleMoreInnerVO[0].scoreRules[indexList].endValue = item;
  489. };
  490. const countNoConditionFormula4 = (item, index, indexList) => {
  491. addmanyChange.innerConditionExpression[
  492. index
  493. ].scoreRuleMoreInnerVO[0].scoreRules[indexList].score = item;
  494. };
  495. </script>
  496. <template>
  497. <div>
  498. <el-drawer
  499. v-model="drawer"
  500. :direction="direction"
  501. :before-close="handleClose"
  502. size="700px"
  503. >
  504. <template #header>
  505. <h4>指标设置</h4>
  506. </template>
  507. <template #default>
  508. <div>
  509. <el-form label-position="top" label-width="auto" :model="params">
  510. <el-form-item label="完成值录入人" label-position="top">
  511. <el-select v-model="params.valueInput" placeholder="请选择">
  512. <el-option label="被考核人" :value="0" />
  513. <el-option label="上级" :value="1" />
  514. <el-option label="指定人员" :value="2" />
  515. <el-option label="考核管理员" :value="3" />
  516. <el-option label="指标自动采集" :value="4" />
  517. </el-select>
  518. </el-form-item>
  519. <el-form-item label="评分方式" label-position="top">
  520. <el-select v-model="params.scoreStandard" placeholder="请选择">
  521. <el-option label="手动输入" :value="0" />
  522. <el-option label="公式自动计算" :value="1" />
  523. </el-select>
  524. </el-form-item>
  525. <div v-if="params.scoreStandard === 1">
  526. <el-form-item label="公式类型" label-position="top">
  527. <el-select
  528. v-model="params.formulaType"
  529. placeholder="请选择"
  530. @change="watchFormulaType"
  531. >
  532. <el-option
  533. v-for="item in compute"
  534. :key="item.value"
  535. :label="item.label"
  536. :value="item.value"
  537. />
  538. </el-select>
  539. </el-form-item>
  540. <el-form-item
  541. v-if="params.formulaType === 0"
  542. label="公式设置"
  543. label-position="top"
  544. >
  545. <div>
  546. <div>
  547. <el-text>得分 =</el-text>
  548. <el-input
  549. v-model="params.scoreValue"
  550. class="ml-2 mr-2"
  551. style="width: 240px"
  552. />
  553. <el-text>
  554. <el-button type="primary" @click="conditionVerifyApi"
  555. >公式验证</el-button
  556. >
  557. </el-text>
  558. </div>
  559. <div
  560. v-if="calculatorShow"
  561. class="w-[500px] compute h-64 mt-1 ml-12 flex justify-evenly items-center"
  562. style="user-select: none"
  563. >
  564. <div class="w-1/3 h-60 pl-1 bg-white rounded-md">
  565. <div class="w-[100%] text-xs mt-2">
  566. <div><el-text type="info">:::变量</el-text></div>
  567. </div>
  568. <div v-for="item in rolesList.data" :key="item.id">
  569. <div
  570. :class="[
  571. 'cursor-pointer text-xs mt-1',
  572. { bgBack: bgColor === item.id }
  573. ]"
  574. @click="lookRoles(item)"
  575. >
  576. <el-text class="">{{ item.name }}</el-text>
  577. </div>
  578. </div>
  579. </div>
  580. <div class="w-3/5 ml-2 h-60 flex flex-col">
  581. <div class="w-[100%] text-xs h-24 bg-white rounded-md">
  582. <div class="p-1"><el-text>得分 = </el-text></div>
  583. <!-- style="height: 95px" -->
  584. <el-input
  585. v-model="params.formula.noConditionFormula"
  586. :rows="3"
  587. disabled
  588. type="textarea"
  589. placeholder='示例:"完成值" / "目标值" * 100'
  590. />
  591. </div>
  592. <div class="w-[100%] h-32 mt-2 rounded-md flex flex-col">
  593. <div class="flex justify-between h-8">
  594. <div
  595. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  596. @click="countNumber('1')"
  597. >
  598. 1
  599. </div>
  600. <div
  601. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  602. @click="countNumber('2')"
  603. >
  604. 2
  605. </div>
  606. <div
  607. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  608. @click="countNumber('3')"
  609. >
  610. 3
  611. </div>
  612. <div
  613. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  614. @click="countNumber('+')"
  615. >
  616. +
  617. </div>
  618. <div
  619. class="h-full w-[50px] text-white bg-orange-400 mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  620. @click="remove"
  621. >
  622. x
  623. </div>
  624. </div>
  625. <div class="flex justify-between h-8 mt-1">
  626. <div
  627. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  628. @click="countNumber('4')"
  629. >
  630. 4
  631. </div>
  632. <div
  633. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  634. @click="countNumber('5')"
  635. >
  636. 5
  637. </div>
  638. <div
  639. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  640. @click="countNumber('6')"
  641. >
  642. 6
  643. </div>
  644. <div
  645. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  646. @click="countNumber('-')"
  647. >
  648. -
  649. </div>
  650. <div
  651. class="text-xs h-full w-[50px] text-white bg-orange-400 mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  652. @click="removeVoid"
  653. >
  654. 清空
  655. </div>
  656. </div>
  657. <div class="flex justify-between h-16 mt-1">
  658. <div>
  659. <div class="flex justify-between">
  660. <div
  661. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  662. @click="countNumber('7')"
  663. >
  664. 7
  665. </div>
  666. <div
  667. class="h-full ml-1 w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  668. @click="countNumber('8')"
  669. >
  670. 8
  671. </div>
  672. <div
  673. class="h-full ml-2 w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  674. @click="countNumber('9')"
  675. >
  676. 9
  677. </div>
  678. <div
  679. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  680. @click="countNumber('*')"
  681. >
  682. *
  683. </div>
  684. </div>
  685. <div class="flex mt-1 justify-between">
  686. <div
  687. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  688. @click="countNumber('0')"
  689. >
  690. 0
  691. </div>
  692. <div
  693. class="h-full ml-1 w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  694. @click="countNumber('.')"
  695. >
  696. .
  697. </div>
  698. <div
  699. class="h-full ml-2 w-[50px] bg-white mx-1 flex justify-between items-center rounded-lg cursor-pointer"
  700. >
  701. <div
  702. class="w-1/2 h-full text-center border-r text-gray-100"
  703. @click="countNumber('(')"
  704. >
  705. <span class="text-black"> (</span>
  706. </div>
  707. <div
  708. class="w-1/2 h-full text-center"
  709. @click="countNumber(')')"
  710. >
  711. )
  712. </div>
  713. </div>
  714. <div
  715. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  716. @click="countNumber('/')"
  717. >
  718. /
  719. </div>
  720. </div>
  721. </div>
  722. <div
  723. class="h-full mr-1 w-[50px] text-white flex justify-center items-center rounded-lg cursor-pointer areYouOK"
  724. @click="count"
  725. >
  726. 确认
  727. </div>
  728. </div>
  729. </div>
  730. </div>
  731. </div>
  732. </div>
  733. </el-form-item>
  734. <el-form-item v-else label="公式设置">
  735. <div class="w-full">
  736. <div class="flex items-center">
  737. <el-text>条件值 = </el-text>
  738. <!-- <el-input
  739. v-model="addmanyChange.outerConditionValue"
  740. class="ml-2"
  741. style="width: 240px"
  742. /> -->
  743. <jishuanqi
  744. ref="jishuanqiRef"
  745. :outerConditionValue="addmanyChange.outerConditionValue"
  746. @handClick="countNoConditionFormula"
  747. />
  748. </div>
  749. <div class="w-full mt-2">
  750. <div
  751. v-for="(
  752. item, index
  753. ) in addmanyChange.innerConditionExpression"
  754. :key="index"
  755. >
  756. <div class="mt-3">
  757. <div class="flex">
  758. <el-text class="w-[15px]" type="primary">
  759. {{ index + 1 }}
  760. </el-text>
  761. <div class="w-[40px] ml-4">
  762. {{ item.startValue }}
  763. </div>
  764. <div class="mr-2">
  765. {{ item.comparisonStart }}
  766. </div>
  767. <div class="mr-2">条件值</div>
  768. <el-select
  769. v-model="item.comparisonEnd"
  770. style="width: 60px"
  771. placeholder=""
  772. >
  773. <el-option label=">" value=">" />
  774. <el-option label="≥" value="≥" />
  775. </el-select>
  776. <el-select
  777. v-model="item.select"
  778. class="ml-2"
  779. style="width: 80px"
  780. placeholder=""
  781. >
  782. <el-option label="数值" value="数值" />
  783. <el-option label="公式" value="公式" />
  784. </el-select>
  785. <jishuanqi
  786. v-if="item.select == '公式'"
  787. ref="jishuanqiRef"
  788. :index="index"
  789. :outerConditionValue="item.endValue"
  790. class="ml-2 mr-5"
  791. style="width: 80px"
  792. @handClick="countNoConditionFormula1"
  793. />
  794. <el-input
  795. v-else
  796. v-model="item.endValue"
  797. class="ml-2 mr-5"
  798. style="width: 80px"
  799. />
  800. <el-text type="danger" @click="deleteItem(index)">
  801. <el-icon>
  802. <Delete />
  803. </el-icon>
  804. </el-text>
  805. </div>
  806. <div
  807. v-for="(itemVO, indexOV) in item.scoreRuleMoreInnerVO"
  808. :key="indexOV"
  809. >
  810. <div class="flex mt-2 ml-20">
  811. <div class="mr-2">条件值{{ index + 1 }} =</div>
  812. <jishuanqi
  813. ref="jishuanqiRef"
  814. :index="index"
  815. :outerConditionValue="itemVO.innerConditionValue"
  816. class="ml-2 mr-6"
  817. style="width: 208px"
  818. @handClick="countNoConditionFormula2"
  819. />
  820. <!-- <el-input v-model="itemVO.innerConditionValue" class="ml-2 mr-6" style="width: 208px" /> -->
  821. <el-text
  822. type="danger"
  823. @click="dataleListItemAll(item, index)"
  824. >
  825. <el-icon>
  826. <Delete />
  827. </el-icon>
  828. </el-text>
  829. </div>
  830. <div
  831. v-for="(itemList, indexList) in itemVO.scoreRules"
  832. :key="indexList"
  833. class="ml-3"
  834. >
  835. <div class="flex mt-2 ml-16 items-center">
  836. <div class="text_border">{{ indexList + 1 }}</div>
  837. <!-- manyChange.dataList[index].dataList -->
  838. <div class="w-[40px] ml-2">
  839. {{ itemList.startValue }}
  840. </div>
  841. <div class="mr-2">
  842. {{ itemList.comparisonStart }}
  843. </div>
  844. <div class="mr-2">条件值{{ index + 1 }}</div>
  845. <el-select
  846. v-model="itemList.comparisonEnd"
  847. style="width: 60px"
  848. placeholder=""
  849. >
  850. <el-option label=">" value=">" />
  851. <el-option label="≥" value="≥" />
  852. </el-select>
  853. <el-select
  854. v-model="itemList.select"
  855. class="ml-2"
  856. style="width: 80px"
  857. placeholder=""
  858. >
  859. <el-option label="数值" value="数值" />
  860. <el-option label="公式" value="公式" />
  861. </el-select>
  862. <jishuanqi
  863. v-if="itemList.select == '公式'"
  864. ref="jishuanqiRef"
  865. :index="index"
  866. :indexList="indexList"
  867. :outerConditionValue="itemList.endValue"
  868. class="ml-2"
  869. style="width: 80px"
  870. @handClick="countNoConditionFormula3"
  871. />
  872. <el-input
  873. v-else
  874. v-model="itemList.endValue"
  875. class="ml-2"
  876. style="width: 80px"
  877. />
  878. <div
  879. class="w-[150px] ml-2 mr-2 flex justify-between items-center"
  880. >
  881. <div>得分</div>
  882. <div>=</div>
  883. <jishuanqi
  884. ref="jishuanqiRef"
  885. :index="index"
  886. :indexList="indexList"
  887. :outerConditionValue="itemList.score"
  888. class="ml-2"
  889. style="width: 80px"
  890. @handClick="countNoConditionFormula4"
  891. />
  892. <!-- <el-input
  893. v-model="itemList.score"
  894. class="ml-2"
  895. style="width: 80px"
  896. /> -->
  897. </div>
  898. <el-text
  899. type="danger"
  900. @click="dataleListItem(index, indexList)"
  901. >
  902. <el-icon>
  903. <Delete />
  904. </el-icon>
  905. </el-text>
  906. </div>
  907. <div
  908. v-if="indexList + 1 == itemVO.scoreRules.length"
  909. class="ml-16 mt-2 text-xs cursor-pointer"
  910. >
  911. <el-text
  912. type="primary"
  913. @click="
  914. addItemDataList(
  915. index,
  916. itemList,
  917. indexList,
  918. item
  919. )
  920. "
  921. >
  922. <el-icon>
  923. <Plus />
  924. </el-icon>
  925. 添加子条件
  926. </el-text>
  927. </div>
  928. </div>
  929. </div>
  930. </div>
  931. <div
  932. v-if="item?.scoreRuleMoreInnerVO?.length == 0"
  933. class="ml-20 mt-2 text-xs cursor-pointer"
  934. >
  935. <el-text
  936. type="primary"
  937. @click="addItemFormulaList(item, index)"
  938. >
  939. <el-icon>
  940. <Plus />
  941. </el-icon>
  942. 添加子条件
  943. </el-text>
  944. </div>
  945. <div
  946. v-if="
  947. addmanyChange.innerConditionExpression.length >= 1 &&
  948. index + 1 ==
  949. addmanyChange.innerConditionExpression.length
  950. "
  951. class="mt-5 text-xs cursor-pointer"
  952. >
  953. <el-text
  954. type="primary"
  955. @click="addNewItemOldValue(item)"
  956. >
  957. <el-icon>
  958. <Plus />
  959. </el-icon>
  960. 添加条件
  961. </el-text>
  962. </div>
  963. </div>
  964. <div
  965. v-if="addmanyChange.innerConditionExpression.length < 1"
  966. class="mt-5 text-xs cursor-pointer"
  967. >
  968. <el-text type="primary" @click="addNewItem">
  969. <el-icon>
  970. <Plus />
  971. </el-icon>
  972. 添加条件
  973. </el-text>
  974. </div>
  975. <div class="float-right mr-8">
  976. <el-button type="primary" @click="manyConditions"
  977. >公式验证</el-button
  978. >
  979. </div>
  980. </div>
  981. </div>
  982. </el-form-item>
  983. </div>
  984. </el-form>
  985. </div>
  986. </template>
  987. <template #footer>
  988. <div>
  989. <el-button @click="cancelClick">取消</el-button>
  990. <el-button type="primary" @click="confirmClick">确认</el-button>
  991. </div>
  992. </template>
  993. </el-drawer>
  994. <!-- 公式验证 -->
  995. <el-dialog v-model="dialogFormVisibleFormula" title="完成值" width="500">
  996. <el-form :model="formulaForm">
  997. <div v-for="(itemF, indexF) in formulaForm" :key="indexF">
  998. <el-form-item :label="itemF.name">
  999. <el-input v-model="itemF.value" autocomplete="off" />
  1000. </el-form-item>
  1001. </div>
  1002. <el-form-item label="得分">
  1003. <el-input v-model="grade" class="ml-3" autocomplete="off" disabled />
  1004. </el-form-item>
  1005. </el-form>
  1006. <template #footer>
  1007. <div class="dialog-footer">
  1008. <el-button @click="dialogFormVisibleFormula = false">取消</el-button>
  1009. <el-button type="primary" @click="countComputed"> 计算 </el-button>
  1010. </div>
  1011. </template>
  1012. </el-dialog>
  1013. </div>
  1014. </template>
  1015. <style lang="scss" scoped>
  1016. .compute {
  1017. // border: 1px solid #f3f3f3;
  1018. background-color: #f3f3f3;
  1019. border-radius: 5px;
  1020. }
  1021. .text-color {
  1022. color: #f3f3f3;
  1023. }
  1024. .areYouOK {
  1025. background-color: #409eff;
  1026. }
  1027. .bgBack {
  1028. background-color: #f3f3f3;
  1029. }
  1030. .text_border {
  1031. display: flex;
  1032. align-items: center;
  1033. justify-content: center;
  1034. width: 14px;
  1035. height: 14px;
  1036. // margin-top: 5px;
  1037. margin-right: 5px;
  1038. font-size: 12px;
  1039. border: 1px solid gray;
  1040. border-radius: 50%;
  1041. }
  1042. </style>