<template>
  <div>
    <el-card class="box-card">
      <el-tabs v-model="activeName" type="card" @tab-change="changeActiveName">
        <el-tab-pane label="待备料" name="first">
          <byTable
            :hideTable="true"
            :hidePagination="true"
            :source="sourceList.data"
            :pagination="sourceList.pagination"
            :config="config"
            :searchConfig="searchConfig"
            highlight-current-row
            :action-list="[
              {
                text: '打印备料单',
                action: () => outExcel(),
              },
              {
                text: '快捷出库',
                action: () => clickQuickDelivery(),
              },
            ]"
            @get-list="getList"
            @clickReset="clickReset">
          </byTable>

          <table class="table-class" border="0" cellpadding="0" cellspacing="0" v-loading="loading">
            <tr>
              <th style="width: 200px">BOM品号</th>
              <th style="min-width: 320px">BOM品名</th>
              <th style="width: 200px">SKU品号</th>
              <th style="width: 120px; text-align: center">数量小计</th>
              <th style="width: 140px; text-align: center">数量总计</th>
            </tr>
            <tbody v-for="(item, index) in sourceList.data" :key="index">
              <tr v-for="(itemSKU, indexSKU) in item.skuInfoList" :key="indexSKU">
                <td v-if="indexSKU === 0" :rowspan="item.skuInfoList.length">{{ item.bomSpecCode }}</td>
                <td v-if="indexSKU === 0" :rowspan="item.skuInfoList.length">{{ item.bomSpecName }}</td>
                <td>{{ itemSKU.skuSpecCode }}</td>
                <td style="text-align: center">{{ itemSKU.quantity }}</td>
                <td v-if="indexSKU === 0" :rowspan="item.skuInfoList.length" style="text-align: center">{{ item.totalQuantity }}</td>
              </tr>
            </tbody>
          </table>
        </el-tab-pane>
        <el-tab-pane label="已备料" name="second">
          <byTable
            :source="sourceListTwo.data"
            :pagination="sourceListTwo.pagination"
            :config="configTwo"
            :loading="loading"
            :searchConfig="searchConfigTwo"
            highlight-current-row
            @get-list="getListTwo"
            @clickReset="clickResetTwo">
            <template #blueprint="{ item }">
              <div>
                <img
                  v-if="item.blueprint"
                  style="margin-top: 3px; width: 40px; height: 40px; cursor: pointer; object-fit: contain; vertical-align: middle"
                  v-lazy="item.blueprint"
                  @click="openFile(item.blueprint)" />
              </div>
            </template>
            <template #size="{ item }">
              <span>{{ `${item.length} * ${item.width} * ${item.height}` }}</span>
            </template>
          </byTable>
        </el-tab-pane>
      </el-tabs>
    </el-card>

    <el-dialog title="打印" v-if="openPrint" v-model="openPrint" width="1000px">
      <div style="height: calc(100vh - 174px); overflow-y: auto; overflow-x: hidden">
        <div class="printBomList" id="printMe">
          <div class="t">生产备料单</div>
          <div class="time" style="text-align: right">
            {{ printTime }}
          </div>
          <table border="1" cellspacing="0" class="table">
            <thead>
              <tr>
                <td style="width: 6%; text-align: center">编号</td>
                <td style="width: 18%">物料品号</td>
                <td style="width: 38%">物料品名</td>
                <td style="width: 18%">SKU品号</td>
                <td style="width: 10%; text-align: center">数量小计</td>
                <td style="width: 10%; text-align: center">数量总计</td>
              </tr>
            </thead>
            <tbody v-for="(item, index) in sourceList.data" :key="index">
              <tr v-for="(itemSKU, indexSKU) in item.skuInfoList" :key="indexSKU">
                <td :rowspan="item.skuInfoList.length" v-if="indexSKU === 0" style="text-align: center">{{ index + 1 }}</td>
                <td :rowspan="item.skuInfoList.length" v-if="indexSKU === 0">{{ item.bomSpecCode }}</td>
                <td :rowspan="item.skuInfoList.length" v-if="indexSKU === 0">{{ item.bomSpecName }}</td>
                <td>{{ itemSKU.skuSpecCode }}</td>
                <td style="text-align: center">{{ itemSKU.quantity }}</td>
                <td :rowspan="item.skuInfoList.length" v-if="indexSKU === 0" style="text-align: center">{{ item.totalQuantity }}</td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
      <div style="text-align: center; margin: 10px">
        <el-button @click="openPrint = false" size="large">取消</el-button>
        <el-button type="primary" v-print="printObj" size="large">打印</el-button>
      </div>
    </el-dialog>

    <el-dialog title="快捷出库" v-if="openQuick" v-model="openQuick" width="90%">
      <Quick :pagination="sourceList.pagination" @clickCancel="clickCancel"></Quick>
    </el-dialog>
  </div>
</template>

<script setup>
import byTable from "/src/components/byTable/index";
import moment from "moment";
import Quick from "/src/views/production/operation/batching/quick";

const { proxy } = getCurrentInstance();
const activeName = ref("first");
const departmentList = ref([{ dictKey: "0", dictValue: "胜德体育" }]);
const sourceList = ref({
  data: [],
  pagination: {
    bomSpecCode: "",
    bomSpecName: "",
    skuSpecCode: "",
    skuSpecName: "",
    departmentId: "1689164627162529793",
  },
});
const sourceListTwo = ref({
  data: [],
  pagination: {
    total: 0,
    pageNum: 1,
    pageSize: 10,
    type: "1",
    orderCode: "",
    orderWlnCode: "",
    bomSpecCode: "",
    bomSpecName: "",
    skuSpecCode: "",
    skuSpecName: "",
    departmentId: "",
    width: "",
  },
});
const loading = ref(false);
const searchConfig = computed(() => {
  return [
    {
      type: "input",
      prop: "bomSpecCode",
      label: "BOM品号",
    },
    {
      type: "input",
      prop: "bomSpecName",
      label: "BOM品名",
    },
    {
      type: "input",
      prop: "skuSpecCode",
      label: "SKU品号",
    },
    {
      type: "input",
      prop: "skuSpecName",
      label: "SKU品名",
    },
    {
      type: "select",
      prop: "departmentId",
      data: departmentList.value,
      label: "事业部",
      clearable: true,
    },
  ];
});
const searchConfigTwo = computed(() => {
  return [
    {
      type: "input",
      prop: "orderCode",
      label: "订单号",
    },
    {
      type: "input",
      prop: "orderWlnCode",
      label: "万里牛单号",
    },
    {
      type: "input",
      prop: "bomSpecCode",
      label: "BOM品号",
    },
    {
      type: "input",
      prop: "bomSpecName",
      label: "BOM品名",
    },
    {
      type: "input",
      prop: "skuSpecCode",
      label: "SKU品号",
    },
    {
      type: "input",
      prop: "skuSpecName",
      label: "SKU品名",
    },
    {
      type: "select",
      prop: "departmentId",
      data: departmentList.value,
      label: "事业部",
    },
    {
      type: "input",
      prop: "width",
      label: "幅宽（cm）",
    },
  ];
});
const config = computed(() => {
  return [
    {
      type: "selection",
      attrs: {
        checkAtt: "isCheck",
      },
    },
    {
      attrs: {
        label: "BOM品号",
        prop: "bomSpecCode",
        width: 200,
      },
    },
    {
      attrs: {
        label: "BOM品名",
        prop: "bomSpecName",
        "min-width": 320,
      },
    },
    {
      attrs: {
        label: "SKU品号",
        prop: "skuSpecCode",
        width: 180,
      },
    },
    {
      attrs: {
        label: "数量",
        prop: "quantity",
        width: 120,
      },
    },
  ];
});
const configTwo = computed(() => {
  return [
    {
      attrs: {
        label: "设计图",
        slot: "blueprint",
        width: 80,
      },
    },
    {
      attrs: {
        label: "事业部",
        prop: "departmentName",
        width: 160,
      },
    },
    {
      attrs: {
        label: "BOM品号",
        prop: "bomSpecCode",
        width: 160,
      },
    },
    {
      attrs: {
        label: "BOM品名",
        prop: "bomSpecName",
        "min-width": 240,
      },
    },
    {
      attrs: {
        label: "SKU品号",
        prop: "skuSpecCode",
        width: 160,
      },
    },
    {
      attrs: {
        label: "SKU品名",
        prop: "skuSpecName",
        "min-width": 200,
      },
    },
    {
      attrs: {
        label: "尺寸（长宽高，cm）",
        slot: "size",
        width: 160,
      },
    },
    {
      attrs: {
        label: "数量",
        prop: "quantity",
        width: 100,
      },
    },
    {
      attrs: {
        label: "投产时间",
        prop: "createTime",
        width: 160,
        align: "center",
      },
    },
    {
      attrs: {
        label: "订单号",
        prop: "orderCode",
        width: 160,
      },
    },
    {
      attrs: {
        label: "万里牛单号",
        prop: "orderWlnCode",
        width: 160,
      },
    },
  ];
});
const getList = async (req, status) => {
  if (status) {
    sourceList.value.pagination = {
      departmentId: "1689164627162529793",
    };
  } else {
    sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
  }
  loading.value = true;
  proxy.post("/stockPreparation/uncompletedList", sourceList.value.pagination).then((res) => {
    if (res && res.length > 0) {
      sourceList.value.data = Object.freeze(
        res.map((item) => {
          return {
            ...item,
            isCheck: false,
          };
        })
      );
    } else {
      sourceList.value.data = res;
    }
    setTimeout(() => {
      loading.value = false;
    }, 200);
  });
};
getList();
const clickReset = () => {
  getList("", true);
};
const getListTwo = async (req, status) => {
  if (status) {
    sourceListTwo.value.pagination = {
      pageNum: sourceListTwo.value.pagination.pageNum,
      pageSize: sourceListTwo.value.pagination.pageSize,
    };
  } else {
    sourceListTwo.value.pagination = { ...sourceListTwo.value.pagination, ...req };
  }
  loading.value = true;
  proxy.post("/stockPreparation/completedPage", sourceListTwo.value.pagination).then((res) => {
    sourceListTwo.value.data = res.rows;
    sourceListTwo.value.pagination.total = res.total;
    setTimeout(() => {
      loading.value = false;
    }, 200);
  });
};
const clickResetTwo = () => {
  getListTwo("", true);
};
const changeActiveName = (val) => {
  if (val === "first") {
    getList();
  } else {
    getListTwo();
  }
};
const getDemandData = () => {
  proxy.post("/department/page", { pageNum: 1, pageSize: 999 }).then((res) => {
    if (res.rows && res.rows.length > 0) {
      departmentList.value = departmentList.value.concat(
        res.rows.map((item) => {
          return {
            dictKey: item.id,
            dictValue: item.name,
          };
        })
      );
    }
  });
};
getDemandData();
const openFile = (path) => {
  window.open(path);
};
const openPrint = ref(false);
const printTime = ref("");
const outExcel = () => {
  printTime.value = moment().format("yyyy-MM-DD HH:mm:ss");
  openPrint.value = true;
};
const printObj = ref({
  id: "printMe",
  popTitle: "",
  extraCss: "https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.compat.css, https://cdn.bootcdn.net/ajax/libs/hover.css/2.3.1/css/hover-min.css",
  extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>',
});
const openQuick = ref(false);
const clickQuickDelivery = () => {
  openQuick.value = true;
};
const clickCancel = (status) => {
  openQuick.value = false;
  if (status) {
    getList();
  }
};
</script>

<style lang="scss" scoped>
::v-deep(.el-input-number .el-input__inner) {
  text-align: left;
}
.printBomList {
  width: 100%;
  .t {
    text-align: center;
    font-size: 26px;
    font-weight: 700;
    margin: 10px 0px;
  }
  .time {
    margin-bottom: 10px;
  }
  .table {
    width: 100%;
    td {
      padding: 10px;
    }
  }
}
:deep(.el-dialog) {
  margin-top: 10px !important;
  margin-bottom: 10px !important;
}
.table-class {
  width: 100%;
  font-size: 14px;
  border: 1px solid #eeeeee;
}
.table-class th {
  height: 35px;
  line-height: 35px;
  padding: 0 12px;
  text-align: left;
  background-color: #eeeeee !important;
  border-right: 1px solid #eeeeee;
}
.table-class td {
  height: 35px;
  line-height: 35px;
  padding: 8px 12px;
  text-align: left;
  border-bottom: 1px solid #eeeeee;
  border-right: 1px solid #eeeeee;
}
</style>
