settingIndexDrawer.vue 53 KB

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