settingIndexDrawer.vue 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516
  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 {
  13. postListTreeWithUser,
  14. postListTree,
  15. postListTreeWithUserApi,
  16. treeDept
  17. } from "@/api/department";
  18. import type { DrawerProps, FormItemProps, FormProps } from "element-plus";
  19. // const itemLabelPosition = ref<FormItemProps["labelPosition"]>("");
  20. const drawer = ref(false);
  21. const disabledValue = ref(true);
  22. const GONG_SHI = ["完成值", "目标值", "门槛值", "挑战值", "增幅", "降幅"];
  23. // 判断 score 字符串是否包含 GONG_SHI 中的关键字
  24. function containsKeywordInScore(score, keywordss) {
  25. // 确保 score 是字符串,keywords 是数组
  26. if (score && typeof score == "string") {
  27. const cleanedScore = score.replace(/[\s\-]/g, ""); // 去除空格和破折号
  28. const cleanedKeywords = keywordss.map(keyword =>
  29. keyword.replace(/[\s\-]/g, "")
  30. );
  31. return cleanedKeywords.some(keyword => cleanedScore.includes(keyword));
  32. // 遍历 keywords 数组,检查 score 是否包含其中的任何一个关键字
  33. } else {
  34. return false;
  35. }
  36. }
  37. const direction = ref<DrawerProps["direction"]>("rtl");
  38. const formLabelAlign = reactive({
  39. name: "",
  40. region: "",
  41. grade: "",
  42. compute: "1",
  43. type: ""
  44. });
  45. const params = reactive({
  46. id: "",
  47. tpId: "",
  48. dimId: "",
  49. indId: "",
  50. valueInput: "",
  51. scoreStandard: 0,
  52. designatedPersonnel: "",
  53. remark: "",
  54. scoreRule: "",
  55. targetValue: "",
  56. finalValue: "",
  57. formulaType: 0,
  58. challengeValue: "",
  59. startValue: "",
  60. datasoure: "",
  61. weight: "",
  62. scoreValue: "",
  63. formula: {
  64. noConditionFormula: ""
  65. }
  66. });
  67. // 详情信息
  68. const getIndexInfoApi = async id => {
  69. const { data, code, msg } = await getIndexInfo(id);
  70. // console.log("1111", data);
  71. if (code === 200) {
  72. Object.assign(params, data);
  73. if (data.designatedPersonnel) {
  74. params.personList = data.designatedPersonnel.split(",");
  75. }
  76. if (isValidJSON(data.formula)) {
  77. if (params.formulaType == 0) {
  78. params.formula = JSON.parse(data.formula);
  79. } else if (params.formulaType == 1) {
  80. let aa = JSON.parse(data.formula);
  81. let bb = JSON.parse(aa.noConditionFormula);
  82. Object.assign(addmanyChange, bb);
  83. }
  84. }
  85. if (!data.formula) {
  86. params.formula = {
  87. noConditionFormula: ""
  88. };
  89. } else {
  90. }
  91. if (!data.formulaType) {
  92. params.formulaType = 0;
  93. }
  94. } else {
  95. ElMessage.error(msg);
  96. }
  97. };
  98. const $emit = defineEmits(["refresh"]);
  99. // 更新指标
  100. const postUpdateApi = async () => {
  101. if (params.formulaType == 0) {
  102. params.formula = JSON.stringify(params.formula);
  103. } else {
  104. params.formula = {
  105. noConditionFormula: ""
  106. };
  107. // 判断是公式还是数字
  108. if (containsKeywordInScore(addmanyChange.outerConditionValue, GONG_SHI)) {
  109. addmanyChange.outerConditionValueExpress =
  110. addmanyChange.outerConditionValue;
  111. }
  112. addmanyChange.innerConditionExpression.map(inn => {
  113. if (containsKeywordInScore(inn?.startValue, GONG_SHI)) {
  114. inn.startExpress = inn.startValue;
  115. }
  116. if (containsKeywordInScore(inn?.endValue, GONG_SHI)) {
  117. inn.endExpress = inn.endValue;
  118. }
  119. if (containsKeywordInScore(inn?.innerScore, GONG_SHI)) {
  120. inn.innerScoreExpress = inn.innerScore;
  121. }
  122. if (
  123. containsKeywordInScore(
  124. inn?.scoreRuleMoreInnerVO[0]?.innerConditionValue,
  125. GONG_SHI
  126. )
  127. ) {
  128. inn.scoreRuleMoreInnerVO[0].innerConditionValueExpress =
  129. inn.scoreRuleMoreInnerVO[0].innerConditionValue;
  130. }
  131. inn?.scoreRuleMoreInnerVO[0]?.scoreRules.map(isc => {
  132. if (containsKeywordInScore(isc?.score, GONG_SHI)) {
  133. isc.scoreExpress = isc.score;
  134. }
  135. if (containsKeywordInScore(isc?.startValue, GONG_SHI)) {
  136. isc.startExpress = isc.startValue;
  137. }
  138. if (containsKeywordInScore(isc?.endValue, GONG_SHI)) {
  139. isc.endExpress = isc.endValue;
  140. }
  141. });
  142. });
  143. params.formula.noConditionFormula = JSON.stringify(addmanyChange);
  144. params.formula = JSON.stringify(params.formula);
  145. }
  146. const { msg, code } = await postUpdate(params);
  147. if (code === 200) {
  148. ElMessage({
  149. message: "编辑成功",
  150. type: "success"
  151. });
  152. $emit("refresh");
  153. disabledValue.value = true;
  154. editShow.value = true;
  155. drawer.value = !drawer.value;
  156. } else {
  157. ElMessage.error(msg);
  158. }
  159. };
  160. // 公式验证
  161. const dialogFormVisibleFormula = ref(false);
  162. const formulaForm = ref([]);
  163. const grade = ref();
  164. const conditionVerifyApi = async () => {
  165. grade.value = null;
  166. formulaForm.value = [];
  167. dialogFormVisibleFormula.value = true;
  168. try {
  169. formulaForm.value = [];
  170. grade.value = "";
  171. console.log("params", params);
  172. const keywords = ["完成值", "目标值", "门槛值", "挑战值", "增幅", "降幅"];
  173. let str = params.formula.noConditionFormula;
  174. // 创建一个正则表达式,匹配这些关键词
  175. const regex = new RegExp(keywords.join("|"), "g");
  176. // 提取字符串中的所有关键词
  177. let matches = str.match(regex);
  178. console.log("匹配到的关键词:", matches);
  179. matches.forEach(matchItem => {
  180. formulaForm.value.push({
  181. name: matchItem,
  182. value: ""
  183. });
  184. });
  185. let result = str.replace(regex, match => {
  186. return `${match}`;
  187. });
  188. } catch (err) {
  189. //
  190. }
  191. };
  192. // 计算
  193. // 多条件公式计算
  194. function reverseReplace(oldValue, dataObject) {
  195. // 确保 formulaForm 是一个数组
  196. if (!Array.isArray(oldValue)) {
  197. throw new Error("formulaForm 应该是一个数组");
  198. }
  199. oldValue.forEach(item => {
  200. // 遍历外部条件和内部条件的表达式
  201. for (const key in dataObject) {
  202. const value = dataObject[key];
  203. if (typeof value === "string") {
  204. // 如果字符串中包含当前name,则替换该值
  205. if (value.includes(item.name)) {
  206. dataObject[key] = value.replace(item.name, item.value);
  207. }
  208. } else if (Array.isArray(value)) {
  209. // 如果是数组,递归替换数组中的每个对象
  210. value.forEach(innerObj => {
  211. for (const innerKey in innerObj) {
  212. const innerValue = innerObj[innerKey];
  213. if (
  214. typeof innerValue === "string" &&
  215. innerValue.includes(item.name)
  216. ) {
  217. innerObj[innerKey] = innerValue.replace(item.name, item.value);
  218. }
  219. }
  220. });
  221. }
  222. }
  223. });
  224. return dataObject;
  225. }
  226. function calculateScore(inputString) {
  227. // 将 formulaForm.value 转换为一个键值对映射,方便替换
  228. const valueMap = formulaForm.value.reduce((map, item) => {
  229. map[item.name] = item.value !== null ? item.value : 0; // 用 0 替代 null
  230. return map;
  231. }, {});
  232. // 替换字符串中的关键字为对应的 value 值
  233. let formula = inputString;
  234. for (const [key, value] of Object.entries(valueMap)) {
  235. if (formula.includes(key)) {
  236. // 使用正则替换所有匹配的关键字
  237. const regex = new RegExp(key, "g");
  238. formula = formula.replace(regex, value);
  239. }
  240. }
  241. try {
  242. // 使用 eval 计算公式
  243. const result = eval(formula);
  244. return result;
  245. } catch (error) {
  246. console.error("公式计算出错:", error);
  247. return null;
  248. }
  249. }
  250. const countComputed = async () => {
  251. try {
  252. if (params.formulaType == 0) {
  253. const formula = JSON.stringify(params.formula);
  254. // const aa = JSON.stringify(formula);
  255. // console.log("formula", aa);
  256. const { code, msg } = await conditionVerify({
  257. formulaType: params.formulaType,
  258. formula
  259. });
  260. if (code == 200) {
  261. const keywords = [
  262. "完成值",
  263. "目标值",
  264. "门槛值",
  265. "挑战值",
  266. "增幅",
  267. "降幅"
  268. ];
  269. let str = params.formula.noConditionFormula;
  270. // 创建一个正则表达式,匹配这些关键词
  271. const regex = new RegExp(keywords.join("|"), "g");
  272. let result = str.replace(regex, match => {
  273. // 在 formulaForm.value 中查找匹配的项
  274. let matchedItem = formulaForm.value.find(item => item.name === match);
  275. // 如果找到匹配项,返回其 value,否则返回原始匹配值
  276. if (matchedItem) {
  277. return matchedItem.value; // 替换为对应的值
  278. }
  279. return match; // 如果没有匹配项,返回原始匹配值
  280. });
  281. // calculator.calculate(result);
  282. // grade.value = calculator.get();
  283. grade.value = eval(result).toFixed(2);
  284. } else {
  285. ElMessageBox.confirm(
  286. "如果不修改将无法计算得分",
  287. "公式计算错误,修改后确认",
  288. {
  289. type: "warning"
  290. }
  291. ).then(() => {
  292. dialogFormVisibleFormula.value = false;
  293. });
  294. }
  295. } else if (params.formulaType == 1) {
  296. let oldValue = JSON.parse(JSON.stringify(addmanyChange));
  297. // Object.assign(oldValue, addmanyChange);
  298. const formulaPar = JSON.stringify(oldValue);
  299. const res = await conditionVerify({
  300. formulaType: params.formulaType,
  301. formula: formulaPar
  302. });
  303. if (res.code == 200) {
  304. if (oldValue.outerConditionValue) {
  305. oldValue.outerConditionValue = calculateScore(
  306. oldValue.outerConditionValue
  307. );
  308. }
  309. if (oldValue.innerConditionExpression.length > 0) {
  310. oldValue.innerConditionExpression.map(itEx => {
  311. if (itEx.startValue) {
  312. itEx.startValue = calculateScore(itEx.startValue);
  313. }
  314. if (itEx.endValue) {
  315. itEx.endValue = calculateScore(itEx.endValue);
  316. }
  317. if (itEx.innerScore) {
  318. itEx.innerScore = calculateScore(itEx.innerScore);
  319. }
  320. if (itEx?.scoreRuleMoreInnerVO[0]?.innerConditionValue) {
  321. itEx.scoreRuleMoreInnerVO[0].innerConditionValue = calculateScore(
  322. itEx.scoreRuleMoreInnerVO[0].innerConditionValue
  323. );
  324. }
  325. if (itEx?.scoreRuleMoreInnerVO[0]?.scoreRules.length > 0) {
  326. itEx.scoreRuleMoreInnerVO[0].scoreRules.map(itRule => {
  327. if (itRule.score) {
  328. itRule.score = calculateScore(itRule.score);
  329. }
  330. if (itRule.startValue) {
  331. itRule.startValue = calculateScore(itRule.startValue);
  332. }
  333. if (itRule.endValue) {
  334. itRule.endValue = calculateScore(itRule.endValue);
  335. }
  336. });
  337. }
  338. });
  339. }
  340. // let newValue = reverseReplace(formListNum, oldValue);
  341. const { code, msg, data } =
  342. await calculateScoreByConditionMoCondition(oldValue);
  343. if (code == 200) {
  344. grade.value = data;
  345. }
  346. } else {
  347. ElMessageBox.confirm(
  348. "如果不修改将无法计算得分",
  349. "公式计算错误,修改后确认",
  350. {
  351. type: "warning"
  352. }
  353. ).then(() => {
  354. dialogFormVisibleFormula.value = false;
  355. });
  356. }
  357. }
  358. } catch (err) {
  359. console.log(err);
  360. }
  361. };
  362. // 判断是否为json
  363. function isValidJSON(str) {
  364. try {
  365. JSON.parse(str);
  366. return true; // 如果解析成功,返回true
  367. } catch (e) {
  368. return false; // 如果解析失败,返回false
  369. }
  370. }
  371. const handleClose = (done: () => void) => {
  372. drawer.value = false;
  373. disabledValue.value = true;
  374. editShow.value = true;
  375. // ElMessageBox.confirm("配置项未保存,确认关闭", {
  376. // type: "warning"
  377. // }).then(() => {
  378. // });
  379. };
  380. function cancelClick() {
  381. drawer.value = false;
  382. Object.assign(params, {
  383. id: "",
  384. tpId: "",
  385. dimId: "",
  386. indId: "",
  387. valueInput: "",
  388. scoreStandard: 0,
  389. remark: "",
  390. scoreRule: "",
  391. targetValue: "",
  392. finalValue: "",
  393. formulaType: 0,
  394. challengeValue: "",
  395. startValue: "",
  396. datasoure: "",
  397. weight: "",
  398. scoreValue: "",
  399. formula: {
  400. noConditionFormula: ""
  401. }
  402. });
  403. disabledValue.value = true;
  404. editShow.value = true;
  405. }
  406. function confirmClick() {
  407. postUpdateApi();
  408. }
  409. const open = row => {
  410. drawer.value = true;
  411. params.designatedPersonnel = "";
  412. Object.assign(params, {
  413. id: "",
  414. tpId: "",
  415. dimId: "",
  416. indId: "",
  417. valueInput: "",
  418. designatedPersonnel: "",
  419. scoreStandard: 0,
  420. remark: "",
  421. scoreRule: "",
  422. targetValue: "",
  423. finalValue: "",
  424. formulaType: 0,
  425. challengeValue: "",
  426. startValue: "",
  427. datasoure: "",
  428. weight: "",
  429. scoreValue: "",
  430. personList: "",
  431. formula: {
  432. noConditionFormula: ""
  433. }
  434. });
  435. Object.assign(addmanyChange, {
  436. outerConditionValue: "",
  437. outerConditionValueExpress: "",
  438. innerConditionExpression: [
  439. {
  440. startValue: null,
  441. endValue: null,
  442. select: null,
  443. comparisonStart: null,
  444. comparisonEnd: null,
  445. innerScore: null,
  446. innerScoreExpress: null,
  447. scoreRuleMoreInnerVO: []
  448. }
  449. ]
  450. });
  451. getIndexInfoApi(row.id);
  452. calculatorShow.value = true;
  453. };
  454. const editShow = ref(true);
  455. defineExpose({
  456. open
  457. });
  458. const timer = ref("");
  459. // 公式计算
  460. const compute = [
  461. {
  462. value: 0,
  463. label: "无条件公式"
  464. },
  465. {
  466. value: 1,
  467. label: "多条件公式"
  468. }
  469. ];
  470. const bgColor = ref(null);
  471. const rolesList = reactive({
  472. data: [
  473. { name: "完成值 / 目标值", id: 1 },
  474. { name: "完成值 - 目标值", id: 2 },
  475. { name: "目标值 - 完成值", id: 3 },
  476. { name: "门槛值", id: 4 },
  477. { name: "目标值", id: 5 },
  478. { name: "挑战值", id: 6 },
  479. { name: "完成值", id: 7 },
  480. { name: "增幅", id: 8 },
  481. { name: "降幅", id: 9 }
  482. ],
  483. value: "",
  484. num: null
  485. });
  486. // 监听formulaType变化
  487. const watchFormulaType = value => {
  488. if (value == 0 && typeof params.formula == "string") {
  489. let aa = JSON.parse(params.formula);
  490. params.formula = aa;
  491. params.formula.noConditionFormula = "";
  492. }
  493. };
  494. const lookRoles = item => {
  495. if (isValidJSON(params.formula)) {
  496. params.formula = JSON.parse(params.formula);
  497. }
  498. bgColor.value = item.id;
  499. params.formula.noConditionFormula =
  500. params.formula.noConditionFormula + item.name;
  501. };
  502. // 字符拼接
  503. const countNumber = (item: string) => {
  504. params.formula.noConditionFormula = params.formula.noConditionFormula + item;
  505. };
  506. // 清除
  507. const remove = () => {
  508. if (params.formula.noConditionFormula.length > 0) {
  509. params.formula.noConditionFormula = params.formula.noConditionFormula.slice(
  510. 0,
  511. -1
  512. );
  513. }
  514. };
  515. // 清空
  516. const removeVoid = () => {
  517. params.formula.noConditionFormula = "";
  518. };
  519. // 计算确认
  520. //
  521. const calculatorShow = ref(true);
  522. const count = item => {
  523. ElMessageBox.confirm("配置项确认保存?确认关闭", {
  524. type: "warning"
  525. }).then(() => {
  526. calculatorShow.value = false;
  527. });
  528. // try {
  529. // calculator.calculate(rolesList.value);
  530. // rolesList.num = calculator.get();
  531. // } catch (error) {
  532. // ElMessage({
  533. // message: "计算错误",
  534. // type: "warning"
  535. // });
  536. // console.log(error);
  537. // }
  538. };
  539. // 多条件公式
  540. const addmanyChange = reactive({
  541. outerConditionValue: "",
  542. outerConditionValueExpress: "",
  543. innerConditionExpression: [
  544. {
  545. startValue: null,
  546. endValue: null,
  547. select: null,
  548. comparisonStart: null,
  549. comparisonEnd: null,
  550. innerScore: null,
  551. innerScoreExpress: null,
  552. scoreRuleMoreInnerVO: [
  553. // {
  554. // innerConditionValue: null,
  555. // scoreRules: [
  556. // {
  557. // score: null,
  558. // startValue: null,
  559. // select: "",
  560. // endValue: null,
  561. // comparisonStart: null,
  562. // comparisonEnd: null
  563. // }
  564. // ]
  565. // }
  566. ]
  567. }
  568. ]
  569. });
  570. // 添加子条件
  571. const addItemFormulaList = (item, index) => {
  572. addmanyChange.innerConditionExpression[index].scoreRuleMoreInnerVO = [
  573. {
  574. innerConditionValue: null,
  575. innerConditionValueExpress: null,
  576. scoreRules: [
  577. {
  578. score: null,
  579. scoreExpress: null,
  580. startValue: null,
  581. startExpress: null,
  582. endValue: null,
  583. endExpress: null,
  584. select: null,
  585. comparisonStart: null,
  586. comparisonEnd: null
  587. }
  588. ]
  589. }
  590. ];
  591. addmanyChange.innerConditionExpression[index].innerScore = "";
  592. changeAddMay();
  593. };
  594. const deleteItem = index => {
  595. addmanyChange.innerConditionExpression.splice(index, 1);
  596. changeAddMay();
  597. };
  598. const dataleListItem = (index, indexList) => {
  599. addmanyChange.innerConditionExpression[
  600. index
  601. ].scoreRuleMoreInnerVO[0].scoreRules.splice(indexList, 1);
  602. changeAddMay();
  603. };
  604. // 条件变量
  605. const dataleListItemAll = (item, index) => {
  606. item.scoreRuleMoreInnerVO = [];
  607. changeAddMay();
  608. };
  609. const addNewItem = () => {
  610. addmanyChange.innerConditionExpression.push({
  611. startValue: null,
  612. endValue: null,
  613. select: null,
  614. comparisonStart: null,
  615. comparisonEnd: null,
  616. scoreRuleMoreInnerVO: []
  617. });
  618. changeAddMay();
  619. };
  620. const addNewItemOldValue = item => {
  621. addmanyChange.innerConditionExpression.push({
  622. startValue: item.endValue,
  623. select: null,
  624. endValue: null,
  625. comparisonStart: item.comparisonEnd == ">" ? "≥" : ">",
  626. comparisonEnd: null,
  627. scoreRuleMoreInnerVO: []
  628. });
  629. changeAddMay();
  630. };
  631. const addItemDataList = (
  632. index: number,
  633. itemList: any,
  634. indexList: number,
  635. item
  636. ) => {
  637. addmanyChange.innerConditionExpression[
  638. index
  639. ].scoreRuleMoreInnerVO[0].scoreRules.push({
  640. select: null,
  641. score: null,
  642. scoreExpress: null,
  643. startValue: itemList.endValue,
  644. endValue: null,
  645. comparisonStart: itemList.comparisonEnd,
  646. comparisonEnd: null
  647. });
  648. addmanyChange.innerConditionExpression[index].innerScore = "";
  649. changeAddMay();
  650. };
  651. // 多条件公式验证
  652. const keywords = ["目标值", "完成值", "挑战值", "门槛值", "增幅", "降幅"];
  653. // 处理字符串,提取关键词
  654. function extractKeywords(value) {
  655. // 如果是字符串,处理包含的关键词
  656. if (typeof value === "string") {
  657. // 提取所有关键词
  658. keywords.forEach(keyword => {
  659. if (value.includes(keyword)) {
  660. formulaForm.value.push({
  661. name: keyword,
  662. value: null // 可以根据需求赋值
  663. });
  664. }
  665. });
  666. }
  667. }
  668. // 遍历对象并处理
  669. function traverseObject(obj) {
  670. if (obj && typeof obj === "object") {
  671. for (const key in obj) {
  672. if (obj.hasOwnProperty(key)) {
  673. const value = obj[key];
  674. // 如果值是字符串,调用提取函数
  675. if (typeof value === "string") {
  676. extractKeywords(value);
  677. }
  678. // 如果值是数组,递归处理
  679. if (Array.isArray(value)) {
  680. value.forEach(item => traverseObject(item));
  681. }
  682. }
  683. }
  684. }
  685. }
  686. function extractKeywordsAndPush(keywordsList, inputString) {
  687. keywords.forEach(keyword => {
  688. if (
  689. inputString?.includes(keyword) && // 检查字符串是否包含关键字
  690. !formulaForm.value.some(item => item.name === keyword) // 确保没有重复
  691. ) {
  692. // 如果包含且未重复,构造对象并push到formulaForm.value
  693. formulaForm.value.push({
  694. name: keyword,
  695. value: null // 根据需求赋值
  696. });
  697. }
  698. });
  699. return formulaForm;
  700. }
  701. const manyConditions = () => {
  702. grade.value = null;
  703. dialogFormVisibleFormula.value = true;
  704. formulaForm.value = [];
  705. // 提取 addmanyChange 对象中的条件值
  706. let oldValue = addmanyChange;
  707. if (oldValue.outerConditionValue) {
  708. extractKeywordsAndPush(keywords, oldValue.outerConditionValue);
  709. }
  710. if (oldValue.innerConditionExpression.length > 0) {
  711. oldValue.innerConditionExpression.map(itemExp => {
  712. if (itemExp.startValue) {
  713. extractKeywordsAndPush(keywords, itemExp.startValue);
  714. }
  715. if (itemExp.endValue) {
  716. extractKeywordsAndPush(keywords, itemExp.endValue);
  717. }
  718. if (itemExp.innerScore) {
  719. extractKeywordsAndPush(keywords, itemExp.innerScore);
  720. }
  721. if (itemExp?.scoreRuleMoreInnerVO[0]?.innerConditionValue) {
  722. extractKeywordsAndPush(
  723. keywords,
  724. itemExp.scoreRuleMoreInnerVO[0].innerConditionValue
  725. );
  726. }
  727. if (itemExp?.scoreRuleMoreInnerVO.length > 0) {
  728. if (itemExp?.scoreRuleMoreInnerVO[0]?.scoreRules.length > 0) {
  729. itemExp?.scoreRuleMoreInnerVO[0]?.scoreRules.map(itSc => {
  730. if (itSc.score) {
  731. extractKeywordsAndPush(keywords, itSc.score);
  732. }
  733. if (itSc.startValue) {
  734. extractKeywordsAndPush(keywords, itSc.startValue);
  735. }
  736. if (itSc.endValue) {
  737. extractKeywordsAndPush(keywords, itSc.endValue);
  738. }
  739. });
  740. }
  741. }
  742. });
  743. }
  744. };
  745. // 计算器
  746. const jishuanqiRef = ref();
  747. const countNoConditionFormula = item => {
  748. addmanyChange.outerConditionValue = item;
  749. changeAddMay();
  750. };
  751. const jishuanqiRef1 = ref();
  752. const countNoConditionFormula1 = (item, index) => {
  753. addmanyChange.innerConditionExpression[index].endValue = item;
  754. changeAddMay();
  755. };
  756. const jishuanqiRef2 = ref();
  757. const countNoConditionFormula2 = (item, index) => {
  758. // innerConditionValue
  759. addmanyChange.innerConditionExpression[
  760. index
  761. ].scoreRuleMoreInnerVO[0].innerConditionValue = item;
  762. changeAddMay();
  763. };
  764. const jishuanqiRef3 = ref();
  765. const countNoConditionFormula3 = (item, index, indexList) => {
  766. addmanyChange.innerConditionExpression[
  767. index
  768. ].scoreRuleMoreInnerVO[0].scoreRules[indexList].endValue = item;
  769. changeAddMay();
  770. };
  771. const countNoConditionFormula4 = (item, index, indexList) => {
  772. addmanyChange.innerConditionExpression[
  773. index
  774. ].scoreRuleMoreInnerVO[0].scoreRules[indexList].score = item;
  775. changeAddMay();
  776. };
  777. const countNoConditionFormulaInnerScore = (item, index, indexList) => {
  778. addmanyChange.innerConditionExpression[index].innerScore = item;
  779. changeAddMay();
  780. };
  781. // 转换函数 --- 人员
  782. const convertDepartmentDataRecursive_Person = data => {
  783. return data.map(department => {
  784. const { userNameNew, userCodeNew, children } = department;
  785. return {
  786. value: userCodeNew,
  787. label: userNameNew,
  788. children:
  789. children.length > 0
  790. ? children.map(
  791. child => convertDepartmentDataRecursive_Person([child])[0]
  792. )
  793. : []
  794. };
  795. });
  796. };
  797. postListTreeWithUserApi();
  798. const assessmentTypeRef = ref();
  799. const handleRreeSelect = () => {
  800. const arr = assessmentTypeRef.value.getCheckedNodes().filter(item => {
  801. return item.children.length == 0;
  802. });
  803. params.designatedPersonnel = arr.map(item => item.value).join(",");
  804. };
  805. // 取消计算
  806. const quxiaoCmputed = () => {
  807. formulaForm.value = [];
  808. dialogFormVisibleFormula.value = false;
  809. };
  810. // 监听数据变化
  811. const changeAddMay = () => {
  812. let addmanyChangeOldVal = JSON.parse(JSON.stringify(addmanyChange));
  813. addmanyChange.innerConditionExpression.forEach((item, index, arr) => {
  814. if (index + 1 <= arr.length) {
  815. console.log("12312", addmanyChangeOldVal.innerConditionExpression);
  816. if (item.endValue) {
  817. if (addmanyChangeOldVal.innerConditionExpression.length > 1) {
  818. addmanyChangeOldVal.innerConditionExpression[index + 1].startValue =
  819. item?.endValue;
  820. addmanyChangeOldVal.innerConditionExpression[index + 1].startExpress =
  821. item?.endExpress;
  822. addmanyChangeOldVal.innerConditionExpression[
  823. index + 1
  824. ].comparisonStart = item?.comparisonEnd == "≥" ? ">" : "≥";
  825. }
  826. }
  827. if (item.scoreRuleMoreInnerVO.length > 0) {
  828. if (item.scoreRuleMoreInnerVO[0].scoreRules.length > 0) {
  829. item.scoreRuleMoreInnerVO[0].scoreRules.map((it, id, arrChild) => {
  830. if (id + 1 <= arrChild.length) {
  831. if (it.endValue) {
  832. // if (
  833. // addmanyChangeOldVal.innerConditionExpression[index + 1]
  834. // .scoreRuleMoreInnerVO.length > 0
  835. // ) {
  836. addmanyChangeOldVal.innerConditionExpression[
  837. index
  838. ].scoreRuleMoreInnerVO[0].scoreRules[id + 1].startValue =
  839. it?.endValue;
  840. addmanyChangeOldVal.innerConditionExpression[
  841. index
  842. ].scoreRuleMoreInnerVO[0].scoreRules[id + 1].startExpress =
  843. it?.startExpress;
  844. addmanyChangeOldVal.innerConditionExpression[
  845. index
  846. ].scoreRuleMoreInnerVO[0].scoreRules[id + 1].comparisonStart =
  847. it?.comparisonEnd == "≥" ? ">" : "≥";
  848. // }
  849. }
  850. }
  851. });
  852. }
  853. }
  854. }
  855. });
  856. Object.assign(addmanyChange, addmanyChangeOldVal);
  857. };
  858. // { deep: true };
  859. </script>
  860. <template>
  861. <div>
  862. <el-drawer
  863. v-model="drawer"
  864. :direction="direction"
  865. :before-close="handleClose"
  866. size="700px"
  867. >
  868. <template #header>
  869. <h4>指标设置</h4>
  870. </template>
  871. <template #default>
  872. <div>
  873. <el-form label-position="top" label-width="auto" :model="params">
  874. <el-form-item label="完成值录入人" label-position="top">
  875. <el-select v-model="params.valueInput" placeholder="请选择">
  876. <el-option label="被考核人" :value="0" />
  877. <!-- <el-option label="上级" :value="1" /> -->
  878. <el-option label="指定人员" :value="2" />
  879. <el-option label="考核管理员" :value="3" />
  880. <el-option label="指标自动采集" :value="4" />
  881. </el-select>
  882. <el-tree-select
  883. v-if="params.valueInput == 2"
  884. ref="assessmentTypeRef"
  885. v-model="params.personList"
  886. multiple
  887. :data="convertDepartmentDataRecursive_Person(treeDept)"
  888. :render-after-expand="false"
  889. show-checkbox
  890. style="margin-top: 10px"
  891. @check-change="handleRreeSelect()"
  892. />
  893. </el-form-item>
  894. <el-form-item label="评分方式" label-position="top">
  895. <el-select v-model="params.scoreStandard" placeholder="请选择">
  896. <el-option label="手动输入" :value="0" />
  897. <el-option label="公式自动计算" :value="1" />
  898. </el-select>
  899. </el-form-item>
  900. <div v-if="params.scoreStandard === 1">
  901. <el-form-item label="公式类型" label-position="top">
  902. <el-select
  903. v-model="params.formulaType"
  904. placeholder="请选择"
  905. @change="watchFormulaType"
  906. >
  907. <el-option
  908. v-for="item in compute"
  909. :key="item.value"
  910. :label="item.label"
  911. :value="item.value"
  912. />
  913. </el-select>
  914. </el-form-item>
  915. <el-form-item
  916. v-if="params.formulaType === 0"
  917. label="公式设置"
  918. label-position="top"
  919. >
  920. <div>
  921. <div>
  922. <el-text>得分 =</el-text>
  923. <el-input
  924. v-model="params.formula.noConditionFormula"
  925. class="ml-2 mr-2"
  926. style="width: 240px"
  927. />
  928. <el-text>
  929. <el-button type="primary" @click="conditionVerifyApi"
  930. >公式验证</el-button
  931. >
  932. </el-text>
  933. </div>
  934. <div
  935. v-if="calculatorShow"
  936. class="w-[500px] compute h-64 mt-1 ml-12 flex justify-evenly items-center"
  937. style="user-select: none"
  938. >
  939. <div class="w-1/3 h-60 pl-1 bg-white rounded-md">
  940. <div class="w-[100%] text-xs mt-2">
  941. <div><el-text type="info">:::变量</el-text></div>
  942. </div>
  943. <div v-for="item in rolesList.data" :key="item.id">
  944. <div
  945. :class="[
  946. 'cursor-pointer text-xs mt-1',
  947. { bgBack: bgColor === item.id }
  948. ]"
  949. @click="lookRoles(item)"
  950. >
  951. <el-text class="">{{ item.name }}</el-text>
  952. </div>
  953. </div>
  954. </div>
  955. <div class="w-3/5 ml-2 h-60 flex flex-col">
  956. <div class="w-[100%] text-xs h-24 bg-white rounded-md">
  957. <div class="p-1"><el-text>得分 = </el-text></div>
  958. <!-- style="height: 95px" -->
  959. <el-input
  960. v-model="params.formula.noConditionFormula"
  961. :rows="3"
  962. disabled
  963. type="textarea"
  964. placeholder='示例:"完成值" / "目标值" * 100'
  965. />
  966. </div>
  967. <div class="w-[100%] h-32 mt-2 rounded-md flex flex-col">
  968. <div class="flex justify-between h-8">
  969. <div
  970. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  971. @click="countNumber('1')"
  972. >
  973. 1
  974. </div>
  975. <div
  976. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  977. @click="countNumber('2')"
  978. >
  979. 2
  980. </div>
  981. <div
  982. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  983. @click="countNumber('3')"
  984. >
  985. 3
  986. </div>
  987. <div
  988. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  989. @click="countNumber('+')"
  990. >
  991. +
  992. </div>
  993. <div
  994. class="h-full w-[50px] text-white bg-orange-400 mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  995. @click="remove"
  996. >
  997. x
  998. </div>
  999. </div>
  1000. <div class="flex justify-between h-8 mt-1">
  1001. <div
  1002. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  1003. @click="countNumber('4')"
  1004. >
  1005. 4
  1006. </div>
  1007. <div
  1008. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  1009. @click="countNumber('5')"
  1010. >
  1011. 5
  1012. </div>
  1013. <div
  1014. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  1015. @click="countNumber('6')"
  1016. >
  1017. 6
  1018. </div>
  1019. <div
  1020. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  1021. @click="countNumber('-')"
  1022. >
  1023. -
  1024. </div>
  1025. <div
  1026. class="text-xs h-full w-[50px] text-white bg-orange-400 mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  1027. @click="removeVoid"
  1028. >
  1029. 清空
  1030. </div>
  1031. </div>
  1032. <div class="flex justify-between h-16 mt-1">
  1033. <div>
  1034. <div class="flex justify-between">
  1035. <div
  1036. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  1037. @click="countNumber('7')"
  1038. >
  1039. 7
  1040. </div>
  1041. <div
  1042. class="h-full ml-1 w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  1043. @click="countNumber('8')"
  1044. >
  1045. 8
  1046. </div>
  1047. <div
  1048. class="h-full ml-2 w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  1049. @click="countNumber('9')"
  1050. >
  1051. 9
  1052. </div>
  1053. <div
  1054. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  1055. @click="countNumber('*')"
  1056. >
  1057. *
  1058. </div>
  1059. </div>
  1060. <div class="flex mt-1 justify-between">
  1061. <div
  1062. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  1063. @click="countNumber('0')"
  1064. >
  1065. 0
  1066. </div>
  1067. <div
  1068. class="h-full ml-1 w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  1069. @click="countNumber('.')"
  1070. >
  1071. .
  1072. </div>
  1073. <div
  1074. class="h-full ml-2 w-[50px] bg-white mx-1 flex justify-between items-center rounded-lg cursor-pointer"
  1075. >
  1076. <div
  1077. class="w-1/2 h-full text-center border-r text-gray-100"
  1078. @click="countNumber('(')"
  1079. >
  1080. <span class="text-black"> (</span>
  1081. </div>
  1082. <div
  1083. class="w-1/2 h-full text-center"
  1084. @click="countNumber(')')"
  1085. >
  1086. )
  1087. </div>
  1088. </div>
  1089. <div
  1090. class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
  1091. @click="countNumber('/')"
  1092. >
  1093. /
  1094. </div>
  1095. </div>
  1096. </div>
  1097. <div
  1098. class="h-full mr-1 w-[50px] text-white flex justify-center items-center rounded-lg cursor-pointer areYouOK"
  1099. @click="count"
  1100. >
  1101. 确认
  1102. </div>
  1103. </div>
  1104. </div>
  1105. </div>
  1106. </div>
  1107. </div>
  1108. </el-form-item>
  1109. <el-form-item v-else label="公式设置">
  1110. <div class="w-full">
  1111. <div class="flex items-center">
  1112. <el-text>条件值 = </el-text>
  1113. <!-- <el-input
  1114. v-model="addmanyChange.outerConditionValue"
  1115. class="ml-2"
  1116. style="width: 240px"
  1117. /> -->
  1118. <jishuanqi
  1119. ref="jishuanqiRef"
  1120. :outerConditionValue="addmanyChange.outerConditionValue"
  1121. @handClick="countNoConditionFormula"
  1122. />
  1123. </div>
  1124. <div class="w-full mt-2">
  1125. <div
  1126. v-for="(
  1127. item, index
  1128. ) in addmanyChange.innerConditionExpression"
  1129. :key="index"
  1130. >
  1131. <div class="mt-3">
  1132. <div class="flex">
  1133. <el-text class="w-[15px]" type="primary">
  1134. {{ index + 1 }}
  1135. </el-text>
  1136. <div class="w-[40px] ml-4">
  1137. {{ item.startValue }}
  1138. </div>
  1139. <div class="mr-2">
  1140. {{ item.comparisonStart }}
  1141. </div>
  1142. <div class="mr-2">条件值</div>
  1143. <el-select
  1144. v-model="item.comparisonEnd"
  1145. style="width: 60px"
  1146. placeholder=""
  1147. :disabled="
  1148. index + 1 ==
  1149. addmanyChange.innerConditionExpression.length &&
  1150. index >= 1
  1151. ? true
  1152. : false
  1153. "
  1154. >
  1155. <el-option label=">" value=">" />
  1156. <el-option label="≥" value="≥" />
  1157. </el-select>
  1158. <el-select
  1159. v-model="item.select"
  1160. class="ml-2"
  1161. style="width: 80px"
  1162. placeholder=""
  1163. :disabled="
  1164. index + 1 ==
  1165. addmanyChange.innerConditionExpression.length &&
  1166. index >= 1
  1167. ? true
  1168. : false
  1169. "
  1170. >
  1171. <el-option label="数值" value="数值" />
  1172. <el-option label="公式" value="公式" />
  1173. </el-select>
  1174. <el-input
  1175. v-if="
  1176. index + 1 ==
  1177. addmanyChange.innerConditionExpression.length &&
  1178. index >= 1
  1179. "
  1180. disabled
  1181. class="ml-2 mr-5"
  1182. style="width: 80px"
  1183. />
  1184. <div v-else>
  1185. <jishuanqi
  1186. v-if="item.select == '公式'"
  1187. ref="jishuanqiRef"
  1188. :index="index"
  1189. :outerConditionValue="item.endValue"
  1190. class="ml-2 mr-5"
  1191. style="width: 80px"
  1192. @handClick="countNoConditionFormula1"
  1193. />
  1194. <el-input
  1195. v-else
  1196. v-model="item.endValue"
  1197. class="ml-2 mr-5"
  1198. style="width: 80px"
  1199. />
  1200. </div>
  1201. <el-text v-if="item.scoreRuleMoreInnerVO.length == 0"
  1202. >得分 =
  1203. </el-text>
  1204. <!-- <el-input
  1205. v-if="
  1206. index + 1 ==
  1207. addmanyChange.innerConditionExpression.length &&
  1208. index >= 1
  1209. "
  1210. disabled
  1211. class="ml-2 mr-5"
  1212. style="width: 100px"
  1213. /> -->
  1214. <div>
  1215. <jishuanqi
  1216. v-if="item.scoreRuleMoreInnerVO.length == 0"
  1217. ref="jishuanqiRef"
  1218. :index="index"
  1219. :outerConditionValue="item.innerScore"
  1220. class="ml-2 mr-6"
  1221. style="width: 100px"
  1222. @handClick="countNoConditionFormulaInnerScore"
  1223. />
  1224. </div>
  1225. <el-text type="danger" @click="deleteItem(index)">
  1226. <el-icon>
  1227. <Delete />
  1228. </el-icon>
  1229. </el-text>
  1230. </div>
  1231. <div
  1232. v-for="(itemVO, indexOV) in item.scoreRuleMoreInnerVO"
  1233. :key="indexOV"
  1234. >
  1235. <div class="flex mt-2 ml-20">
  1236. <div class="mr-2">条件值{{ index + 1 }} =</div>
  1237. <!-- <el-input v-if="
  1238. index + 1 ==
  1239. addmanyChange.innerConditionExpression
  1240. .length && index >= 1
  1241. " disabled class="ml-2 mr-6" style="width: 208px" /> -->
  1242. <jishuanqi
  1243. ref="jishuanqiRef"
  1244. :index="index"
  1245. :outerConditionValue="itemVO.innerConditionValue"
  1246. class="ml-2 mr-6"
  1247. style="width: 208px"
  1248. @handClick="countNoConditionFormula2"
  1249. />
  1250. <!-- <el-input v-model="itemVO.innerConditionValue" class="ml-2 mr-6" style="width: 208px" /> -->
  1251. <el-text
  1252. type="danger"
  1253. @click="dataleListItemAll(item, index)"
  1254. >
  1255. <el-icon>
  1256. <Delete />
  1257. </el-icon>
  1258. </el-text>
  1259. </div>
  1260. <div
  1261. v-for="(itemList, indexList) in itemVO.scoreRules"
  1262. :key="indexList"
  1263. class="ml-3"
  1264. >
  1265. <div class="flex mt-2 ml-16 items-center">
  1266. <div class="text_border">{{ indexList + 1 }}</div>
  1267. <!-- manyChange.dataList[index].dataList -->
  1268. <div class="w-[40px] ml-2">
  1269. {{ itemList.startValue }}
  1270. </div>
  1271. <div class="mr-2">
  1272. {{ itemList.comparisonStart }}
  1273. </div>
  1274. <div class="mr-2">条件值{{ index + 1 }}</div>
  1275. <el-select
  1276. v-model="itemList.comparisonEnd"
  1277. style="width: 60px"
  1278. placeholder=""
  1279. :disabled="
  1280. indexList + 1 == itemVO.scoreRules.length
  1281. ? true
  1282. : false
  1283. "
  1284. >
  1285. <el-option label=">" value=">" />
  1286. <el-option label="≥" value="≥" />
  1287. </el-select>
  1288. <el-select
  1289. v-model="itemList.select"
  1290. class="ml-2"
  1291. style="width: 80px"
  1292. placeholder=""
  1293. :disabled="
  1294. indexList + 1 == itemVO.scoreRules.length
  1295. ? true
  1296. : false
  1297. "
  1298. >
  1299. <el-option label="数值" value="数值" />
  1300. <el-option label="公式" value="公式" />
  1301. </el-select>
  1302. <el-input
  1303. v-if="indexList + 1 == itemVO.scoreRules.length"
  1304. disabled
  1305. class="ml-2"
  1306. style="width: 80px"
  1307. />
  1308. <div v-else>
  1309. <jishuanqi
  1310. v-if="itemList.select == '公式'"
  1311. ref="jishuanqiRef"
  1312. :index="index"
  1313. :indexList="indexList"
  1314. :outerConditionValue="itemList.endValue"
  1315. class="ml-2"
  1316. style="width: 80px"
  1317. @handClick="countNoConditionFormula3"
  1318. />
  1319. <el-input
  1320. v-else
  1321. v-model="itemList.endValue"
  1322. class="ml-2"
  1323. style="width: 80px"
  1324. />
  1325. </div>
  1326. <div
  1327. class="w-[150px] ml-2 mr-2 flex justify-between items-center"
  1328. >
  1329. <div>得分</div>
  1330. <div>=</div>
  1331. <!-- <el-input v-if="
  1332. indexList + 1 == itemVO.scoreRules.length &&
  1333. index >= 1
  1334. " disabled class="ml-2" style="width: 80px" /> -->
  1335. <jishuanqi
  1336. ref="jishuanqiRef"
  1337. :index="index"
  1338. :indexList="indexList"
  1339. :outerConditionValue="itemList.score"
  1340. class="ml-2"
  1341. style="width: 80px"
  1342. @handClick="countNoConditionFormula4"
  1343. />
  1344. <!-- <el-input
  1345. v-model="itemList.score"
  1346. class="ml-2"
  1347. style="width: 80px"
  1348. /> -->
  1349. </div>
  1350. <el-text
  1351. type="danger"
  1352. @click="dataleListItem(index, indexList)"
  1353. >
  1354. <el-icon>
  1355. <Delete />
  1356. </el-icon>
  1357. </el-text>
  1358. </div>
  1359. <div
  1360. v-if="indexList + 1 == itemVO.scoreRules.length"
  1361. class="ml-16 mt-2 text-xs cursor-pointer"
  1362. >
  1363. <el-text
  1364. type="primary"
  1365. @click="
  1366. addItemDataList(
  1367. index,
  1368. itemList,
  1369. indexList,
  1370. item
  1371. )
  1372. "
  1373. >
  1374. <el-icon>
  1375. <Plus />
  1376. </el-icon>
  1377. 添加子条件
  1378. </el-text>
  1379. </div>
  1380. </div>
  1381. </div>
  1382. </div>
  1383. <div
  1384. v-if="item?.scoreRuleMoreInnerVO?.length == 0"
  1385. class="ml-20 mt-2 text-xs cursor-pointer"
  1386. >
  1387. <el-text
  1388. type="primary"
  1389. @click="addItemFormulaList(item, index)"
  1390. >
  1391. <el-icon>
  1392. <Plus />
  1393. </el-icon>
  1394. 添加子条件
  1395. </el-text>
  1396. </div>
  1397. <div
  1398. v-if="
  1399. addmanyChange.innerConditionExpression.length >= 1 &&
  1400. index + 1 ==
  1401. addmanyChange.innerConditionExpression.length
  1402. "
  1403. class="mt-5 text-xs cursor-pointer"
  1404. >
  1405. <el-text
  1406. type="primary"
  1407. @click="addNewItemOldValue(item)"
  1408. >
  1409. <el-icon>
  1410. <Plus />
  1411. </el-icon>
  1412. 添加条件
  1413. </el-text>
  1414. </div>
  1415. </div>
  1416. <div
  1417. v-if="addmanyChange.innerConditionExpression.length < 1"
  1418. class="mt-5 text-xs cursor-pointer"
  1419. >
  1420. <el-text type="primary" @click="addNewItem">
  1421. <el-icon>
  1422. <Plus />
  1423. </el-icon>
  1424. 添加条件
  1425. </el-text>
  1426. </div>
  1427. <div class="float-right mr-8">
  1428. <el-button type="primary" @click="manyConditions"
  1429. >公式验证</el-button
  1430. >
  1431. </div>
  1432. </div>
  1433. </div>
  1434. </el-form-item>
  1435. </div>
  1436. </el-form>
  1437. </div>
  1438. </template>
  1439. <template #footer>
  1440. <div>
  1441. <el-button @click="cancelClick">取消</el-button>
  1442. <el-button type="primary" @click="confirmClick">确认</el-button>
  1443. </div>
  1444. </template>
  1445. </el-drawer>
  1446. <!-- 公式验证 -->
  1447. <el-dialog
  1448. v-model="dialogFormVisibleFormula"
  1449. title="完成值"
  1450. width="500"
  1451. :before-close="quxiaoCmputed"
  1452. >
  1453. <el-form :model="formulaForm">
  1454. <div v-for="(itemF, indexF) in formulaForm" :key="indexF">
  1455. <el-form-item :label="itemF.name">
  1456. <el-input v-model="itemF.value" autocomplete="off" />
  1457. </el-form-item>
  1458. </div>
  1459. <el-form-item label="得分">
  1460. <el-input v-model="grade" class="ml-3" autocomplete="off" disabled />
  1461. </el-form-item>
  1462. </el-form>
  1463. <template #footer>
  1464. <div class="dialog-footer">
  1465. <el-button @click="quxiaoCmputed">取消</el-button>
  1466. <el-button type="primary" @click="countComputed"> 计算 </el-button>
  1467. </div>
  1468. </template>
  1469. </el-dialog>
  1470. </div>
  1471. </template>
  1472. <style lang="scss" scoped>
  1473. .compute {
  1474. // border: 1px solid #f3f3f3;
  1475. background-color: #f3f3f3;
  1476. border-radius: 5px;
  1477. }
  1478. .text-color {
  1479. color: #f3f3f3;
  1480. }
  1481. .areYouOK {
  1482. background-color: #409eff;
  1483. }
  1484. .bgBack {
  1485. background-color: #f3f3f3;
  1486. }
  1487. .text_border {
  1488. display: flex;
  1489. align-items: center;
  1490. justify-content: center;
  1491. width: 14px;
  1492. height: 14px;
  1493. // margin-top: 5px;
  1494. margin-right: 5px;
  1495. font-size: 12px;
  1496. border: 1px solid gray;
  1497. border-radius: 50%;
  1498. }
  1499. </style>