<template>
  <div class="container1">
    <div class="databox">
      <el-scrollbar :style="{ height: Height + 'px' }">
        <div class="box">
          <div class="title">
            <div style="display: flex; align-items: center">
              <div class="bg"></div>
              样本数据录入
            </div>
            <div class="header" v-show="!addStatus && !editStatus">
              <Search
                :searchOptions="searchForm"
                ref="searchRef"
                @data-list="getTableData"
                @reset-list="reset"
              />
            </div>
            <div class="btns">
              <el-upload
                v-if="!addStatus && !editStatus"
                style="float: left"
                :action="uploadUrl"
                :on-success="handleSuccess"
                :before-upload="beforeUpload"
                :limit="1"
                accept=".xlsx, .xls"
                :show-file-list="false"
                ref="uploadRef"
              >
                <el-button size="small" type="primary">Excel导入</el-button>
              </el-upload>
              <el-button
                v-if="!addStatus && !editStatus"
                style="margin-left: 15px"
                type="primary"
                size="small"
                class="btn"
                @click="
                  downloadSPCTemplate(
                    '/api/v1/spc/downloadTemplate',
                    '/spc/template/XBarS控制图数据导入模板.xlsx'
                  )
                "
                >模板下载</el-button
              >
              <el-button
                style="margin-left: 15px"
                v-if="!addStatus && !editStatus"
                type="primary"
                size="small"
                class="btn"
                @click="changeaddstatus"
                >新增</el-button
              >
              <el-button
                style="margin-left: 15px"
                v-if="!addStatus && !editStatus"
                type="primary"
                size="small"
                class="btn"
                @click="compute"
                >计算</el-button
              >
              <el-button
                v-if="editStatus || addStatus"
                type="success"
                size="small"
                class="btn"
                @click="submit"
                >确定</el-button
              >
              <el-button
                v-if="editStatus || addStatus"
                type="info"
                size="small"
                class="btn"
                @click="canceleOp"
                >取消</el-button
              >
              <el-button
                style="margin-left: 15px"
                v-if="!addStatus && !editStatus"
                type="primary"
                size="small"
                class="btn"
                @click="downloadExceptionData"
                >保存异常数据</el-button
              >
            </div>
          </div>
          <div class="info" v-if="!addStatus">
            <el-table
              :data="tableData"
              border
              :style="{
                height: maxHeight - 150 + 'px',
                width: maxWidth + 'px',
              }"
              :show-overflow-tooltip="true"
              :row-class-name="tableRowClassName"
            >
              <el-table-column
                align="center"
                prop="dateStr"
                sortable
                label="日期"
              >
                <template #default="{ row }"
                  ><span>{{ row.dateStr }}</span>
                </template>
              </el-table-column>
              <el-table-column align="center" prop="model" label="产品型号">
                <template #default="{ row }"
                  ><span>{{ row.model }}</span>
                </template>
              </el-table-column>
              <el-table-column align="center" prop="code" label="产品编号">
                <template #default="{ row }"
                  ><span>{{ row.code }}</span>
                </template>
              </el-table-column>
              <el-table-column align="center" prop="batchNo" label="生产批号">
                <template #default="{ row }"
                  ><span>{{ row.batchNo }}</span>
                </template>
              </el-table-column>
              <el-table-column align="center" prop="source" label="数据来源">
                <template #default="{ row }"
                  ><span>{{ row.source }}</span>
                </template>
              </el-table-column>
              <el-table-column
                align="center"
                prop="accuracys"
                label="数据"
                :show-overflow-tooltip="false"
              >
                <template #default="{ row }">
                  <el-tooltip placement="top">
                    <template #content>
                      <div v-for="(item, index) in row.accuracys" :key="index">
                        <span>数值{{ index + 1 }}: {{ item }}</span>
                      </div>
                    </template>
                    <div class="ellipsis-text">
                      {{ row.accuracys.join(", ") }}
                    </div>
                  </el-tooltip>
                </template>
              </el-table-column>
              <!--              <el-table-column
                align="center"
                prop="avg"
                label="平均值"
                width="60"
              /><el-table-column
                align="center"
                prop="range"
                label="极差"
                width="60"
              />--><!--<el-table-column
                align="center"
                prop="checkUser"
                label="检测人"
              >
                <template #default="{ row }"
                  ><span>{{ row.checkUser }}</span>
                </template> </el-table-column
              ><el-table-column
                align="center"
                prop="checkDeviceNo"
                label="检查设备编号"
              >
                <template #default="{ row }"
                  ><span>{{ row.checkDeviceNo }}</span>
                </template>
              </el-table-column>-->
              <el-table-column align="center" prop="abnormal" label="是否异常">
                <template #default="{ row }"
                  ><span>{{ row.abnormal }}</span>
                </template>
              </el-table-column>
              <el-table-column
                align="center"
                prop="abnormal1"
                label="异常原因"
                :show-overflow-tooltip="false"
              >
                <template #default="{ row }">
                  <el-tooltip placement="top">
                    <template #content>
                      <div
                        v-for="(item, index) in row.abnormal1.split('，')"
                        :key="index"
                      >
                        <span>{{ item }}</span>
                      </div>
                    </template>
                    <div class="ellipsis-text">
                      {{ row.abnormal1 }}
                    </div>
                  </el-tooltip>
                </template>
              </el-table-column>
              <!--              <el-table-column align="center" prop="analyseUser" label="分析人">
                <template #default="{ row }"
                  ><span>{{ row.analyseUser }}</span>
                </template>
              </el-table-column>-->
              <el-table-column align="center" prop="measure" label="处置措施">
                <template #default="{ row }"
                  ><span>{{ row.measure }}</span>
                </template>
              </el-table-column>
              <el-table-column align="center" width="255" prop="" label="操作">
                <template #default="{ row }">
                  <el-button
                    v-if="row.source === '自动'"
                    :type="loadingRows[row.id] ? 'info' : 'primary'"
                    size="small"
                    :loading="loadingRows[row.id]"
                    @click="dataAcquisition(row)"
                    :disabled="loadingRows[row.id]"
                    style="height: 25px"
                  >
                    {{ loadingRows[row.id] ? "数据采集中..." : "采集数据" }}
                  </el-button>
                  <el-button
                    type="primary"
                    size="small"
                    class="btn"
                    @click="updataItem(row)"
                    style="height: 25px"
                    >修改</el-button
                  >
                  <el-button
                    type="info"
                    size="small"
                    class="btn"
                    style="height: 25px"
                    @click="deleteSubmit(row.id)"
                    >删除</el-button
                  >
                </template>
              </el-table-column>
            </el-table>
            <Pagination
              :total="currentOption.total"
              :page="currentOption.page"
              :limit="currentOption.limit"
              :pageSizes="currentOption.pageSizes"
              v-model:page="currentOption.page"
              v-model:limit="currentOption.limit"
              @pagination="getTableData"
            />
          </div>
          <div class="info" v-else>
            <el-form
              ref="ruleFormRef"
              :model="addData"
              :rules="rules"
              label-width="auto"
              class="formStyle"
            >
              <el-form-item label="日期" prop="dateStr">
                <el-date-picker
                  v-model="addData.dateStr"
                  type="date"
                  aria-label="Pick a date"
                  placeholder="Pick a date"
                  style="width: 100%"
                  format="YYYY-MM-DD"
                  value-format="YYYY-MM-DD"
                />
              </el-form-item>
              <el-form-item label="任务编号" prop="qualityTaskId">
                <el-select
                  v-model="addData.qualityTaskId"
                  @change="
                    (value) => {
                      taskChange(value);
                    }
                  "
                >
                  <el-option
                    v-for="(item, index) in taskOption"
                    :key="index"
                    :label="item.taskCode"
                    :value="Number(item.id)"
                  />
                </el-select>
              </el-form-item>
              <el-form-item label="产品型号" prop="model">
                <el-input :disabled="true" v-model="addData.model" />
              </el-form-item>
              <el-form-item label="产品编号" prop="code">
                <el-input :disabled="true" v-model="addData.code" />
              </el-form-item>
              <el-form-item label="数据来源" prop="source">
                <el-input :disabled="true" v-model="addData.source" />
              </el-form-item>
              <el-form-item label="生产批号" prop="batchNo">
                <el-input v-model="addData.batchNo" />
              </el-form-item>
              <el-form-item
                v-for="(item, index) in addData.accuracys"
                :label="'数值' + (index + 1)"
                :key="index"
                :rules="[
                  {
                    required: true,
                    trigger: 'change',
                  },
                ]"
              >
                <el-input-number
                  :precision="2"
                  :step="0.01"
                  style="width: 100%"
                  v-model="addData.accuracys[index]"
                />
              </el-form-item>
              <!-- <el-form-item label="平均值" prop="avg">
                <el-input v-model="addData.avg" />
              </el-form-item>
              <el-form-item label="极差" prop="range">
                <el-input v-model="addData.range" />
              </el-form-item> -->
              <!--              <el-form-item label="检测人" prop="checkUser">
                <el-input v-model="addData.checkUser" />
              </el-form-item>
              <el-form-item label="检查设备编号" prop="checkDeviceNo">
                <el-input v-model="addData.checkDeviceNo" />
              </el-form-item>-->
              <!-- <el-form-item label="是否异常" prop="abnormal">
                <el-input v-model="addData.abnormal" />
              </el-form-item> -->
              <!--              <el-form-item label="分析人" prop="analyseUser">-->
              <!--                <el-input v-model="addData.analyseUser" />-->
              <!--              </el-form-item>-->
              <el-form-item label="处置措施" prop="measure" v-if="addData.id">
                <el-input v-model="addData.measure" />
              </el-form-item>
            </el-form>
          </div>
        </div>
      </el-scrollbar>
    </div>
  </div>
</template>

<script setup>
import { ref } from "vue";
import { useDictionaryStore } from "@/store";
import {
  getData,
  addDatas,
  deleteData,
  updateData,
  getTaskCode,
  saveExceptionData,
} from "@/api/analysis";
import Search from "@/components/Search/index.vue";
import { XBarSCompute, collectData } from "@/api/analysis";
import { useCrud } from "@/hooks/userCrud";
import {ElMessage, ElMessageBox} from "element-plus";

const { Utils } = useCrud({
  src: "/api/v1/spc/pDownloadTemplate",
});
const { downloadSPCTemplate } = Utils;

const emit = defineEmits([
  "tableData",
  "update:addStatus",
  "update:editStatus",
]);

// 在你的组件 setup 中
const loadingRows = ref({});

const dataAcquisition = async (row) => {
  loadingRows.value = { ...loadingRows.value, [row.id]: true };
  try {
    // 这里替换为你的实际请求
    const { code } = await collectData({
      qualitySpcRecordId: row.id,
      model: row.model,
      batchNo: row.batchNo,
      operation: lableValue.value,
    });
    if (200 == code) {
      ElMessage.success("数据采集成功！");
      getTableData();
    }
  } catch (error) {
    console.error("数据采集失败:", error);
    // 可以在这里添加错误处理，比如显示错误消息
  } finally {
    loadingRows.value = { ...loadingRows.value, [row.id]: false };
  }
};

const compute = async () => {
  // 存储提取的 accuracys 数据
  const accuracysList = ref([]);

  // 提取 accuracys 数据
  tableData.value.forEach((v) => {
    accuracysList.value.push(v.accuracys);
  });

  const { data } = await XBarSCompute({
    dataList: accuracysList.value,
    scale: 4,
  });
  emit("tableData", data);
};

const tableRowClassName = ({ row }) => {
  if (row.abnormal === "是") {
    return "warning-row";
  }
  return "";
};

const { dicts } = useDictionaryStore();

const year = ref("0");
const currentOption = reactive({
  total: 0,
  page: 1,
  limit: 10,
  pageSizes: [10, 20, 30, 40, 50],
});
const lableValue = ref("");
const searchRef = ref(null);
const getTaskOption = async () => {
  const { data } = await getTaskCode({
    operationCode: lableValue.value,
  });
  taskOption.value = data;
};
const getTableData = async () => {
  const { data, code, msg } = await getData({
    ...searchRef.value.searchForm,
    pageNo: currentOption.page,
    pageSize: currentOption.limit,
    // yearStr: year.value,
    operation: lableValue.value,
  });
  if (code == "200") {
    tableData.value = data.records;
    showData.value = { ...data, list: null };
    currentOption.total = data.totalCount;
    currentOption.page = data.pageNo;
    oldDataJSON.value = JSON.stringify(data.records);
  }
  disabled.value = false;
};

const downloadExceptionData = async () => {
  saveExceptionData({
    ...searchRef.value.searchForm,
    pageNo: currentOption.page,
    pageSize: currentOption.limit,
    // yearStr: year.value,
    operation: lableValue.value,
  }).then((response) => {
    const fileData = response.data;
    // const fileName = decodeURI(
    //   response.headers["content-disposition"].split(";")[1].split("=")[1]
    // );
    const fileName = "异常数据.xlsx";
    const fileType =
      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";

    const blob = new Blob([fileData], { type: fileType });
    const downloadUrl = window.URL.createObjectURL(blob);

    const downloadLink = document.createElement("a");
    downloadLink.href = downloadUrl;
    downloadLink.download = fileName;

    document.body.appendChild(downloadLink);
    downloadLink.click();

    document.body.removeChild(downloadLink);
    window.URL.revokeObjectURL(downloadUrl);
  });
};

const searchForm = [
  {
    label: "日期",
    prop: "createds",
    type: "daterange",
  },
  {
    label: "产品型号",
    prop: "model",
    type: "input",
  },
  {
    label: "生产批号",
    prop: "batchNo",
    type: "input",
  },
];
//编辑状态
const editStatus = ref(false);
const addStatus = ref(false);
const changeEditstatus = () => {
  editStatus.value = !changeEditstatus.value;
  addStatus.value = false;
};
const changeaddstatus = () => {
  addStatus.value = !addStatus.value;
  editStatus.value = false;
  emit("update:addStatus", addStatus.value);
};
const canceleOp = () => {
  addStatus.value = false;
  editStatus.value = false;
  emit("update:addStatus", addStatus.value);
  emit("update:editStatus", editStatus.value);
  reset();
};
const disabled = ref(false);
const tableData = ref([]);
//Form
const ruleFormRef = ref(null);

const rules = {
  qualityTaskId: [
    {
      required: true,
      trigger: "change",
    },
  ],
  dateStr: [
    {
      required: true,
      trigger: "change",
    },
  ],
  model: [
    {
      required: true,

      trigger: "change",
    },
  ],
  batchNo: [
    {
      required: true,

      trigger: "change",
    },
  ],
  accuracy1: [
    {
      required: true,

      trigger: "change",
    },
  ],
  accuracy2: [
    {
      required: true,

      trigger: "change",
    },
  ],
  accuracy3: [
    {
      required: true,

      trigger: "change",
    },
  ],
  accuracy4: [
    {
      required: true,

      trigger: "change",
    },
  ],
  accuracy5: [
    {
      required: true,

      trigger: "change",
    },
  ],
  checkUser: [
    {
      required: true,

      trigger: "change",
    },
  ],
  checkDeviceNo: [
    {
      required: true,

      trigger: "change",
    },
  ],
  // abnormal: [
  //   {
  //     required: true,

  //     trigger: "change",
  //   },
  // ],
  analyseUser: [
    {
      required: true,

      trigger: "change",
    },
  ],
  measure: [
    {
      required: false,

      trigger: "change",
    },
  ],
};
const resItem = {
  // abnormal: "",
  analyseUser: "",
  batchNo: "",
  checkDeviceNo: "",
  checkUser: "",
  dateStr: "",
  measure: "",
  model: "",
};
const addData = ref({
  // abnormal: "",
  analyseUser: "",
  batchNo: "",
  checkDeviceNo: "",
  checkUser: "",
  dateStr: "",
  measure: "",
  model: "",
});
const accuracysSum = ref(0);
const taskChange = (value) => {
  taskOption.value.forEach((item) => {
    if (item.id == value) {
      addData.value.model = item.prodtModel;
      addData.value.code = item.prodtCode;
      addData.value.source = item.source;
      if (item.source === "手动") {
        accuracysSum.value = Number(item.processCount);
        addData.value.accuracys = [];
        let array = [];
        for (let i = 0; i < accuracysSum.value; i++) {
          array.push(0);
        }
        addData.value.accuracys = array;
      } else {
        addData.value.accuracys = [];
      }
    }
  });
};
const oldDataJSON = ref("");
const showData = ref({});
const opOptions = ref([...dicts.spc_operation]);

//修改
const updataItem = (row) => {
  editStatus.value = true;
  const data = JSON.parse(JSON.stringify(row));
  addData.value = data;
  addStatus.value = true;
  emit("update:addStatus", addStatus.value);
  emit("update:editStatus", editStatus.value);
};
const taskOption = ref([]);
const value = ref(opOptions.value[0].remark);
const showLable = ref("调阻");
const maxHeight = ref(null);
const maxWidth = ref(null);
const Height = ref(0);
const setHeight = () => {
  Height.value = document.querySelector(".databox").clientHeight;
  maxHeight.value = document.querySelector(".info").clientHeight;
  maxWidth.value = document.querySelector(".info").clientWidth;
};

//当新增或者编辑的确定操作
const submit = () => {
  if (editStatus.value == true) {
    updateSubmit();
  } else {
    addSubmit();
  }
};
const addSubmit = async () => {
  await ruleFormRef.value.validate(async (valid, fields) => {
    if (valid) {
      addData.value.type = "1";
      const { data, code } = await addDatas({
        ...addData.value,
        yearStr: year.value,
        operation: lableValue.value,
      });
      if (code == "200") {
        ElMessage.success("添加成功！");
        reset();
        getTableData();
      }
    } else {
      ElMessage.error("请检查表单信息");
    }
  });
};
const deleteSubmit = async (id) => {
  ElMessageBox.confirm("是否删除所选中数据？", "提示", {
    confirmButtonText: "确定",
    cancelButtonText: "取消",
    type: "warning",
  }).then(async () => {
    const { data, code } = await deleteData({
      id,
    });
    if (code == "200") {
      ElMessage.success("删除成功！");
      getTableData();
    }
  });
};
const updateSubmit = async () => {
  addData.value.abnormal = null;
  const { data, code } = await updateData({
    ...addData.value,
  });
  if (code == "200") {
    ElMessage.success("更新成功！");
    reset();
    getTableData();
  }
};
const reset = () => {
  addStatus.value = false;
  editStatus.value = false;
  emit("update:addStatus", addStatus.value);
  emit("update:editStatus", editStatus.value);
  addData.value = { ...resItem };
  searchRef.value.searchForm = {};
  currentOption.value = {
    total: 0,
    page: 0,
    limit: 12,
    pageSizes: [12],
    operation: value.value,
  };
  getTableData();
};

const uploadUrl = ref("");
const beforeUpload = (file) => {
  const isExcel =
    file.type === "application/vnd.ms-excel" ||
    file.type ===
      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
  if (!isExcel) {
    ElMessage.error("只能上传Excel文件!");
  }
  return isExcel;
};
const uploadRef = ref("uploadRef");
const handleSuccess = (response) => {
  if (response.code === "200") {
    ElMessage.success("Excel导入成功！");
    getTableData();
  } else {
    ElMessage.error(response.msg);
  }
  uploadRef.value.clearFiles();
};

onMounted(async () => {
  setHeight();
  year.value = new Date().getFullYear() + "";
  opOptions.value.forEach((item) => {
    if (item.dictLabel == showLable.value) {
      lableValue.value = item.dictValue;
    }
  });
  await getTaskOption();
  // await getTableData();
  uploadUrl.value =
    import.meta.env.VITE_APP_BASE_API +
    "/api/v1/spc/xBarRUpload?type=1&operation=" +
    lableValue.value;
});
onBeforeUnmount(() => {});

const init = (data) => {
  lableValue.value = data;
  getTaskOption();
  getTableData();
};

// 暴露 init 方法
defineExpose({
  init,
});
</script>

<style lang="scss" scoped>
@media print {
  #print {
    margin-left: -18%;
  }
}
:deep(.el-table .warning-row) {
  background-color: rgb(241, 142, 142) !important;
}
.ellipsis-text {
  white-space: nowrap; /* 禁止换行 */
  overflow: hidden; /* 隐藏超出部分 */
  text-overflow: ellipsis; /* 显示省略号 */
  width: 100%; /* 宽度占满单元格 */
}
.formStyle {
  width: 400px;
  margin: 20px auto;
}
.container1 {
  width: 100%;
  height: 100%;
  display: flex;
  background-color: white;
  .infobox {
    width: 200px;
    .header {
      height: 120px;
      border-bottom: 2px solid #00000010;
      padding: 20px;
    }
    .body {
      padding: 20px;
    }
  }
  .databox {
    flex: 1;
    border-left: 2px solid #00000010;
    .box {
      height: 710px;
      padding: 5px 20px;
      display: flex;
      flex-direction: column;
      .illustrate {
        padding: 20px 60px;
      }
      .tableTitle {
        text-align: center;
        margin: 10px 0;
        padding-right: 40px;
      }
      .header {
        margin-top: 20px;
        //margin-left: 100px;
        display: flex;
        width: 100%;
        height: auto;
      }
      //.title {
      //  height: 50px;
      //  display: flex;
      //  align-items: center;
      //  margin-bottom: 10px;
      //  justify-content: space-between;
      //  .btns {
      //    display: flex;
      //    align-items: center;
      //    .btn {
      //      height: 24px;
      //      font-size: 14px;
      //      margin: 0 5px;
      //    }
      //  }
      //}
      .info {
        margin-top: 20px;
        flex: 1;
        height: 300px;
      }
    }
  }
}
</style>
