<template>
  <ContentWrap>
    <!-- 搜索工作栏 -->
    <Search :schema="PurchasePlanMain.allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
  </ContentWrap>

  <!-- 列表头部 -->
  <TableHead :HeadButttondata="HeadButttondata" @button-base-click="buttonBaseClick" :routeName="routeName"
    @updataTableColumns="updataTableColumns" @searchFormClick="searchFormClick"
    :allSchemas="PurchasePlanMain.allSchemas" />

  <!-- 列表 -->
  <ContentWrap>
    <Table :columns="tableColumns" :data="tableObject.tableList" :loading="tableObject.loading" :pagination="{
        total: tableObject.total
      }" v-model:pageSize="tableObject.pageSize" v-model:currentPage="tableObject.currentPage"
      v-model:sort="tableObject.sort">
      <template #number="{row}">
        <el-button type="primary" link @click="openDetail(row, '单据号', row.number)">
          <span>{{ row.number }}</span>
        </el-button>
      </template>
      <template #action="{ row }">
        <ButtonBase :Butttondata="butttondata(row)" @button-base-click="buttonTableClick($event,row)" />
      </template>
    </Table>
  </ContentWrap>

  <!-- 表单弹窗:添加/修改 -->
  <BasicForm ref="formRef" @success="getList" :rules="PurchasePlanMainRules"
    :formAllSchemas="PurchasePlanMain.allSchemas" :tableAllSchemas="PurchasePlanDetail.allSchemas"
    :tableFormRules="PurchasePlanDetailRules" :tableData="tableData"
    :apiUpdate="PurchasePlanMainApi.updatePurchasePlanMain" :apiCreate="PurchasePlanMainApi.createPurchasePlanMain"
    :isBusiness="true" @handleAddTable="handleAddTable" @handleDeleteTable="handleDeleteTable"
    @searchTableSuccess="searchTableSuccess" @submitForm="submitForm" />

  <!-- 详情 -->
  <Detail ref="detailRef" :isBasic="false" :allSchemas="PurchasePlanMain.allSchemas"
    :detailAllSchemas="PurchasePlanDetail.allSchemas" :detailAllSchemasRules="PurchasePlanDetailRules"
    :apiCreate="PurchasePlanDetailApi.createPurchasePlanDetail"
    :apiUpdate="PurchasePlanDetailApi.updatePurchasePlanDetail"
    :apiPage="PurchasePlanDetailApi.getPurchasePlanDetailPage"
    :apiDelete="PurchasePlanDetailApi.deletePurchasePlanDetail" @searchTableSuccessDetail="searchTableSuccessDetail"
    :detailValidate="detailValidate" />

  <!-- 导入 -->
  <ImportForm ref="importFormRef" url="/wms/purchase-plan-main/import" :importTemplateData="importTemplateData"
    @success="importSuccess" :updateIsDisable="true" :coverIsDisable="true" :mode="2" />
</template>

<script setup lang="ts">
  import download from '@/utils/download'
  import { PurchasePlanMain, PurchasePlanMainRules, PurchasePlanDetail, PurchasePlanDetailRules } from './purchasePlanMain.data'
  import * as PurchasePlanMainApi from '@/api/wms/purchasePlanMain'
  import * as PurchasePlanDetailApi from '@/api/wms/purchasePlanDetail'
  import * as defaultButtons from '@/utils/disposition/defaultButtons'
  import * as PurchaseDetailApi from '@/api/wms/purchaseDetail'

  // 要货计划
  defineOptions({ name: 'PurchasePlanMain' })

  const message = useMessage() // 消息弹窗
  const { t } = useI18n() // 国际化

  const route = useRoute() // 路由信息
  const routeName = ref()
  routeName.value = route.name
  const tableColumns = ref(PurchasePlanMain.allSchemas.tableColumns)

  // 字段设置 更新主列表字段
  const updataTableColumns = (val) => {
    tableColumns.value = val
  }

  // 查询页面返回
  const searchTableSuccess = (formField, searchField, val, formRef, type, row) => {
    nextTick(async () => {
      if (type == 'tableForm') {
        // 明细查询页赋值
        row[formField] = val[0][searchField]
        row['itemCode'] = val[0]['code']
        row['poNumber'] = val[0]['number']
        row['poLine'] = val[0]['lineNumber']
        await PurchaseDetailApi.getPurchaseDetailPage({
          number: row['poNumber'],
          lineNumber: row['poLine'],
        }).then(res => {
          if (res.list.length == 1) {
            row['itemCode'] = res.list[0].itemCode
          }
        })
      } else {
        const setV = {}
        setV[formField] = val[0][searchField]
        formRef.setValues(setV)
      }
    })
  }
  // 查询页面返回——详情
  const searchTableSuccessDetail = (formField, searchField, val, formRef) => {
    nextTick(async () => {
      const setV = {}
      setV[formField] = val[0][searchField]
      setV['poNumber'] = val[0]['number']
      setV['poLine'] = val[0]['lineNumber']
      formRef.setValues(setV)
      await PurchaseDetailApi.getPurchaseDetailPage({
        number: setV['poNumber'],
        lineNumber: setV['poLine'],
      }).then(res => {
        if (res.list.length == 1) {
         // 叶佳兴
          setV['itemCode'] = res.list[0].itemCode
        }
      })
    })
  }

  const { tableObject, tableMethods } = useTable({
    getListApi: PurchasePlanMainApi.getPurchasePlanMainPage // 分页接口
  })

  // 获得表格的各种操作
  const { getList, setSearchParams } = tableMethods

  // 列表头部按钮
  const HeadButttondata = [
    defaultButtons.defaultAddBtn({ hasPermi: 'wms:purchase-plan-main:create' }), // 新增——需要手动修改下权限
    defaultButtons.defaultImportBtn({ hasPermi: 'wms:purchase-plan-main:import' }), // 导入
    defaultButtons.defaultExportBtn({ hasPermi: 'wms:purchase-plan-main:export' }), // 导出
    defaultButtons.defaultFreshBtn(null), // 刷新
    defaultButtons.defaultFilterBtn(null), // 筛选
    defaultButtons.defaultSetBtn(null), // 设置
    // {
    //   label: '自定义扩展按钮',
    //   name: 'zdy',
    //   hide: false,
    //   type: 'primary',
    //   icon: 'Select',
    //   color: ''
    // },
  ]

  // 头部按钮事件
  const buttonBaseClick = (val, item) => {
    if (val == 'add') { // 新增
      openForm('create')
    } else if (val == 'import') { // 导入
      handleImport()
    } else if (val == 'export') { // 导出
      handleExport()
    } else if (val == 'refresh') { // 刷新
      getList()
    } else if (val == 'filtrate') { // 筛选
    } else { // 其他按钮
      console.log('其他按钮', item)
    }
  }

  // 根据状态返回该按钮是否显示
  const isShowMainButton = (row, val) => {
    if (val.indexOf(row.status) > -1) {
      return false
    } else {
      return true
    }
  }

  // 列表-操作按钮
  const butttondata = (row) => {
    return [
      defaultButtons.mainListPurchasePlanOpeBtn({ hide: isShowMainButton(row, ['5']) }), // 打开
      defaultButtons.mainListPurchasePlanCloBtn({ hide: isShowMainButton(row, ['1']) }), // 关闭
      defaultButtons.mainListPurchasePlanPubBtn({ hide: isShowMainButton(row, ['1']) }), // 发布
      defaultButtons.mainListPurchasePlanAccBtn({ hide: isShowMainButton(row, ['6']) }), // 接受
      defaultButtons.mainListPurchasePlanRejBtn({ hide: isShowMainButton(row, ['6']) }), // 不接受
      defaultButtons.mainListPurchasePlanWitBtn({ hide: isShowMainButton(row, ['6']) }), // 下架
      defaultButtons.mainListEditBtn({ hide: isShowMainButton(row, ['1']), hasPermi: 'wms:purchase-plan-main:update' }), // 编辑
      // defaultButtons.mainListDeleteBtn({hide:isShowMainButton(row,['1']),hasPermi:'wms:purchase-plan-main:delete'}), // 删除
    ]
  }

  // 列表-操作按钮事件
  const buttonTableClick = async (val, row) => {
    if (val == 'mainPurPlanOpe') { // 打开
      handleOpen(row.id)
    } else if (val == 'mainPurPlanClo') {// 关闭
      handleClose(row.id)
    } else if (val == 'mainPurPlanPub') { // 发布
      handlePublish(row.id)
    } else if (val == 'mainPurPlanAcc') { // 接受
      handleAcc(row.id)
    } else if (val == 'mainPurPlanRej') { // 不接受
      handleRej(row.id)
    } else if (val == 'mainPurPlanWit') { // 下架
      handleWit(row.id)
    } else if (val == 'edit') { // 编辑
      openForm('update', row)
    } else if (val == 'delete') { // 删除
      handleDelete(row.id)
    }
  }

  /** 添加/修改操作 */
  const formRef = ref()
  const openForm = async (type : string, row ?: number) => {
    tableData.value = [] // 重置明细数据
    formRef.value.open(type, row)
  }

  /** 详情操作 */
  const detailRef = ref()
  const openDetail = (row : any, titleName : any, titleValue : any) => {
    detailRef.value.openDetail(row, titleName, titleValue)
  }

  /** 删除按钮操作 */
  const handleDelete = async (id : number) => {
    try {
      // 删除的二次确认
      await message.delConfirm()
      // 发起删除
      await PurchasePlanMainApi.deletePurchasePlanMain(id)
      message.success(t('common.delSuccess'))
      // 刷新列表
      await getList()
    } catch { }
  }

  /** 关闭按钮操作 */
  const handleClose = async (id : number) => {
    try {
      // 关闭的二次确认
      await message.confirm('是否关闭所选中数据?')
      // 发起关闭
      await PurchasePlanMainApi.closePurchasePlanMain(id)
      message.success(t('关闭成功!'))
      // 刷新列表
      await getList()
    } catch { }
  }

  /** 打开按钮操作 */
  const handleOpen = async (id : number) => {
    try {
      // 打开的二次确认
      await message.confirm('是否打开所选中数据?')
      // 发起打开
      await PurchasePlanMainApi.openPurchasePlanMain(id)
      message.success(t('打开成功!'))
      // 刷新列表
      await getList()
    } catch { }
  }

  /** 发布按钮操作 */
  const handlePublish = async (id : number) => {
    try {
      // 发布的二次确认
      await message.confirm('是否发布所选中数据?')
      // 发起发布
      await PurchasePlanMainApi.publishPurchasePlanMain(id)
      message.success(t('发布成功!'))
      // 刷新列表
      await getList()
    } catch { }
  }

  /** 下架按钮操作 */
  const handleWit = async (id : number) => {
    try {
      // 下架的二次确认
      await message.confirm('是否下架所选中数据?')
      // 发起下架
      await PurchasePlanMainApi.witPurchasePlanMain(id)
      message.success(t('下架成功!'))
      // 刷新列表
      await getList()
    } catch { }
  }

  /** 接受按钮操作 */
  const handleAcc = async (id : number) => {
    try {
      // 接受的二次确认
      await message.confirm('是否接受所选中数据?')
      // 发起接受
      await PurchasePlanMainApi.accPurchasePlanMain(id)
      message.success(t('接受成功!'))
      // 刷新列表
      await getList()
    } catch { }
  }

  /** 驳回按钮操作 */
  const handleRej = async (id : number) => {
    try {
      // 驳回的二次确认
      await message.confirm('是否驳回所选中数据?')
      // 发起驳回
      await PurchasePlanMainApi.rejPurchasePlanMain(id)
      message.success(t('驳回成功!'))
      // 刷新列表
      await getList()
    } catch { }
  }

  /** 导出按钮操作 */
  const exportLoading = ref(false) // 导出的加载中
  const handleExport = async () => {
    try {
      // 导出的二次确认
      await message.exportConfirm()
      // 发起导出
      exportLoading.value = true
      const data = await PurchasePlanMainApi.exportPurchasePlanMain(setSearchParams)
      download.excel(data, '要货计划主.xls')
    } catch {
    } finally {
      exportLoading.value = false
    }
  }

  /**
    * tableForm方法
  */
  const tableFormKeys = {}
  PurchasePlanDetail.allSchemas.tableFormColumns.forEach(item => {
    tableFormKeys[item.field] = item.default ? item.default : ''
  })
  const tableData = ref([])

  // 添加明细
  const handleAddTable = () => {
    tableData.value.push(JSON.parse(JSON.stringify(tableFormKeys)))
  }
  // 删除明细
  const handleDeleteTable = (item, index) => {
    tableData.value.splice(index, 1)
  }

  // 主子数据 提交
  const submitForm = async (formType, data) => {
    data.subList = []
    for (let item of tableData.value) {
      await PurchaseDetailApi.getPurchaseDetailPage({
        number: item.poNumber,
        lineNumber: item.poLine,
      }).then(res => {
        data.subList.push(item) // 拼接子表数据参数 
        // if(item.planQty > res.list[0].orderQty-res.list[0].plannedQty){
        //   message.error('要货计划数量不得大于订单数量-已计划数量')
        // } else {
        //   data.subList.push(item) // 拼接子表数据参数 
        // }
      })
    }
    if (data.subList.length == tableData.value.length) {
      try {
        if (formType === 'create') {
          await PurchasePlanMainApi.createPurchasePlanMain(data)
          message.success(t('common.createSuccess'))
        } else {
          await PurchasePlanMainApi.updatePurchasePlanMain(data)
          message.success(t('common.updateSuccess'))
        }
        formRef.value.dialogVisible = false
        // 刷新当前列表
        getList()
      } finally {
        formRef.value.formLoading = false
      }
    }
    formRef.value.formLoading = false
  }

  // 子表新增/编辑校验
  const detailValidate = async (data) => {
    let tag = false
    await PurchaseDetailApi.getPurchaseDetailPage({
      number: data.poNumber,
      lineNumber: data.poLine
    }).then(res => {
      if (data.planQty > res.list[0].orderQty - res.list[0].plannedQty) {
        message.error('要货计划数量不得大于订单数量-已计划数量')
        tag = false
      } else {
        tag = true
      }
    })
    return tag
  }

  /** 导入 */
  const importFormRef = ref()
  const handleImport = () => {
    importFormRef.value.open()
  }

  // 导入附件弹窗所需的参数
  const importTemplateData = reactive({
    templateUrl: '',
    templateTitle: '要货计划主导入模版.xls'
  })

  // 导入成功之后
  const importSuccess = () => {
    getList()
  }

  // 筛选提交
  const searchFormClick = (searchData) => {
    tableObject.params = {
      isSearch: true,
      filters: searchData.filters
    }
    getList() // 刷新当前列表
  }

  /** 初始化 **/
  onMounted(async () => {
    getList()
    importTemplateData.templateUrl = await PurchasePlanMainApi.importTemplate()
  })
</script>