<script setup lang="ts">
import { ref, reactive, watch } from "vue";
import { ElMessageBox, ElMessage } from "element-plus";
import { calculator } from "./evaluate";
import {
  getIndexInfo,
  postUpdate,
  calculateScoreByConditionMoCondition
} from "@/api/templateInfo";
import { conditionVerify } from "@/api/formula";
import jishuanqi from "./jishuanqi.vue";
import {
  postListTreeWithUser,
  postListTree,
  postListTreeWithUserApi,
  treeDept
} from "@/api/department";
import type { DrawerProps, FormItemProps, FormProps } from "element-plus";
import { formulaParamsChange, echoParamsChange } from "@/utils/business";
// const itemLabelPosition = ref<FormItemProps["labelPosition"]>("");
const drawer = ref(false);
const disabledValue = ref(true);
const GONG_SHI = [
  "完成值",
  "目标值",
  "门槛值",
  "挑战值",
  "增幅",
  "降幅",
  "上期完成值",
  "上上期完成值"
];
// 判断 score 字符串是否包含 GONG_SHI 中的关键字
function containsKeywordInScore(score, keywordss) {
  // 确保 score 是字符串，keywords 是数组
  if (score && typeof score == "string") {
    const cleanedScore = score.replace(/[\s\-]/g, ""); // 去除空格和破折号
    const cleanedKeywords = keywordss.map(keyword =>
      keyword.replace(/[\s\-]/g, "")
    );
    return cleanedKeywords.some(keyword => cleanedScore.includes(keyword));
    // 遍历 keywords 数组，检查 score 是否包含其中的任何一个关键字
  } else {
    return false;
  }
}
const direction = ref<DrawerProps["direction"]>("rtl");
const formLabelAlign = reactive({
  name: "",
  region: "",
  grade: "",
  compute: "1",
  type: ""
});
const params = reactive({
  id: "",
  tpId: "",
  dimId: "",
  indId: "",
  valueInput: "",
  scoreStandard: 0,
  designatedPersonnel: "",
  remark: "",
  scoreRule: "",
  targetValue: "",
  finalValue: "",
  formulaType: 0,
  challengeValue: "",
  startValue: "",
  datasoure: "",
  weight: "",
  valueScore: null,
  scoreValue: "",
  formula: {
    noConditionFormula: ""
  },
  personList: ""
});
// 详情信息
const getIndexInfoApi = async id => {
  const { data, code, msg } = await getIndexInfo(id);
  // console.log("1111", data);
  if (code === 200) {
    Object.assign(params, data);
    if (data.designatedPersonnel) {
      params.personList = data.designatedPersonnel.split(",");
    } else {
      params.personList = "";
    }
    if (!data.formulaType) {
      params.formulaType = 0;
    }
    if (data.formulaType === 0) {
      params.formula = {
        noConditionFormula: params.formula
      };
    } else if (data.formulaType === 1) {
      Object.assign(addmanyChange, echoParamsChange(data.formulaParams));
    }
    // if (isValidJSON(data.formula)) {
    //   if (params.formulaType == 0) {
    //     params.formula = isValidJSON(data.formula);
    //   } else if (params.formulaType == 1) {
    //     let aa = JSON.parse(data.formula);
    //     let bb = JSON.parse(aa.noConditionFormula);
    //     Object.assign(addmanyChange, bb);
    //   }
    // }
    if (!data.formula) {
      params.formula = {
        noConditionFormula: ""
      };
    } else {
    }
  } else {
    ElMessage.error(msg);
  }
};
const $emit = defineEmits(["refresh"]);
// 更新指标
const postUpdateApi = async () => {
  if (params.formulaType == 0) {
    params.formula = params.formula.noConditionFormula;
  } else {
    params.formula = {
      noConditionFormula: ""
    };
    // 判断是公式还是数字
    if (containsKeywordInScore(addmanyChange.outerConditionValue, GONG_SHI)) {
      addmanyChange.outerConditionValueExpress =
        addmanyChange.outerConditionValue;
    }
    addmanyChange.innerConditionExpression.map(inn => {
      if (containsKeywordInScore(inn?.startValue, GONG_SHI)) {
        inn.startExpress = inn.startValue;
      }
      if (containsKeywordInScore(inn?.endValue, GONG_SHI)) {
        inn.endExpress = inn.endValue;
      }
      if (containsKeywordInScore(inn?.innerScore, GONG_SHI)) {
        inn.innerScoreExpress = inn.innerScore;
      }
      if (
        containsKeywordInScore(
          inn?.scoreRuleMoreInnerVO[0]?.innerConditionValue,
          GONG_SHI
        )
      ) {
        inn.scoreRuleMoreInnerVO[0].innerConditionValueExpress =
          inn.scoreRuleMoreInnerVO[0].innerConditionValue;
      }
      inn?.scoreRuleMoreInnerVO[0]?.scoreRules.map(isc => {
        if (containsKeywordInScore(isc?.score, GONG_SHI)) {
          isc.scoreExpress = isc.score;
        }
        if (containsKeywordInScore(isc?.startValue, GONG_SHI)) {
          isc.startExpress = isc.startValue;
        }
        if (containsKeywordInScore(isc?.endValue, GONG_SHI)) {
          isc.endExpress = isc.endValue;
        }
      });
    });
    params.formula.noConditionFormula = JSON.stringify(addmanyChange);
    delete params.formula;
    params.formulaParams = formulaParamsChange(addmanyChange);
  }
  const { msg, code } = await postUpdate(params);
  if (code === 200) {
    ElMessage({
      message: "编辑成功",
      type: "success"
    });
    $emit("refresh");
    disabledValue.value = true;
    editShow.value = true;
    drawer.value = !drawer.value;
  }
};
// 公式验证
const dialogFormVisibleFormula = ref(false);
const formulaForm = ref([]);
const grade = ref();
const conditionVerifyApi = async () => {
  grade.value = null;
  formulaForm.value = [];
  dialogFormVisibleFormula.value = true;
  try {
    formulaForm.value = [];
    grade.value = "";
    console.log("params", params);

    const keywords = [
      "完成值",
      "目标值",
      "门槛值",
      "挑战值",
      "增幅",
      "降幅",
      "上期完成值",
      "上上期完成值"
    ];
    let str = params.formula.noConditionFormula;
    // 创建一个正则表达式，匹配这些关键词
    const regex = new RegExp(keywords.join("|"), "g");
    // 提取字符串中的所有关键词
    let matches = str.match(regex);
    console.log("匹配到的关键词:", matches);
    matches.forEach(matchItem => {
      formulaForm.value.push({
        name: matchItem,
        value: ""
      });
    });
    let result = str.replace(regex, match => {
      return `${match}`;
    });
  } catch (err) {
    //
  }
};
// 计算
// 多条件公式计算
function reverseReplace(oldValue, dataObject) {
  // 确保 formulaForm 是一个数组
  if (!Array.isArray(oldValue)) {
    throw new Error("formulaForm 应该是一个数组");
  }
  oldValue.forEach(item => {
    // 遍历外部条件和内部条件的表达式
    for (const key in dataObject) {
      const value = dataObject[key];

      if (typeof value === "string") {
        // 如果字符串中包含当前name，则替换该值
        if (value.includes(item.name)) {
          dataObject[key] = value.replace(item.name, item.value);
        }
      } else if (Array.isArray(value)) {
        // 如果是数组，递归替换数组中的每个对象
        value.forEach(innerObj => {
          for (const innerKey in innerObj) {
            const innerValue = innerObj[innerKey];
            if (
              typeof innerValue === "string" &&
              innerValue.includes(item.name)
            ) {
              innerObj[innerKey] = innerValue.replace(item.name, item.value);
            }
          }
        });
      }
    }
  });
  return dataObject;
}
function calculateScore(inputString) {
  // 将 formulaForm.value 转换为一个键值对映射，方便替换
  const valueMap = formulaForm.value.reduce((map, item) => {
    map[item.name] = item.value !== null ? item.value : 0; // 用 0 替代 null
    return map;
  }, {});

  // 替换字符串中的关键字为对应的 value 值
  let formula = inputString;
  for (const [key, value] of Object.entries(valueMap)) {
    if (formula.includes(key)) {
      // 使用正则替换所有匹配的关键字
      const regex = new RegExp(key, "g");
      formula = formula.replace(regex, value);
    }
  }

  try {
    // 使用 eval 计算公式
    const result = eval(formula);
    return result;
  } catch (error) {
    console.error("公式计算出错:", error);
    return null;
  }
}

const countComputed = async () => {
  try {
    if (params.formulaType == 0) {
      const params0: {
        formulaType: number;
        formula?: string;
      } = {
        formulaType: params.formulaType
      };
      if (params.formula && params.formula.noConditionFormula) {
        params0.formula = `(${params.formula.noConditionFormula})`;
      }
      const { code, msg } = await conditionVerify(params0);
      if (code == 200) {
        const keywords = [
          "完成值",
          "目标值",
          "门槛值",
          "挑战值",
          "增幅",
          "降幅",
          "上期完成值",
          "上上期完成值"
        ];
        let str = params.formula.noConditionFormula;
        // 创建一个正则表达式，匹配这些关键词
        const regex = new RegExp(keywords.join("|"), "g");
        let result = str.replace(regex, match => {
          // 在 formulaForm.value 中查找匹配的项
          let matchedItem = formulaForm.value.find(item => item.name === match);

          // 如果找到匹配项，返回其 value，否则返回原始匹配值
          if (matchedItem) {
            return matchedItem.value; // 替换为对应的值
          }
          return match; // 如果没有匹配项，返回原始匹配值
        });
        // calculator.calculate(result);
        // grade.value = calculator.get();
        grade.value = eval(result).toFixed(2);
      } else {
        ElMessageBox.confirm(
          "如果不修改将无法计算得分",
          "公式计算错误,修改后确认",
          {
            type: "warning"
          }
        ).then(() => {
          dialogFormVisibleFormula.value = false;
        });
      }
    } else if (params.formulaType == 1) {
      // 判断是公式还是数字
      if (containsKeywordInScore(addmanyChange.outerConditionValue, GONG_SHI)) {
        addmanyChange.outerConditionValueExpress =
          addmanyChange.outerConditionValue;
      }
      // let oldValue = JSON.parse(JSON.stringify(addmanyChange));
      // const formulaPar = JSON.stringify(oldValue);
      const params1: {
        formulaType: number;
        formulaParams?: any[];
      } = {
        formulaType: params.formulaType
      };
      if (addmanyChange) {
        params1.formulaParams = formulaParamsChange(addmanyChange);
      }
      const res = await conditionVerify(params1);
      if (res.code == 200) {
        // if (oldValue.outerConditionValue) {
        //   oldValue.outerConditionValue = calculateScore(
        //     oldValue.outerConditionValue
        //   );
        // }
        // 暂时注释上面代码，不知道会不会影响到其他业务逻辑，待验证
        const oldValue = JSON.parse(JSON.stringify(addmanyChange));
        if (formulaForm.value && Array.isArray(formulaForm.value) && oldValue) {
          const keywordss = [
            "完成值",
            "目标值",
            "门槛值",
            "挑战值",
            "增幅",
            "降幅",
            "上期完成值",
            "上上期完成值"
          ];
          if (
            keywordss.find(item => oldValue.outerConditionValueExpress == item)
          ) {
            for (const item of formulaForm.value) {
              if (oldValue.outerConditionValueExpress === item.name) {
                oldValue.outerConditionValue = item.value;
                break;
              }
            }
          } else {
            const keywords = [
              "完成值",
              "目标值",
              "门槛值",
              "挑战值",
              "增幅",
              "降幅",
              "上期完成值",
              "上上期完成值"
            ];
            let str = oldValue.outerConditionValueExpress;
            // 创建一个正则表达式，匹配这些关键词
            const regex = new RegExp(keywords.join("|"), "g");
            let result = str.replace(regex, match => {
              // 在 formulaForm.value 中查找匹配的项
              let matchedItem = formulaForm.value.find(
                item => item.name === match
              );

              // 如果找到匹配项，返回其 value，否则返回原始匹配值
              if (matchedItem) {
                return matchedItem.value; // 替换为对应的值
              }
              return match; // 如果没有匹配项，返回原始匹配值
            });
            // calculator.calculate(result);
            // grade.value = calculator.get();
            oldValue.outerConditionValue = eval(result).toFixed(2);
          }
        }
        if (oldValue.innerConditionExpression.length > 0) {
          oldValue.innerConditionExpression.map(itEx => {
            if (itEx.startValue) {
              itEx.startValue = calculateScore(itEx.startValue);
            }
            if (itEx.endValue) {
              itEx.endValue = calculateScore(itEx.endValue);
            }
            if (itEx.innerScore) {
              itEx.innerScore = calculateScore(itEx.innerScore);
            }
            if (itEx?.scoreRuleMoreInnerVO[0]?.innerConditionValue) {
              itEx.scoreRuleMoreInnerVO[0].innerConditionValue = calculateScore(
                itEx.scoreRuleMoreInnerVO[0].innerConditionValue
              );
            }
            if (itEx?.scoreRuleMoreInnerVO[0]?.scoreRules.length > 0) {
              itEx.scoreRuleMoreInnerVO[0].scoreRules.map(itRule => {
                if (itRule.score) {
                  itRule.score = calculateScore(itRule.score);
                }
                if (itRule.startValue) {
                  itRule.startValue = calculateScore(itRule.startValue);
                }
                if (itRule.endValue) {
                  itRule.endValue = calculateScore(itRule.endValue);
                }
              });
            }
          });
        }
        console.log(formulaForm.value, "-----");
        // let newValue = reverseReplace(formListNum, oldValue);
        // console.log(oldValue, "oldValue--最终传值");
        const { code, msg, data } = await calculateScoreByConditionMoCondition({
          ...params1,
          calculateScore: formulaForm.value.reduce((map, item) => {
            map[item.name] = item.value !== null ? item.value : 0; // 用 0 替代 null
            return map;
          }, {})
        });
        if (code == 200) {
          grade.value = data;
        }
      } else {
        ElMessageBox.confirm(
          "如果不修改将无法计算得分",
          "公式计算错误,修改后确认",
          {
            type: "warning"
          }
        ).then(() => {
          dialogFormVisibleFormula.value = false;
        });
      }
    }
  } catch (err) {
    console.log(err);
  }
};
// 判断是否为json
function isValidJSON(str) {
  try {
    if (!str.includes("\\\\")) {
      return JSON.parse(str);
    } else {
      return JSON.parse(JSON.parse(str));
    }
    // return true; // 如果解析成功，返回true
  } catch (e) {
    return false; // 如果解析失败，返回false
  }
}
const handleClose = (done: () => void) => {
  drawer.value = false;
  disabledValue.value = true;
  editShow.value = true;
  // ElMessageBox.confirm("配置项未保存，确认关闭", {
  //   type: "warning"
  // }).then(() => {

  // });
};
function cancelClick() {
  drawer.value = false;
  Object.assign(params, {
    id: "",
    tpId: "",
    dimId: "",
    indId: "",
    valueInput: "",
    scoreStandard: 0,
    remark: "",
    scoreRule: "",
    targetValue: "",
    finalValue: "",
    formulaType: 0,
    challengeValue: "",
    startValue: "",
    datasoure: "",
    weight: "",
    scoreValue: "",
    formula: {
      noConditionFormula: ""
    },
    personList: ""
  });
  disabledValue.value = true;
  editShow.value = true;
}
function confirmClick() {
  postUpdateApi();
}
const open = row => {
  drawer.value = true;
  params.designatedPersonnel = "";
  Object.assign(params, {
    id: "",
    tpId: "",
    dimId: "",
    indId: "",
    valueInput: "",
    scoreStandard: 0,
    designatedPersonnel: "",
    remark: "",
    scoreRule: "",
    targetValue: "",
    finalValue: "",
    formulaType: 0,
    challengeValue: "",
    startValue: "",
    datasoure: "",
    weight: "",
    valueScore: null,
    scoreValue: "",
    formula: {
      noConditionFormula: ""
    },
    personList: ""
  });
  Object.assign(addmanyChange, {
    outerConditionValue: "",
    outerConditionValueExpress: "",
    innerConditionExpression: [
      {
        startValue: null,
        endValue: null,
        select: null,
        comparisonStart: null,
        comparisonEnd: null,
        innerScore: null,
        innerScoreExpress: null,
        scoreRuleMoreInnerVO: []
      }
    ]
  });
  console.log("打印是否触发数据");
  getIndexInfoApi(row.id);
  calculatorShow.value = true;
};
const editShow = ref(true);
defineExpose({
  open
});
const timer = ref("");
// 公式计算
const compute = [
  {
    value: 0,
    label: "无条件公式"
  },
  {
    value: 1,
    label: "多条件公式"
  }
];
const bgColor = ref(null);
const rolesList = reactive({
  data: [
    { name: "完成值 / 目标值", id: 1 },
    { name: "完成值 - 目标值", id: 2 },
    { name: "目标值 - 完成值", id: 3 },
    { name: "门槛值", id: 4 },
    { name: "目标值", id: 5 },
    { name: "挑战值", id: 6 },
    { name: "完成值", id: 7 },
    { name: "增幅", id: 8 },
    { name: "降幅", id: 9 },
    { name: "上期完成值", id: 10 },
    { name: "上上期完成值", id: 11 }
  ],
  value: "",
  num: null
});
// 监听formulaType变化
const watchFormulaType = value => {
  if (value == 0 && typeof params.formula == "string") {
    let aa = JSON.parse(params.formula);
    params.formula = aa;
    params.formula.noConditionFormula = "";
  }
};
const lookRoles = item => {
  if (isValidJSON(params.formula)) {
    params.formula = JSON.parse(params.formula);
  }
  bgColor.value = item.id;
  params.formula.noConditionFormula =
    params.formula.noConditionFormula + item.name;
};
// 字符拼接
const countNumber = (item: string) => {
  params.formula.noConditionFormula = params.formula.noConditionFormula + item;
};
// 清除
const remove = () => {
  if (params.formula.noConditionFormula.length > 0) {
    params.formula.noConditionFormula = params.formula.noConditionFormula.slice(
      0,
      -1
    );
  }
};
// 清空
const removeVoid = () => {
  params.formula.noConditionFormula = "";
};
// 计算确认
//
const calculatorShow = ref(true);
const count = item => {
  ElMessageBox.confirm("配置项确认保存？确认关闭", {
    type: "warning"
  }).then(() => {
    calculatorShow.value = false;
  });
  // try {
  //   calculator.calculate(rolesList.value);
  //   rolesList.num = calculator.get();
  // } catch (error) {
  //   ElMessage({
  //     message: "计算错误",
  //     type: "warning"
  //   });
  //   console.log(error);
  // }
};
// 多条件公式
const addmanyChange = reactive({
  outerConditionValue: "",
  outerConditionValueExpress: "",
  innerConditionExpression: [
    {
      startValue: null,
      endValue: null,
      select: null,
      comparisonStart: null,
      comparisonEnd: null,
      innerScore: null,
      innerScoreExpress: null,
      scoreRuleMoreInnerVO: [
        // {
        //   innerConditionValue: null,
        //   scoreRules: [
        //     {
        //       score: null,
        //       startValue: null,
        //       select: "",
        //       endValue: null,
        //       comparisonStart: null,
        //       comparisonEnd: null
        //     }
        //   ]
        // }
      ]
    }
  ]
});
// 添加子条件
const addItemFormulaList = (item, index) => {
  addmanyChange.innerConditionExpression[index].scoreRuleMoreInnerVO = [
    {
      innerConditionValue: null,
      innerConditionValueExpress: null,
      scoreRules: [
        {
          score: null,
          scoreExpress: null,
          startValue: null,
          startExpress: null,
          endValue: null,
          endExpress: null,
          select: null,
          comparisonStart: null,
          comparisonEnd: null
        }
      ]
    }
  ];
  addmanyChange.innerConditionExpression[index].innerScore = "";
  changeAddMay();
};

const deleteItem = index => {
  addmanyChange.innerConditionExpression.splice(index, 1);
  changeAddMay();
};
const dataleListItem = (index, indexList) => {
  addmanyChange.innerConditionExpression[
    index
  ].scoreRuleMoreInnerVO[0].scoreRules.splice(indexList, 1);
  changeAddMay();
};
// 条件变量
const dataleListItemAll = (item, index) => {
  item.scoreRuleMoreInnerVO = [];
  changeAddMay();
};
const addNewItem = () => {
  addmanyChange.innerConditionExpression.push({
    startValue: null,
    endValue: null,
    select: null,
    comparisonStart: null,
    comparisonEnd: null,
    scoreRuleMoreInnerVO: []
  });
  changeAddMay();
};
const addNewItemOldValue = item => {
  addmanyChange.innerConditionExpression.push({
    startValue: item.endValue,
    select: null,
    endValue: null,
    comparisonStart: item.comparisonEnd == ">" ? "≥" : ">",
    comparisonEnd: null,
    scoreRuleMoreInnerVO: []
  });
  changeAddMay();
};
const addItemDataList = (
  index: number,
  itemList: any,
  indexList: number,
  item
) => {
  addmanyChange.innerConditionExpression[
    index
  ].scoreRuleMoreInnerVO[0].scoreRules.push({
    select: null,
    score: null,
    scoreExpress: null,
    startValue: itemList.endValue,
    endValue: null,
    comparisonStart: itemList.comparisonEnd,
    comparisonEnd: null
  });
  addmanyChange.innerConditionExpression[index].innerScore = "";
  changeAddMay();
};
// 多条件公式验证
const keywords = [
  "目标值",
  "完成值",
  "挑战值",
  "门槛值",
  "增幅",
  "降幅",
  "上期完成值",
  "上上期完成值"
];
// 处理字符串，提取关键词
function extractKeywords(value) {
  // 如果是字符串，处理包含的关键词
  if (typeof value === "string") {
    // 提取所有关键词
    keywords.forEach(keyword => {
      if (value.includes(keyword)) {
        formulaForm.value.push({
          name: keyword,
          value: null // 可以根据需求赋值
        });
      }
    });
  }
}
// 遍历对象并处理
function traverseObject(obj) {
  if (obj && typeof obj === "object") {
    for (const key in obj) {
      if (obj.hasOwnProperty(key)) {
        const value = obj[key];

        // 如果值是字符串，调用提取函数
        if (typeof value === "string") {
          extractKeywords(value);
        }

        // 如果值是数组，递归处理
        if (Array.isArray(value)) {
          value.forEach(item => traverseObject(item));
        }
      }
    }
  }
}
function extractKeywordsAndPush(keywordsList, inputString) {
  keywords.forEach(keyword => {
    if (
      inputString?.includes(keyword) && // 检查字符串是否包含关键字
      !formulaForm.value.some(item => item.name === keyword) // 确保没有重复
    ) {
      // 如果包含且未重复，构造对象并push到formulaForm.value
      formulaForm.value.push({
        name: keyword,
        value: null // 根据需求赋值
      });
    }
  });

  return formulaForm;
}
const manyConditions = () => {
  grade.value = null;
  dialogFormVisibleFormula.value = true;
  formulaForm.value = [];
  // 提取 addmanyChange 对象中的条件值
  let oldValue = addmanyChange;
  if (oldValue.outerConditionValue) {
    extractKeywordsAndPush(keywords, oldValue.outerConditionValue);
  }
  if (oldValue.innerConditionExpression.length > 0) {
    oldValue.innerConditionExpression.map(itemExp => {
      if (itemExp.startValue) {
        extractKeywordsAndPush(keywords, itemExp.startValue);
      }
      if (itemExp.endValue) {
        extractKeywordsAndPush(keywords, itemExp.endValue);
      }
      if (itemExp.innerScore) {
        extractKeywordsAndPush(keywords, itemExp.innerScore);
      }
      if (itemExp?.scoreRuleMoreInnerVO[0]?.innerConditionValue) {
        extractKeywordsAndPush(
          keywords,
          itemExp.scoreRuleMoreInnerVO[0].innerConditionValue
        );
      }
      if (itemExp?.scoreRuleMoreInnerVO.length > 0) {
        if (itemExp?.scoreRuleMoreInnerVO[0]?.scoreRules.length > 0) {
          itemExp?.scoreRuleMoreInnerVO[0]?.scoreRules.map(itSc => {
            if (itSc.score) {
              extractKeywordsAndPush(keywords, itSc.score);
            }
            if (itSc.startValue) {
              extractKeywordsAndPush(keywords, itSc.startValue);
            }
            if (itSc.endValue) {
              extractKeywordsAndPush(keywords, itSc.endValue);
            }
          });
        }
      }
    });
  }
};
// 计算器
const jishuanqiRef = ref();
const countNoConditionFormula = item => {
  addmanyChange.outerConditionValue = item;
  changeAddMay();
};
const jishuanqiRef1 = ref();
const countNoConditionFormula1 = (item, index) => {
  addmanyChange.innerConditionExpression[index].endValue = item;
  changeAddMay();
};
const jishuanqiRef2 = ref();
const countNoConditionFormula2 = (item, index) => {
  // innerConditionValue
  addmanyChange.innerConditionExpression[
    index
  ].scoreRuleMoreInnerVO[0].innerConditionValue = item;
  changeAddMay();
};
const jishuanqiRef3 = ref();
const countNoConditionFormula3 = (item, index, indexList) => {
  addmanyChange.innerConditionExpression[
    index
  ].scoreRuleMoreInnerVO[0].scoreRules[indexList].endValue = item;
  changeAddMay();
};
const countNoConditionFormula4 = (item, index, indexList) => {
  addmanyChange.innerConditionExpression[
    index
  ].scoreRuleMoreInnerVO[0].scoreRules[indexList].score = item;
  changeAddMay();
};
const countNoConditionFormulaInnerScore = (item, index, indexList) => {
  addmanyChange.innerConditionExpression[index].innerScore = item;
  changeAddMay();
};

// 转换函数 --- 人员
const convertDepartmentDataRecursive_Person = data => {
  return data.map(department => {
    const { userNameNew, userCodeNew, children, type } = department;
    // 递归处理子节点
    const processedChildren =
      children.length > 0
        ? convertDepartmentDataRecursive_Person(children)
        : [];
    // 检查子节点是否有 type 为 "user" 的节点
    const hasUserInChildren = processedChildren.some(child => !child.disabled);
    // 当前节点是否为 user 类型
    const isUser = type === "user";
    // 判断当前节点是否需要禁用
    const shouldDisable = !isUser && !hasUserInChildren;

    return {
      value: userCodeNew,
      label: userNameNew,
      children: processedChildren,
      disabled: shouldDisable
    };
  });
};
postListTreeWithUserApi();
const assessmentTypeRef = ref();
const handleRreeSelect = () => {
  const arr = assessmentTypeRef.value.getCheckedNodes().filter(item => {
    return item.children.length == 0;
  });
  params.designatedPersonnel = arr.map(item => item.value).join(",");
};
// 取消计算
const quxiaoCmputed = () => {
  formulaForm.value = [];
  dialogFormVisibleFormula.value = false;
};
// 监听数据变化
const changeAddMay = () => {
  let addmanyChangeOldVal = JSON.parse(JSON.stringify(addmanyChange));
  addmanyChange.innerConditionExpression.forEach((item, index, arr) => {
    if (index + 1 <= arr.length) {
      if (item.endValue) {
        if (addmanyChangeOldVal.innerConditionExpression.length > 1) {
          addmanyChangeOldVal.innerConditionExpression[index + 1].startValue =
            item?.endValue;
          addmanyChangeOldVal.innerConditionExpression[index + 1].startExpress =
            item?.endExpress;
          addmanyChangeOldVal.innerConditionExpression[
            index + 1
          ].comparisonStart = item?.comparisonEnd == "≥" ? ">" : "≥";
        }
      }
      if (item.scoreRuleMoreInnerVO.length > 0) {
        if (item.scoreRuleMoreInnerVO[0].scoreRules.length > 0) {
          item.scoreRuleMoreInnerVO[0].scoreRules.map((it, id, arrChild) => {
            if (id + 1 <= arrChild.length) {
              if (it.endValue) {
                // if (
                //   addmanyChangeOldVal.innerConditionExpression[index + 1]
                //     .scoreRuleMoreInnerVO.length > 0
                // ) {
                addmanyChangeOldVal.innerConditionExpression[
                  index
                ].scoreRuleMoreInnerVO[0].scoreRules[id + 1].startValue =
                  it?.endValue;
                addmanyChangeOldVal.innerConditionExpression[
                  index
                ].scoreRuleMoreInnerVO[0].scoreRules[id + 1].startExpress =
                  it?.startExpress;
                addmanyChangeOldVal.innerConditionExpression[
                  index
                ].scoreRuleMoreInnerVO[0].scoreRules[id + 1].comparisonStart =
                  it?.comparisonEnd == "≥" ? ">" : "≥";
                // }
              }
            }
          });
        }
      }
    }
  });
  Object.assign(addmanyChange, addmanyChangeOldVal);
};
const formulaFocus = () => {
  calculatorShow.value = true;
};
const changeValueInput = val => {
  if (val == 4 || val == "4") {
    params.valueScore = 0;
  }
};
// { deep: true };
</script>

<template>
  <div>
    <el-drawer
      v-model="drawer"
      :direction="direction"
      :before-close="handleClose"
      size="700px"
    >
      <template #header>
        <h4>指标设置</h4>
      </template>
      <template #default>
        <div>
          <el-form label-position="top" label-width="auto" :model="params">
            <el-form-item label="完成值录入人" label-position="top">
              <el-select
                v-model="params.valueInput"
                placeholder="请选择"
                @change="changeValueInput"
              >
                <el-option label="被考核人" :value="0" />
                <!-- <el-option label="上级" :value="1" /> -->
                <el-option label="指定人员" :value="2" />
                <el-option label="考核管理员" :value="3" />
                <el-option label="指标自动采集" :value="4" />
              </el-select>
              <el-tree-select
                v-if="params.valueInput == 2"
                ref="assessmentTypeRef"
                v-model="params.personList"
                multiple
                :data="convertDepartmentDataRecursive_Person(treeDept)"
                :render-after-expand="false"
                show-checkbox
                style="margin-top: 10px"
                @check-change="handleRreeSelect()"
              />
            </el-form-item>
            <el-form-item
              v-if="params.valueInput == 4"
              label="完成值计算方式"
              label-position="top"
            >
              <el-radio-group v-model="params.valueScore">
                <el-radio :value="0" size="large">统计计算</el-radio>
                <el-radio :value="1" size="large">累加计算</el-radio>
              </el-radio-group>
            </el-form-item>
            <el-form-item label="评分方式" label-position="top">
              <el-select v-model="params.scoreStandard" placeholder="请选择">
                <el-option label="手动输入" :value="0" />
                <el-option label="公式自动计算" :value="1" />
              </el-select>
            </el-form-item>
            <div v-if="params.scoreStandard === 1">
              <el-form-item label="公式类型" label-position="top">
                <el-select
                  v-model="params.formulaType"
                  placeholder="请选择"
                  @change="watchFormulaType"
                >
                  <el-option
                    v-for="item in compute"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value"
                  />
                </el-select>
              </el-form-item>
              <el-form-item
                v-if="params.formulaType === 0"
                label="公式设置"
                label-position="top"
              >
                <div>
                  <div>
                    <el-text>得分 =</el-text>
                    <el-input
                      v-model="params.formula.noConditionFormula"
                      class="ml-2 mr-2"
                      style="width: 240px"
                      @focus="formulaFocus"
                    />
                    <el-text>
                      <el-button type="primary" @click="conditionVerifyApi"
                        >公式验证</el-button
                      >
                    </el-text>
                  </div>
                  <div
                    v-if="calculatorShow"
                    class="w-[500px] compute h-64 mt-1 ml-12 flex justify-evenly items-center"
                    style="user-select: none"
                  >
                    <div class="w-1/3 h-60 pl-1 bg-white rounded-md">
                      <div class="w-[100%] text-xs mt-2">
                        <div><el-text type="info">:::变量</el-text></div>
                      </div>
                      <el-scrollbar height="200px">
                        <div v-for="item in rolesList.data" :key="item.id">
                          <div
                            :class="[
                              'cursor-pointer text-xs mt-1',
                              { bgBack: bgColor === item.id }
                            ]"
                            @click="lookRoles(item)"
                          >
                            <el-text class="">{{ item.name }}</el-text>
                          </div>
                        </div>
                      </el-scrollbar>
                    </div>
                    <div class="w-3/5 ml-2 h-60 flex flex-col">
                      <div class="w-[100%] text-xs h-24 bg-white rounded-md">
                        <div class="p-1"><el-text>得分 = </el-text></div>
                        <!-- style="height: 95px" -->
                        <el-input
                          v-model="params.formula.noConditionFormula"
                          :rows="3"
                          disabled
                          type="textarea"
                          placeholder='示例:"完成值" / "目标值" * 100'
                        />
                      </div>
                      <div class="w-[100%] h-32 mt-2 rounded-md flex flex-col">
                        <div class="flex justify-between h-8">
                          <div
                            class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                            @click="countNumber('1')"
                          >
                            1
                          </div>
                          <div
                            class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                            @click="countNumber('2')"
                          >
                            2
                          </div>
                          <div
                            class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                            @click="countNumber('3')"
                          >
                            3
                          </div>
                          <div
                            class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                            @click="countNumber('+')"
                          >
                            +
                          </div>
                          <div
                            class="h-full w-[50px] text-white bg-orange-400 mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                            @click="remove"
                          >
                            x
                          </div>
                        </div>
                        <div class="flex justify-between h-8 mt-1">
                          <div
                            class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                            @click="countNumber('4')"
                          >
                            4
                          </div>
                          <div
                            class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                            @click="countNumber('5')"
                          >
                            5
                          </div>
                          <div
                            class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                            @click="countNumber('6')"
                          >
                            6
                          </div>
                          <div
                            class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                            @click="countNumber('-')"
                          >
                            -
                          </div>
                          <div
                            class="text-xs h-full w-[50px] text-white bg-orange-400 mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                            @click="removeVoid"
                          >
                            清空
                          </div>
                        </div>
                        <div class="flex justify-between h-16 mt-1">
                          <div>
                            <div class="flex justify-between">
                              <div
                                class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                                @click="countNumber('7')"
                              >
                                7
                              </div>
                              <div
                                class="h-full ml-1 w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                                @click="countNumber('8')"
                              >
                                8
                              </div>
                              <div
                                class="h-full ml-2 w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                                @click="countNumber('9')"
                              >
                                9
                              </div>
                              <div
                                class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                                @click="countNumber('*')"
                              >
                                *
                              </div>
                            </div>
                            <div class="flex mt-1 justify-between">
                              <div
                                class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                                @click="countNumber('0')"
                              >
                                0
                              </div>
                              <div
                                class="h-full ml-1 w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                                @click="countNumber('.')"
                              >
                                .
                              </div>
                              <div
                                class="h-full ml-2 w-[50px] bg-white mx-1 flex justify-between items-center rounded-lg cursor-pointer"
                              >
                                <div
                                  class="w-1/2 h-full text-center border-r text-gray-100"
                                  @click="countNumber('(')"
                                >
                                  <span class="text-black"> (</span>
                                </div>
                                <div
                                  class="w-1/2 h-full text-center"
                                  @click="countNumber(')')"
                                >
                                  )
                                </div>
                              </div>
                              <div
                                class="h-full w-[50px] bg-white mx-1 flex justify-center items-center rounded-lg cursor-pointer"
                                @click="countNumber('/')"
                              >
                                /
                              </div>
                            </div>
                          </div>
                          <div
                            class="h-full mr-1 w-[50px] text-white flex justify-center items-center rounded-lg cursor-pointer areYouOK"
                            @click="count"
                          >
                            确认
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </el-form-item>
              <el-form-item v-else label="公式设置">
                <div class="w-full">
                  <div class="flex items-center">
                    <el-text>条件值 = </el-text>
                    <!-- <el-input
                      v-model="addmanyChange.outerConditionValue"
                      class="ml-2"
                      style="width: 240px"
                    /> -->
                    <jishuanqi
                      ref="jishuanqiRef"
                      :outerConditionValue="addmanyChange.outerConditionValue"
                      @handClick="countNoConditionFormula"
                    />
                  </div>
                  <div class="w-full mt-2">
                    <div
                      v-for="(
                        item, index
                      ) in addmanyChange.innerConditionExpression"
                      :key="index"
                    >
                      <div class="mt-3">
                        <div class="flex">
                          <el-text class="w-[15px]" type="primary">
                            {{ index + 1 }}
                          </el-text>
                          <div class="w-[40px] ml-4">
                            {{ item.startValue }}
                          </div>
                          <div class="mr-2">
                            {{ item.comparisonStart }}
                          </div>
                          <div class="mr-2">条件值</div>
                          <el-select
                            v-model="item.comparisonEnd"
                            style="width: 60px"
                            placeholder=""
                            :disabled="
                              index + 1 ==
                                addmanyChange.innerConditionExpression.length &&
                              index >= 1
                                ? true
                                : false
                            "
                          >
                            <el-option label=">" value=">" />
                            <el-option label="≥" value="≥" />
                          </el-select>
                          <el-select
                            v-model="item.select"
                            class="ml-2"
                            style="width: 80px"
                            placeholder=""
                            :disabled="
                              index + 1 ==
                                addmanyChange.innerConditionExpression.length &&
                              index >= 1
                                ? true
                                : false
                            "
                          >
                            <el-option label="数值" value="数值" />
                            <el-option label="公式" value="公式" />
                          </el-select>
                          <el-input
                            v-if="
                              index + 1 ==
                                addmanyChange.innerConditionExpression.length &&
                              index >= 1
                            "
                            disabled
                            class="ml-2 mr-5"
                            style="width: 80px"
                          />
                          <div v-else>
                            <jishuanqi
                              v-if="item.select == '公式'"
                              ref="jishuanqiRef"
                              :index="index"
                              :outerConditionValue="item.endValue"
                              class="ml-2 mr-5"
                              style="width: 80px"
                              @handClick="countNoConditionFormula1"
                            />
                            <el-input
                              v-else
                              v-model="item.endValue"
                              class="ml-2 mr-5"
                              style="width: 80px"
                              @blur="changeAddMay"
                            />
                          </div>
                          <el-text v-if="item.scoreRuleMoreInnerVO.length == 0"
                            >得分 =
                          </el-text>
                          <!-- <el-input
                            v-if="
                              index + 1 ==
                                addmanyChange.innerConditionExpression.length &&
                              index >= 1
                            "
                            disabled
                            class="ml-2 mr-5"
                            style="width: 100px"
                          /> -->
                          <div>
                            <jishuanqi
                              v-if="item.scoreRuleMoreInnerVO.length == 0"
                              ref="jishuanqiRef"
                              :index="index"
                              :outerConditionValue="item.innerScore"
                              class="ml-2 mr-6"
                              style="width: 100px"
                              @handClick="countNoConditionFormulaInnerScore"
                            />
                          </div>
                          <el-text type="danger" @click="deleteItem(index)">
                            <el-icon>
                              <Delete />
                            </el-icon>
                          </el-text>
                        </div>
                        <div
                          v-for="(itemVO, indexOV) in item.scoreRuleMoreInnerVO"
                          :key="indexOV"
                        >
                          <div class="flex mt-2 ml-20">
                            <div class="mr-2">条件值{{ index + 1 }} =</div>
                            <!-- <el-input v-if="
                              index + 1 ==
                              addmanyChange.innerConditionExpression
                                .length && index >= 1
                            " disabled class="ml-2 mr-6" style="width: 208px" /> -->
                            <jishuanqi
                              ref="jishuanqiRef"
                              :index="index"
                              :outerConditionValue="itemVO.innerConditionValue"
                              class="ml-2 mr-6"
                              style="width: 208px"
                              @handClick="countNoConditionFormula2"
                            />
                            <!-- <el-input v-model="itemVO.innerConditionValue" class="ml-2 mr-6" style="width: 208px" /> -->
                            <el-text
                              type="danger"
                              @click="dataleListItemAll(item, index)"
                            >
                              <el-icon>
                                <Delete />
                              </el-icon>
                            </el-text>
                          </div>
                          <div
                            v-for="(itemList, indexList) in itemVO.scoreRules"
                            :key="indexList"
                            class="ml-3"
                          >
                            <div class="flex mt-2 ml-16 items-center">
                              <div class="text_border">{{ indexList + 1 }}</div>
                              <!-- manyChange.dataList[index].dataList -->
                              <div class="w-[40px] ml-2">
                                {{ itemList.startValue }}
                              </div>
                              <div class="mr-2">
                                {{ itemList.comparisonStart }}
                              </div>
                              <div class="mr-2">条件值{{ index + 1 }}</div>
                              <el-select
                                v-model="itemList.comparisonEnd"
                                style="width: 60px"
                                placeholder=""
                                :disabled="
                                  indexList + 1 == itemVO.scoreRules.length
                                    ? true
                                    : false
                                "
                              >
                                <el-option label=">" value=">" />
                                <el-option label="≥" value="≥" />
                              </el-select>
                              <el-select
                                v-model="itemList.select"
                                class="ml-2"
                                style="width: 80px"
                                placeholder=""
                                :disabled="
                                  indexList + 1 == itemVO.scoreRules.length
                                    ? true
                                    : false
                                "
                              >
                                <el-option label="数值" value="数值" />
                                <el-option label="公式" value="公式" />
                              </el-select>
                              <el-input
                                v-if="indexList + 1 == itemVO.scoreRules.length"
                                disabled
                                class="ml-2"
                                style="width: 80px"
                              />
                              <div v-else>
                                <jishuanqi
                                  v-if="itemList.select == '公式'"
                                  ref="jishuanqiRef"
                                  :index="index"
                                  :indexList="indexList"
                                  :outerConditionValue="itemList.endValue"
                                  class="ml-2"
                                  style="width: 80px"
                                  @handClick="countNoConditionFormula3"
                                />
                                <el-input
                                  v-else
                                  v-model="itemList.endValue"
                                  class="ml-2"
                                  style="width: 80px"
                                  @blur="changeAddMay"
                                />
                              </div>
                              <div
                                class="w-[150px] ml-2 mr-2 flex justify-between items-center"
                              >
                                <div>得分</div>
                                <div>=</div>
                                <!-- <el-input v-if="
                                  indexList + 1 == itemVO.scoreRules.length &&
                                  index >= 1
                                " disabled class="ml-2" style="width: 80px" /> -->
                                <jishuanqi
                                  ref="jishuanqiRef"
                                  :index="index"
                                  :indexList="indexList"
                                  :outerConditionValue="itemList.score"
                                  class="ml-2"
                                  style="width: 80px"
                                  @handClick="countNoConditionFormula4"
                                />
                                <!-- <el-input
                                  v-model="itemList.score"
                                  class="ml-2"
                                  style="width: 80px"
                                /> -->
                              </div>
                              <el-text
                                type="danger"
                                @click="dataleListItem(index, indexList)"
                              >
                                <el-icon>
                                  <Delete />
                                </el-icon>
                              </el-text>
                            </div>
                            <div
                              v-if="indexList + 1 == itemVO.scoreRules.length"
                              class="ml-16 mt-2 text-xs cursor-pointer"
                            >
                              <el-text
                                type="primary"
                                @click="
                                  addItemDataList(
                                    index,
                                    itemList,
                                    indexList,
                                    item
                                  )
                                "
                              >
                                <el-icon>
                                  <Plus />
                                </el-icon>
                                添加子条件
                              </el-text>
                            </div>
                          </div>
                        </div>
                      </div>
                      <div
                        v-if="item?.scoreRuleMoreInnerVO?.length == 0"
                        class="ml-20 mt-2 text-xs cursor-pointer"
                      >
                        <el-text
                          type="primary"
                          @click="addItemFormulaList(item, index)"
                        >
                          <el-icon>
                            <Plus />
                          </el-icon>
                          添加子条件
                        </el-text>
                      </div>
                      <div
                        v-if="
                          addmanyChange.innerConditionExpression.length >= 1 &&
                          index + 1 ==
                            addmanyChange.innerConditionExpression.length
                        "
                        class="mt-5 text-xs cursor-pointer"
                      >
                        <el-text
                          type="primary"
                          @click="addNewItemOldValue(item)"
                        >
                          <el-icon>
                            <Plus />
                          </el-icon>
                          添加条件
                        </el-text>
                      </div>
                    </div>
                    <div
                      v-if="addmanyChange.innerConditionExpression.length < 1"
                      class="mt-5 text-xs cursor-pointer"
                    >
                      <el-text type="primary" @click="addNewItem">
                        <el-icon>
                          <Plus />
                        </el-icon>
                        添加条件
                      </el-text>
                    </div>
                    <div class="float-right mr-8">
                      <el-button type="primary" @click="manyConditions"
                        >公式验证</el-button
                      >
                    </div>
                  </div>
                </div>
              </el-form-item>
            </div>
          </el-form>
        </div>
      </template>
      <template #footer>
        <div>
          <el-button @click="cancelClick">取消</el-button>
          <el-button type="primary" @click="confirmClick">确认</el-button>
        </div>
      </template>
    </el-drawer>
    <!-- 公式验证 -->
    <el-dialog
      v-model="dialogFormVisibleFormula"
      title="完成值"
      width="500"
      :before-close="quxiaoCmputed"
    >
      <el-form :model="formulaForm">
        <div v-for="(itemF, indexF) in formulaForm" :key="indexF">
          <el-form-item :label="itemF.name">
            <el-input v-model="itemF.value" autocomplete="off" />
          </el-form-item>
        </div>
        <el-form-item label="得分">
          <el-input v-model="grade" class="ml-3" autocomplete="off" disabled />
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="quxiaoCmputed">取消</el-button>
          <el-button type="primary" @click="countComputed"> 计算 </el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<style lang="scss" scoped>
.compute {
  // border: 1px solid #f3f3f3;
  background-color: #f3f3f3;
  border-radius: 5px;
}

.text-color {
  color: #f3f3f3;
}

.areYouOK {
  background-color: #409eff;
}

.bgBack {
  background-color: #f3f3f3;
}

.text_border {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 14px;
  height: 14px;
  // margin-top: 5px;
  margin-right: 5px;
  font-size: 12px;
  border: 1px solid gray;
  border-radius: 50%;
}
</style>
