import {
  listByFirstTaskId,
  listUserByIds,
  listWorkCenter,
  listByWorkCenter,
  lineByCurrentUser,
  taskSave,
  taskRevoked,
  taskAssignment,
  listAssign,
  checkAssignConfirm,
  resetAssignee,
  listByRoutingIds,
  listByFactoryId,
  checkExists,
  parameterGetByCode
} from '@/api/mainData/index.js';
import {
  releaseWorkOrder,
  getcheckLoginUserIsTeamLeader,
  getUserInfo
} from '@/api/workOrder/index.js';
export default {
  data() {
    return {
      isTpye: ''
    };
  },

  created() {
    // console.log('组件传入的选项：', this.$options.mixinOptions);
    this.isTpye = this.$options.mixinOptions.type;
  },

  methods: {
    // 查询班次
    getClassesData() {
      if (!this.current.factoriesId) return;
      listByFactoryId(this.current.factoriesId).then((res) => {
        if (!res) return;
        this.shiftList = res;
      });
    },
    // 查询是否派单
    queryCheckExists() {
      let params = {
        workOrderId: this.current.id,
        workCenterId: 123,
        teamId: 345
      };
      checkExists(params)
        .then((res) => {
          if (!res) return;
          this.isDispatchRow = res;
          if (res.hasExists) {
            this.form.taskAss = 0;
            this.orderDis = true;
            this.procTaskDis = false;
            // 报工类型 判断
            this.form.singleReport = res.dispatchType;
            if (res.dispatchType == 1) {
              this.batchDis = true;
              this.singleDis = false;
            } else {
              this.singleDis = true;
              this.batchDis = false;
            }
          } else {
            this.batchDis = false;
            this.singleDis = false;
            this.orderDis = false;
            this.procTaskDis = false;
          }
        })
        .catch((err) => {
          this.$message.error(err.message);
        });
    },
    // 获取当前年月日
    getFormattedDate() {
      const now = new Date();
      const year = now.getFullYear();
      const month = String(now.getMonth() + 1).padStart(2, '0');
      const date = String(now.getDate()).padStart(2, '0');
      return `${year}-${month}-${date}`;
    },
    // 查询工作中心
    async workCenterData() {
      // 判断是否存在工序id 有的话就取否则取首工序id
      console.log(this.current, 'this.current 查询工作中心');
      let id = '';
      if (!this.current.taskId || this.current.taskId < 0) {
        id = this.current.firstTaskId;
      } else {
        id = this.current.taskId;
      }
      if (this.current?.factoryName) {
        this.form.factoryName = this.current.factoryName;
      }
      // this.current.taskId || this.current.firstTaskId;
      const res = await listWorkCenter(id);
      console.log(res, 'ressss');
      const userData = await getUserInfo(this.$store.state.user.info.userId);

      this.workCenterList = res;
      if (res.length > 0) {
        // this.form.factoryName = res[0].factoryName;
        this.form.workCenterId = res[0].id;

        if (this.isTpye == 'add') {
          if (userData.centerList.length == 0) {
            this.form.isDisable = true;
            return this.$message.warning(
              `当前登录人没有配置所中心，请先去主数据给该登录人配置所属中心`
            );
          }

          if (userData.centerList.length != 0) {
            // centerId
            if (res.length != 0) {
              const data = userData.centerList.filter(
                (it) => it.centerId == res[0].id
              );

              if (data.length == 0) {
                this.form.isDisable = true;
                return this.$message.warning(`当前登录人没有权限给该工单派单`);
              }
            }
          }
        }
        // 查首工序
        await this.changeWork(res[0].id); // 选择工作中心
        this.getProductionData(res[0].id); // 查询产线
        this.FirstTaskIdFn(); // 查询工位数据
      } else {
        this.$message.warning(
          // `${this.current.firstTaskName}工序没有工作中心,请到主数据工序管理维护工序信息!`
          `当前登录人不属于首工序所属工作中心及班组，请切换首工序${this.current.firstTaskName}所在的班组成员派单`
        );
      }
    },
    // 查询工序列表数据
    changeDispatch(e) {
      this.tabsLoading = true;
      // listByWorkCenter(this.form.workCenterId)
      listByRoutingIds([this.current.produceRoutingId])
        .then((res) => {
          this.tabsLoading = false;
          // 如果没有首工序的数据 就不能选择工序任务派单
          if (!res || res.length == 0) {
            this.processList = [];
            this.form.taskAss = 1;
            this.procTaskDis = true;
            return;
          }
          this.procTaskDis = false;
          let list = [];
          let isExist = false;
          let firstTaskindex = '';
          res.forEach((item, index) => {
            isExist = isExist
              ? isExist
              : item.sourceTaskId === this.current.firstTaskId;
            // 如果有首工序id 存储它的下标
            if (isExist) {
              if (!firstTaskindex && firstTaskindex !== 0) {
                firstTaskindex = index;
              }
            }
            let obj = {
              id: item.sourceTaskId, //工序 id
              name: item.name, //工序 名称
              assignType: 1, // 默认的指派数据
              assignName: '工位', // 默认指派数据名称
              list: [], // 当前工序下面的指派 绑定的表格
              selection: [], // 当前工序下面的指派 选中的数据f
              code: item.code, // 工序 编码
              index: index, // 当前工序数据的下标
              radioBun: {
                // 指派按钮的操作状态 绑定 默认false(可操作)
                stationDis: false, // 工位按钮
                staffDis: false, // 人员按钮
                lineDis: false // 产线按钮
              },
              isDisable:
                this.form.workCenterId == item.workCenterId ? true : false,
              startDate: '', // 开始日期 (当前工序中最早的计划开始时间)
              endDate: '', // 结束日期 (当前工序中最晚的计划结束时间)
              workCenterId: item.workCenterId,
              workCenterName: item.workCenterName
            };
            list.push(obj);
          });
          this.firstTaskindex = firstTaskindex;
          // 存在首工序报工
          if (isExist) {
            this.processList = list;
            this.processId = res[0].sourceTaskId;
            // this.handleClick({ name: res[0].sourceTaskId });
            this.initializeQuery();
          } else {
            this.processList = [];
            this.form.taskAss = 1;
            this.procTaskDis = true;
            this.$message.warning('当前任务没有首工序报工');
          }
        })
        .catch((err) => {
          this.processList = [];
          this.tabsLoading = false;
          this.$message.error(err.message);
        });
    },
    // 初始化查询 查询全部工序操作过的数据
    async initializeQuery() {
      try {
        // 不存在 班组数据的话 就不调用这个方法
        if (!this.form.teamId) {
          return;
        }
        let params = {
          workOrderId: this.current.id,
          workCenterId: this.form.workCenterId,
          teamId: this.form.teamId
        };
        let processMap = {};
        this.processList.map((el, index) => (processMap[el.id] = index));
        console.log(this.processList, 'processMap');
        const res = await listAssign(params);
        let isFirstData = false; // 判断默认第一道工序是否操作过
        if (res && res.length > 0) {
          res.map((el) => {
            let index = processMap[el.taskId];
            if (index === 0 && el.assignees && el.assignees.length > 0) {
              isFirstData = true; // 操作过
            }
            // 这里第三个参数传空数组就好了 会自动计算的
            setTimeout(() => {
              this.operationalData(index, [el], []);
            });
          });
          // 没有操作过 默认获取一下表格数据
          if (!isFirstData) {
            this.handleClick({ name: this.processId });
          }
        } else {
          this.handleClick({ name: this.processId });
        }
        console.log(this.processList, '工序列表');
      } catch (err) {}
    },
    // 选择工作中心
    async changeWork(e) {
      this.form.workCenterId = e;
      // this.changeDispatch(); // 查询工序列表
      let data = this.workCenterList.find((item) => item.id == e);
      this.form.workCenterName = data.name;
      this.teamList = data.teamList || []; // 重新获取 班组数据
      if (this.teamList.length > 0) {
        this.form.teamId = this.teamList[0].id;
        await this.changeGroups(this.teamList[0].id); // 获取人员数据方法
      } else {
        // 如果没有 班组数据 将人员数据清空 并且判断
        this.crewList = [];
        this.form.teamId = '';
        let data = this.processList.find((item) => item.id == this.processId);
        if (data.assignType == 2) {
          this.$set(data, 'list', []);
        }
      }
    },
    // 选择班组 查询人员的数据
    async changeGroups(e) {
      let data = this.teamList.find((item) => item.id == e);
      this.form.teamName = data.name;
      try {
        const res = await listUserByIds([e]);
        this.crewList = res;
        // 查看当前的工序数据是不是 选择的人员 是的话同步更改
        if (!this.processId || this.processId == 0) {
          return;
        }
        this.handleClick({ name: this.processId });
        this.btnInit();
      } catch {
        this.crewList = [];
      }
    },
    // 工序按钮初始化
    btnInit() {
      let data = this.processList.find((item) => item.id == this.processId);
      this.$set(data.radioBun, 'lineDis', false);
      this.$set(data.radioBun, 'staffDis', false);
      this.$set(data.radioBun, 'stationDis', false);
      this.$set(data, 'assignName', '工位');
      this.$set(data, 'assignType', 1);
    },
    // 获取产线数据
    async getProductionData() {
      const res = await lineByCurrentUser(this.form.workCenterId);
      this.productionList =
        res &&
        res.map((el) => {
          return {
            name: el.name,
            code: el.code,
            id: el.id
          };
        });
    },
    // 查询工位数据
    FirstTaskIdFn() {
      console.log(this.current, 'this.current 查询工位数据');
      // let id = this.current.taskId || this.current.firstTaskId;
      let id = '';
      if (!this.current.taskId || this.current.taskId < 0) {
        id = this.current.firstTaskId;
      } else {
        id = this.current.taskId;
      }
      console.log(id, 'id 查询工位数据');
      listByFirstTaskId(id)
        .then((res) => {
          this.stationList = res;

          this.stationList.forEach((item, index) => {
            let substance = item.workstationSubstanceList[0]?.substance;
            if (substance) {
              this.$set(this.stationList[index], 'assetName', substance.name);
              this.$set(this.stationList[index], 'assetCode', substance.code);
              this.$set(
                this.stationList[index],
                'assetModelType',
                substance.category?.category?.modelType
              );
              this.$set(
                this.stationList[index],
                'assetCategoryLevelPath',
                substance.category?.category?.categoryLevelPath?.split('-')[0]
              );
            }
          });
          this.changeDispatch();
        })
        .catch((err) => {
          this.stationList = [];
          this.$message.error(err.message);
        });
    },
    // 重置(单个)
    resetData(row, item) {
      if (!row.changeId) {
        return this.$message.warning('只能对已撤回跟已保存的数据进行重置');
      }
      this.toolbarLoading = true;
      resetAssignee(row.changeId)
        .then((res) => {
          this.toolbarLoading = false;
          if (res) {
            this.$message.success('操作成功');
            // 更改当前表格数据
            this.setCurrentTab(item);
          }
        })
        .catch((err) => {
          this.toolbarLoading = false;
          this.$message.error(err.message);
        });
    },
    // 撤回的逻辑
    getWithdrawT(row, type) {
      if (type != 2) {
        return true;
      }
      let isFlag = true;
      row.selection.forEach((item) => {
        if (!item.status) {
          isFlag = false;
          return;
        }
        if (!item.status.code) {
          isFlag = false;
        }
      });
      return isFlag;
    },
    // 派单
    dispatch(row, type) {
      console.log(row, 'row 333');
      console.log(type, 'type');
      if (row.selection.length == 0) {
        return this.$message.warning('请最少选择一条数据');
      }
      let isWithdraw = this.getWithdrawT(row, type);
      if (!isWithdraw) {
        this.$message.warning('只有状态为派单的数据才能进行撤回');
        return;
      }
      let assignees = [];
      let changeIds = [];
      let flag = true; // 是否填写 校验
      row.selection.forEach((item) => {
        if (!item.quantity || !item.startTime || !item.endTime) {
          flag = false;
          return;
        }
        if (item.quantity == 0) {
          this.$message.warning('请检查所选数据的数量不能为0');
          digit = false;
          return;
        }
        let Aobj = {
          assigneeId: item.id,
          quantity: item.quantity,
          weight: item.weight,
          startTime: item.startTime,
          endTime: item.endTime,
          assigneeType: row.assignType,
          assigneeName: item.name
        };
        if (item.teamTimeIds) {
          Aobj.teamTimeIds = item.teamTimeIds;
        }
        assignees.push(Aobj);
        changeIds.push(item.changeId);
      });
      // 校验没过 就不往下进行
      if (!flag) {
        this.$message.warning('请将所选数据的 数量,开始时间,完成时间 填写完毕');
        return;
      }
      let data = null;

      if (type == 2) {
        data = changeIds;
      } else {
        data = {
          taskId: this.processId,
          taskName: row.name,
          taskCode: row.code,
          teamName: this.form.teamName,
          teamId: this.form.teamId,
          workCenterId: this.form.workCenterId,
          workCenterName: this.form.workCenterName,
          workOrderId: this.current.id,
          dispatchMethod: 0,
          assignees
        };
        // 先判断是否派单过 有的话直接用前面派单的 类型数据 否则就是自己选择的数据
        if (this.isDispatchRow.hasExists) {
          data.dispatchType = this.isDispatchRow.dispatchType;
        } else {
          let singFlag = this.singleReportRadio();
          if (!singFlag) return;
          data.dispatchType = this.form.singleReport;
        }
      }
      this.toolbarLoading = true;
      const api =
        type == 1 ? taskAssignment : type == 2 ? taskRevoked : taskSave;
      api(data)
        .then((res) => {
          this.toolbarLoading = false;
          if (res) {
            this.$message.success('操作成功');
            // 更改当前表格数据
            this.setCurrentTab(row);
            // 查询是否派单
            this.queryCheckExists();
          }
        })
        .catch((err) => {
          this.toolbarLoading = false;
          this.$message.error(err.message);
        });
    },
    cancel() {
      this.$emit('update:dispatchVisible', false);
    },
    // 按钮操作成功后 更改当前的表格数据
    setCurrentTab(row) {
      let arr = [];
      if (row.assignType == 1) {
        arr = this.stationList;
      } else if (row.assignType == 2) {
        arr = this.crewList;
      } else {
        arr = this.productionList;
      }
      this.getAssignData(row.index, arr);
    },

    singleReportRadio() {
      if (this.form.singleReport === 0 || this.form.singleReport === 1) {
        return true;
      }
      this.$message.warning('请先选择报工类型');
      return false;
    },
    // 最后提交
    async confirm() {
      let flag = this.singleReportRadio();
      if (!flag) return;
      // if (!this.form.singleReport) {

      // }
      if (!this.form.teamId) {
        this.$message.warning('请先选择班组');
        return;
      }

      let permissionRes = await parameterGetByCode({
        code: 'production_order_dispatch_permission'
      });
      this.processingRequired = permissionRes.value || 0; // 兜底：若接口返回空，默认设为 0
      console.log(this.processingRequired);
      if (this.processingRequired == '1') {
        try {
          const isTeamLeader = await getcheckLoginUserIsTeamLeader(
            this.form.teamId
          );

          if (!isTeamLeader) {
            this.toolbarLoading = false;
            this.$message.warning('当前班组不是对应组长');
            return; // 校验不通过，终止后续流程
          }
        } catch (err) {
          this.toolbarLoading = false;
          this.$message.error('校验组长身份失败：' + err.message);
          return; // 校验报错，终止后续流程
        }
      }

      if (this.form.taskAss == 1) {
        this.issue();
        // 按原来的逻辑
        return;
      }
      // 获取到首工序id 的 绑定表格数据
      let data = this.processList[this.firstTaskindex];
      // 是否进行首工序派单
      let isFirstDispatch = false;
      let dispatchArr = []; // 已派单数据
      data.list.map((item) => {
        if (!item.status) {
          return;
        }
        if (item.status.code == 1) {
          isFirstDispatch = true;
          dispatchArr.push(item.id);
        }
      });
      // 判断是否进行首工序派单
      if (!isFirstDispatch) {
        this.$message.warning(`请您先进行首工序任务(${data.name}工序)派单`);
        this.handleClick({ name: data.id });
        return;
      }
      let totalSum = 0;
      // 判断派单的数据 数量相加是否为 要求生产数量
      data.list.map((item) => {
        if (item.status && item.status.code == 1) {
          totalSum += item.quantity - 0;
        }
      });
      // if (totalSum != this.current.formingNum - 0) {
      //   this.$message.warning(
      //     `首工序已派单的数据数量相加需要等于要求生产数量${this.current.formingNum}`
      //   );
      //   this.handleClick({ name: data.id });
      //   return;
      // }

      this.toolbarLoading = true;

      let params = {
        teamId: this.form.teamId,
        workCenterId: this.form.workCenterId,
        workOrderId: this.current.id
      };
      try {
        const res = await checkAssignConfirm(params);
        if (!res) {
          this.toolbarLoading = false;
          return;
        }
        let paramsD = {
          assignType: data.assignType,
          singleReport: this.form.singleReport,
          teamId: this.form.teamId,
          crewIds: data.assignType == 2 ? dispatchArr : [], // 人员 2
          workstationIds: data.assignType == 1 ? dispatchArr : [], // 工位 1
          id: this.current.id,
          planStartTime: this.current.planStartTime,
          planEndTime: this.current.planEndTime
        };

        const response = await releaseWorkOrder(paramsD);
        this.toolbarLoading = false;
        if (response) {
          this.$message.success('操作成功');
          this.cancel();
          this.$emit('createSuccess');
        }
      } catch (err) {
        this.toolbarLoading = false;
        // this.$message.error(err.message);
      }
    },
    // 下达
    issue() {
      if (this.form.assignType == 1) {
        if (!this.form.workstationIds || this.form.workstationIds.length == 0) {
          this.$message.warning('请选择工位数据');
          return;
        }
      }
      if (this.form.assignType == 3) {
        if (!this.form.factoryLineIds || this.form.factoryLineIds.length == 0) {
          this.$message.warning('请选择产线数据');
          return;
        }
      }
      let data = {
        assignType: this.form.assignType,
        singleReport: this.form.singleReport,
        teamId: this.form.teamId,
        crewIds: [],
        workstationIds: [],
        id: this.current.id,
        planStartTime: this.current.planStartTime,
        planCompleteTime: this.current.planCompleteTime,
        factoryLineIds: []
      };
      if (this.form.assignType == 1) {
        data.workstationIds = this.form.workstationIds || [];
      } else if (this.form.assignType == 2) {
        data.crewIds = this.form.crewIds || [];
      } else {
        data.factoryLineIds = this.form.factoryLineIds || [];
      }
      this.toolbarLoading = true;
      releaseWorkOrder(data)
        .then((res) => {
          this.toolbarLoading = false;
          if (res) {
            this.$message.success('操作成功');
            this.cancel();
            this.$emit('createSuccess');
          }
        })
        .catch((err) => {
          this.toolbarLoading = false;
          // this.$message.error(err.message);
        });
    },
    // 工序选择
    async handleClick(tab) {
      let id = tab.name;
      this.processId = id;
      let data = this.processList.find((item) => item.id == this.processId);
      await this.changeRadio(data.assignType, data.index);
    },
    // 指派选择
    async changeRadio(e, index) {
      let data = this.processList[index];
      if (e == 1) {
        this.dynamicName = '工位名称';
        data.assignName = '工位';
        await this.getAssignData(index, this.stationList);
      } else if (e == 2) {
        this.dynamicName = '人员名称';
        data.assignName = '人员';
        await this.getAssignData(index, this.crewList);
      } else {
        this.dynamicName = '产线名称';
        data.assignName = '产线';
        await this.getAssignData(index, this.productionList);
      }
    },
    // 指派数据处理
    async getAssignData(index, arr) {
      let list = JSON.parse(JSON.stringify(arr));
      let dataRow = this.processList[index];
      // 不存在 班组数据的话 就不调用这个方法
      if (!this.form.teamId) {
        return;
      }
      let params = {
        workOrderId: this.current.id,
        workCenterId: this.form.workCenterId,
        teamId: this.form.teamId,
        taskId: dataRow.id
      };
      this.tabLoading = true;
      try {
        const res = await listAssign(params);
        this.tabLoading = false;
        // 如果 res 没有数据 说明未对数据进行操作 直接赋值
        if (res.length == 0) {
          this.$set(dataRow, 'list', list);
          return;
        }
        // 对有操作过的数据进行赋值
        this.operationalData(index, res, list);
      } catch (err) {
        this.tabLoading = false;
        this.$message.warning(err.message);
      }
    },
    // 操作过的数据 赋值
    operationalData(index, res, list) {
      const dataRow = this.processList[index];
      // 键值对存储 当前工序 操作的数据  指派的code(键) 数据(list:值)
      let arrMap = {};
      // 要先判断有没有操作的数据 如果有的话 其它的指派操作置灰
      let codeT = null; // 表示有已操作的数据(对应的 code)
      res[0].assignees.map((el) => {
        let code = el.assigneeType.code;
        if (arrMap[code]) {
          arrMap[code].arr.push(el);
          arrMap[code].bunDis = arrMap[code].bunDis
            ? arrMap[code].bunDis
            : el.status.desc
            ? true
            : false;
        } else {
          arrMap[code] = {
            arr: [el],
            bunDis: el.status.desc ? true : false
          };
        }
        codeT = codeT ? codeT : el.status.desc ? code : '';
      });
      let radioBun = {
        lineDis: false, // 产线 3
        staffDis: false, // 人员 2
        stationDis: false // 工位 1
      };
      // 默认是传递下来的 list 数据 但是如果 codeT有值 说明 工位 人员 产线 有派单数据
      // 需要自动切换过去
      let listArr = list;
      if (codeT) {
        if (codeT == 1) {
          radioBun.staffDis = true;
          radioBun.lineDis = true;
          radioBun.stationDis = false;
          listArr = JSON.parse(JSON.stringify(this.stationList));
          dataRow.assignType = 1;
          dataRow.assignName = '工位';
        } else if (codeT == 2) {
          radioBun.stationDis = true;
          radioBun.lineDis = true;
          radioBun.staffDis = false;
          listArr = JSON.parse(JSON.stringify(this.crewList));
          dataRow.assignType = 2;
          dataRow.assignName = '人员';
        } else {
          radioBun.stationDis = true;
          radioBun.staffDis = true;
          radioBun.lineDis = false;
          listArr = JSON.parse(JSON.stringify(this.productionList));
          dataRow.assignType = 3;
          dataRow.assignName = '产线';
        }
      }
      // 切换完后 对 指派的数组数据进行赋值
      let listMap = {};
      listArr.map((el, index) => (listMap[el.id] = index));
      let arrList = codeT ? arrMap[codeT].arr : res[0].assignees;
      dataRow.startDate = ''; // 每次计算的时候清空之前的
      dataRow.endDate = '';
      arrList.map((item) => {
        if (item.assigneeType.code == dataRow.assignType) {
          let idx = listMap[item.assigneeId];
          if (!idx && idx !== 0) {
            return;
          }
          listArr[idx].status = item.status;
          listArr[idx].startTime = item.startTime;
          listArr[idx].endTime = item.endTime;
          listArr[idx].quantity = item.quantity;
          listArr[idx].weight = item.weight;
          listArr[idx].changeId = item.id;
          listArr[idx].teamTimeIds = item.teamTimeIds;
          this.compareAndSetTime(listArr[idx], dataRow);
          this.compareEndSetTime(listArr[idx], dataRow);
        }
      });
      // 这里重新调用一个方法 计算出 startDate endDate
      this.$set(dataRow, 'list', listArr);
      this.$set(dataRow, 'radioBun', radioBun);
      this.$set(dataRow, 'selection', []);
      let tab = `tableRef${[dataRow.index]}`;
      this.$refs[tab][0].setSelectedRowKeys([]);
      console.log(dataRow, 'dataRow +++++');
    },
    // 时间比较与赋值方法 开始时间
    compareAndSetTime(data, dataRow) {
      // 如果startDate为空，直接赋值为startTime
      if (!dataRow.startDate) {
        dataRow.startDate = data['startTime'];
        return;
      }

      // 转换为Date对象进行比较
      const startTimeDate = new Date(data['startTime']);
      const startDateDate = new Date(dataRow.startDate);

      // 比较时间（getTime()获取时间戳）
      if (startTimeDate.getTime() < startDateDate.getTime()) {
        dataRow.startDate = data['startTime'];
      }
    },
    // 时间比较与赋值方法 结束时间时间
    compareEndSetTime(data, dataRow) {
      // 如果startDate为空，直接赋值为endTime
      if (!dataRow.endDate) {
        dataRow.endDate = data['endTime'];
        return;
      }
      // 转换为Date对象进行比较
      const endTimeDate = new Date(data['endTime']);
      const endDateDate = new Date(dataRow.endDate);
      // 比较时间（getTime()获取时间戳）
      if (endTimeDate.getTime() > endDateDate.getTime()) {
        dataRow.endDate = data['endTime'];
      }
    },
    assignRadio(e) {},
    // 数量正则 quantity
    handleQuantityInput(e, row, item) {
      // 过滤非数字字符（包括负号）
      let value = e.replace(/[^\d]/g, '');
      // 限制不能以 0 开头（除非是 0 本身）
      if (value.startsWith('0') && value.length > 1) {
        value = value.slice(1);
      }
      // 更新绑定值
      row.quantity = value;
      this.calculateQuantity(row, item);
      this.bringWeight(row.quantity, row);
      this.selectedListData(row, item);
    },
    // 自动算重量
    bringWeight(value, row) {
      if (!this.current.formingWeight) {
        this.$set(row, 'weight', 0);
        return;
      }
      let weight =
        (this.current.formingWeight / this.current.formingNum) * value;
      if (weight > 0) {
        weight = weight.toFixed(4) - 0;
      }
      this.$set(row, 'weight', weight);
    },
    calculateQuantity(row, item) {
      // 如果没有该字段 就不做判断
      if (!this.current.formingNum) {
        return;
      }
      let total = 0;
      item.list.forEach((el) => {
        if (el.quantity) {
          total = total + (el.quantity - 0);
        }
      });
      if (total > this.current.formingNum - 0) {
        this.$message.warning('列表数量相加不能大于目标要求生产数量');
        row.quantity = 0;
      }
    },
    // 计算重量
    calculateWeight(row, item) {
      // 如果没有该字段 就不做判断
      if (!this.current.formingWeight) {
        return;
      }
      let total = 0;
      item.list.forEach((el) => {
        if (el.weight) {
          total = total + (el.weight - 0);
        }
      });
      if (total > this.current.formingWeight - 0) {
        this.$message.warning('列表数量相加不能大于目标要求生产数量');
        row.weight = 0;
      }
    },
    // 重量正则 weight
    handleWeightInput(e, row, item) {
      // 过滤非数字和非小数点字符（包括负号）
      let value = e.replace(/[-+^\d.]/g, '');
      value = e.replace(/[^\d.]/g, '');
      // 限制只能有一个小数点
      const dotCount = (value.match(/\./g) || []).length;
      if (dotCount > 1) {
        value = value.slice(0, value.lastIndexOf('.'));
      }
      // 限制不能以小数点开头
      if (value.startsWith('.')) {
        value = '0' + value;
      }
      // 更新绑定值
      row.weight = value;
      this.calculateWeight(row, item);
      this.selectedListData(row, item);
    },
    // 选中班次
    shiftSelection(e, row, item) {
      // this.$refs.tableRef0[0].setSelectedRowKeys(row.id);
      // let data = this.shiftList.find((item) => item.id == e);
      this.selectedListData(row, item);
      let data = this.shifTimeData(e, row);
      let startTime = `${this.dateValue} ${data.startTime}`;
      let endTime = `${this.dateValue} ${data.endTime}`;
      this.$set(row, 'startTime', startTime);
      this.$set(row, 'endTime', endTime);
      this.handleStartTimeChange(row, item);
      this.handleEndTimeChange(row, item);
    },
    // 默认选中当前更改数据
    selectedListData(row, item) {
      let data = item.selection.find((el) => el.id == row.id);
      if (!data) {
        let ids = item.selection.map((el) => el.id);
        ids.push(row.id);
        let tab = `tableRef${[item.index]}`;
        this.$refs[tab][0].setSelectedRowKeys(ids);
      }
    },
    // 多选班次时间数据
    shifTimeData(e, row) {
      if (!e || e.length == 0) {
        return {
          startTime: row.startTime,
          endTime: row.endTime
        };
      }
      let startTime = '';
      let endTime = '';
      e.map((el) => {
        let obj = this.shiftList.find((item) => item.id == el);
        if (!startTime) {
          startTime = obj.startTime;
        }
        if (!endTime) {
          endTime = obj.endTime;
        }
        // 获取更小的
        startTime =
          this.compareTime(startTime, obj.startTime) !== -1
            ? obj.startTime
            : startTime;
        // 获取更大的
        endTime =
          this.compareTime(endTime, obj.endTime) !== 1 ? obj.endTime : endTime;
      });

      return {
        startTime,
        endTime
      };
    },
    // 将HH:mm:ss格式的时间转换为总秒数
    timeToSeconds(timeStr) {
      const [hours, minutes, seconds] = timeStr.split(':').map(Number);
      return hours * 3600 + minutes * 60 + seconds;
    },
    // this.$refs.table.setSelectedRowKeys(ids);
    // 比较两个时间的大小
    compareTime(time1, time2) {
      const sec1 = this.timeToSeconds(time1);
      const sec2 = this.timeToSeconds(time2);

      if (sec1 > sec2) {
        return 1; // time1 更大
      } else if (sec1 < sec2) {
        return -1; // time2 更大
      } else {
        return 0; // 两个时间相等
      }
    },
    // 【开始时间变化时】触发
    handleStartTimeChange(row, item) {
      if (!row.startTime) {
        return;
      }
      this.selectedListData(row, item);
      // 这一道工序的开始时间 不能小于前一道工序的结束时间
      const startTime = new Date(row.startTime); // 开始时间
      if (item.index !== 0) {
        // let frontIdx = item.index - 1;
        let frontIdx = this.calculateIndex(item.index).startIdx;
        if (frontIdx !== 'none') {
          let frontName = this.processList[frontIdx].name;
          let time = this.processList[frontIdx].endDate;
          const frontTime = new Date(time); // 前面工序的结束时间
          if (time && startTime < frontTime) {
            this.$message.closeAll();
            this.$message.info(
              `开始时间不能小于前面工序${frontName}的结束时间${time}`
            );
            // 判断是否 配置时间更改规则
            if (this.time_calc_code == '1') {
              row.startTime = time;
            }
            return;
          }
        }
      }
      // 这一道工序的开始时间更不能大于后一道工序的开始时间
      if (item.index !== this.processList.length - 1) {
        // let latterIdx = item.index + 1;
        let latterIdx = this.calculateIndex(item.index).endIdx;
        if (latterIdx !== 'none') {
          let time = this.processList[latterIdx].startDate;
          let latterName = this.processList[latterIdx].name;
          const latterTime = new Date(time); // 下一道工序的结束时间
          if (time && startTime > latterTime) {
            this.$message.closeAll();
            this.$message.info(
              `开始时间不能大于后面工序${latterName}的开始时间${time}`
            );
            // 判断是否 配置时间更改规则
            if (this.time_calc_code == '1') {
              row.startTime = '';
            }
            return;
          }
        }
      }
      // 校验 是否 大于结束时间  wda
      this.checkEndTimeValid(row);
    },
    // 当更改一个工序开始时间 结束时间的时候
    // 开始时间 不能小于之前工序的结束时间 ( 要先去上一道工序找 是否存在结束时间 不存在就再往前找 直到 第一道工序 )
    // 结束时间 不能大于后面工序的开始时间 ( 要先去后一道工序找 是否存在开始时间 不存在就再往后找 直到 最后一道工序 )
    // 计算出当前下标数据 的前后 有 开始时间 结束时间的数据下标
    calculateIndex(index) {
      let startIdx = 'none';
      let endIdx = 'none';
      // 前面工序下标
      for (let i = index - 1; i >= 0; i--) {
        let row = this.processList[i];
        if (row && row.endDate) {
          startIdx = i;
          break;
        }
      }
      // 后面工序的下标
      for (let i = index + 1; i <= this.processList.length; i++) {
        let row = this.processList[i];
        if (row && row.startDate) {
          endIdx = i;
          break;
        }
      }
      return {
        startIdx,
        endIdx
      };
    },
    // 【结束时间变化时】触发
    handleEndTimeChange(row, item) {
      if (!row.endTime) {
        return;
      }
      this.selectedListData(row, item);
      const endTime = new Date(row.endTime); // 结束时间
      // 当前工序的结束时间 不能大于后一道工序的开始时间
      if (item.index !== this.processList.length - 1) {
        let latterIdx = this.calculateIndex(item.index).endIdx;
        if (latterIdx !== 'none') {
          let latterName = this.processList[latterIdx].name;
          let time = this.processList[latterIdx].startDate;
          const latterTime = new Date(time); // 后面工序的开始时间
          if (time && endTime > latterTime) {
            this.$message.closeAll();
            this.$message.info(
              `结束时间不能大于后面工序${latterName}的开始时间${time}`
            );
            // 判断是否 配置时间更改规则
            if (this.time_calc_code == '1') {
              row.endTime = time;
            }
            return;
          }
        }
      }
      // 这一道工序的开始时间更不能小于于前一道工序的结束时间
      if (item.index !== 0) {
        let frontIdx = this.calculateIndex(item.index).startIdx;
        if (frontIdx !== 'none') {
          let frontName = this.processList[frontIdx].name;
          let time = this.processList[frontIdx].endDate;
          const frontTime = new Date(time); // 上一道工序的结束时间
          if (time && endTime < frontTime) {
            this.$message.closeAll();
            this.$message.info(
              `结束时间不能小于前面工序${frontName}的结束时间${time}`
            );
            // 判断是否 配置时间更改规则
            if (this.time_calc_code == '1') {
              row.endTime = '';
            }
            return;
          }
        }
      }
      this.checkEndTimeValid(row, item);
    },
    // 时间校验
    checkEndTimeValid(row) {
      const { startTime: start, endTime: end } = row;
      // if (!start || !end) return; // 开始/结束时间未填，跳过
      const startTime = new Date(start); // 开始时间
      const endTime = new Date(end); // 结束时间
      if (endTime < startTime) {
        row.endTime = new Date(startTime); // 修正为开始时间
        this.$message.info('结束时间不能早于开始时间，已自动设为开始时间');
      }
    }
  }
};
