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

  <!-- 列表头部 -->
  <TableHead 
      :HeadButttondata="HeadButttondata" 
      @button-base-click="buttonBaseClick" 
      :routeName="routeName"
      @updataTableColumns="updataTableColumns" 
      @searchFormClick="searchFormClick"
    :allSchemas="SupplierinvoiceRequestMain.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="SupplierinvoiceRequestMainRules"
    :formAllSchemas="SupplierinvoiceRequestMain.allSchemas" 
    :searchTableParams="searchTableParams"
    :tableAllSchemas="SupplierinvoiceRequestDetail.allSchemas" 
    :tableFormRules="SupplierinvoiceRequestDetailRules"
    :tableData="tableData" 
    :apiUpdate="SupplierinvoiceRequestMainApi.updateSupplierinvoiceRequestMain"
    :apiCreate="SupplierinvoiceRequestMainApi.createSupplierinvoiceRequestMain" 
    :isBusiness="true"
    @handleAddTable="handleAddTable" 
    @handleDeleteTable="handleDeleteTable" 
    @searchTableSuccess="searchTableSuccess"
    @submitForm="submitForm" 
  />

  <!-- 详情 -->
  <Detail 
    ref="detailRef" 
    :isBasic="false" 
    :allSchemas="SupplierinvoiceRequestMain.allSchemas"
    :detailAllSchemas="SupplierinvoiceRequestDetail.allSchemas"
    :detailAllSchemasRules="SupplierinvoiceRequestDetailRules" 
    :searchTableParams="searchTableParams"
    :apiCreate="SupplierinvoiceRequestDetailApi.createSupplierinvoiceRequestDetail"
    :apiUpdate="SupplierinvoiceRequestDetailApi.updateSupplierinvoiceRequestDetail"
    :apiPage="SupplierinvoiceRequestDetailApi.getSupplierinvoiceRequestDetailPage"
    :apiDelete="SupplierinvoiceRequestDetailApi.deleteSupplierinvoiceRequestDetail" 
    :Echo="Echo" 
  />

</template>

<script setup lang="ts">
  import download from '@/utils/download'
  import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
  import { SupplierinvoiceRequestMain, 
    SupplierinvoiceRequestMainRules, 
    SupplierinvoiceRequestDetail, 
    SupplierinvoiceRequestDetailRules } from './supplierinvoiceRequestMain.data'
  import * as SupplierinvoiceRequestMainApi from '@/api/wms/supplierinvoiceRequestMain'
  import * as SupplierinvoiceRequestDetailApi from '@/api/wms/supplierinvoiceRequestDetail'
  import * as defaultButtons from '@/utils/disposition/defaultButtons'
  import * as SupplierApi from '@/api/wms/supplier'
  import { Supplier } from '../../../basicDataManage/supplierManage/supplier/supplier.data'

  defineOptions({ name: 'SupplierinvoiceRequestMain' })

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

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

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

  // 查询列表页面参数设置
  const searchTableParams = ref([
    {
      formField: 'supplierCode',
      searchTableTitle: '供应商信息',
      searchTableAllSchemas: Supplier.allSchemas,
      searchTablePage: SupplierApi.getSupplierPage
    }
  ])

  // 查询页面返回
  const searchTableSuccess = (formField, searchField, val, formRef, type, row) => {
    nextTick(() => {
      if (type == 'tableForm') {
        // 明细查询页赋值
        row[formField] = val[0][searchField]
        if (formField == 'poNumber') {
          row['poNumber'] = val[0]['poNumber']
          row['poLine'] = val[0]['poLine']
          row['itemCode'] = val[0]['itemCode']
          row['ownerCode'] = val[0]['ownerCode']
          row['batch'] = val[0]['batch']
          row['singlePrice'] = val[0]['singlePrice']
          row['amount'] = val[0]['amount']
        }
      } else {
        const setV = {}
        if(formField == 'recordNumber'){
          setV['recordNumber'] = val[0]['number']
          setV['asnBillNum'] = val[0]['asnNumber']
        }
        setV[formField] = val[0][searchField]
        formRef.setValues(setV)
      }
    })
  }
  // 子表新增的时候选择表格之后需要会显得字段
  // const Echo = ['ppNumber','poLine', 'batch', 'altBatch', 'itemCode', 'itemName', 'itemDesc1', 'itemDesc2', 'projectCode', 'qty', 'uom']
  const Echo = []

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

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

  // 列表头部按钮
  const HeadButttondata = [
    defaultButtons.defaultAddBtn({ hasPermi: 'wms:supplierinvoice-request-main:create' }), // 新增
    defaultButtons.defaultExportBtn({ hasPermi: 'wms:supplierinvoice-request-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') { // 刷新
      if (tableObject.params.filters && tableObject.params.filters.length > 0 ) {
      searchFormClick({
        filters: tableObject.params.filters
      })
    } else {
      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', '2', '4']) }), // 关闭
      defaultButtons.mainListPlanSubBtn({ hide: isShowMainButton(row, ['1']) }), // 提交审批
      defaultButtons.mainListPlanAppBtn({ hide: isShowMainButton(row, ['2']) }), // 审批通过
      defaultButtons.mainListPlanTurBtn({ hide: isShowMainButton(row, ['2']) }), // 驳回按钮
      defaultButtons.mainListEditBtn({ hasPermi: 'wms:supplierinvoice-request-main:update' , hide: isShowMainButton(row, ['1'])}), // 编辑
      // 生成记录
      {
        label: '处理',
        name: 'genRecords',
        hide: isShowMainButton(row, ['3']),
        type: 'primary',
        icon: '',
        color: '',
        hasPermi: '',
        link: true, // 文本展现按钮
      },
      // defaultButtons.mainListDeleteBtn({hasPermi:'wms:supplierinvoice-request-main:delete'}), // 删除
    ]
  }



  // 列表-操作按钮事件
  const buttonTableClick = async (val, row) => {
    if (val == 'mainPurPlanOpe') { // 打开
      handleOpe(row.id)
    } else if (val == 'mainPurPlanClo') {// 关闭
      handleClo(row.id)
    } else if (val == 'mainPlanSub') { // 提交审批
      handleSub(row.id)
    } else if (val == 'mainPlanApp') { // 审批通过
      handleApp(row.id)
    } else if (val == 'mainPlanTur') { // 驳回按钮
      handleTur(row.id)
    } else if (val == 'genRecords') { // 处理
      genRecords(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 { wsCache } = useCache()
  /** 详情操作 */
  const detailRef = ref()
  const openDetail = (row : any, titleName : any, titleValue : any) => {
    const departmentCode = wsCache.get(CACHE_KEY.DEPT).find((account) => account.id == row.departmentCode)?.name
    if (departmentCode) row.departmentCode = JSON.parse(JSON.stringify(departmentCode))
    detailRef.value.openDetail(row, titleName, titleValue)
  }

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

  /** 关闭按钮操作 */
  const handleClo = async (id : number) => {
    try {
      // 关闭的二次确认
      await message.confirm('是否关闭所选中数据？')
      tableObject.loading = true
      // 发起关闭
      await SupplierinvoiceRequestMainApi.cloSupplierinvoiceRequestMain(id)
      message.success(t('关闭成功!'))
      tableObject.loading = false
      // 刷新列表
      await getList()
    } catch { }finally{
      tableObject.loading = false
    }
  }

  /** 打开按钮操作 */
  const handleOpe = async (id : number) => {
    try {
      // 打开的二次确认
      await message.confirm('是否打开所选中数据？')
      tableObject.loading = true
      // 发起打开
      await SupplierinvoiceRequestMainApi.opeSupplierinvoiceRequestMain(id)
      message.success(t('打开成功!'))
      tableObject.loading = false
      // 刷新列表
      await getList()
    } catch { }finally{
      tableObject.loading = false
    }
  }

  /** 提交审批按钮操作 */
  const handleSub = async (id : number) => {
    try {
      // 提交审批的二次确认
      await message.confirm('是否提交审批所选中数据？')
      tableObject.loading = true
      // 发起提交审批
      await SupplierinvoiceRequestMainApi.subSupplierinvoiceRequestMain(id)
      message.success(t('提交审批成功!'))
      tableObject.loading = false
      // 刷新列表
      await getList()
    } catch { }finally{
      tableObject.loading = false
    }
  }

  /** 审批通过按钮操作 */
  const handleApp = async (id : number) => {
    try {
      // 审批通过的二次确认
      await message.confirm('是否审批通过所选中数据？')
      tableObject.loading = true
      // 发起审批通过
      await SupplierinvoiceRequestMainApi.appSupplierinvoiceRequestMain(id)
      message.success(t('审批通过成功!'))
      tableObject.loading = false
      // 刷新列表
      await getList()
    } catch { }finally{
      tableObject.loading = false
    }
  }

  /** 驳回按钮操作 */
  const handleTur = async (id : number) => {
    try {
      // 驳回的二次确认
      await message.confirm('是否驳回所选中数据？')
      tableObject.loading = true
      // 发起驳回
      await SupplierinvoiceRequestMainApi.rejSupplierinvoiceRequestMain(id)
      message.success(t('驳回成功!'))
      tableObject.loading = false
      // 刷新列表
      await getList()
    } catch { }finally{
      tableObject.loading = false
    }
  }
  
  /** 处理按钮操作 */
  const genRecords = async (id : number) => {
    try {
      // 处理的二次确认
      await message.confirm('是否处理所选中数据？')
      tableObject.loading = true
      // 发起处理
      await SupplierinvoiceRequestMainApi.genRecordsSupplierinvoiceRequestMain(id)
      message.success(t('处理成功!'))
      tableObject.loading = false
      // 刷新列表
      await getList()
    } catch { }finally{
      tableObject.loading = false
    }
  }

  /** 导出按钮操作 */
  const exportLoading = ref(false) // 导出的加载中
  const handleExport = async () => {
    try {
      // 导出的二次确认
      await message.exportConfirm()
      // 发起导出
      exportLoading.value = true
      const data = await SupplierinvoiceRequestMainApi.exportSupplierinvoiceRequestMain(tableObject.params)
      download.excel(data, '供应商发票申请主.xlsx')
    } catch {
    } finally {
      exportLoading.value = false
    }
  }

  /**
    * tableForm方法
  */
  const tableFormKeys = {}
  SupplierinvoiceRequestDetail.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 = tableData.value // 拼接子表数据参数
    try {
      if (formType === 'create') {
        await SupplierinvoiceRequestMainApi.createSupplierinvoiceRequestMain(data)
        message.success(t('common.createSuccess'))
      } else {
        await SupplierinvoiceRequestMainApi.updateSupplierinvoiceRequestMain(data)
        message.success(t('common.updateSuccess'))
      }
      formRef.value.dialogVisible = false
      // 刷新当前列表
      getList()
    } finally {
      formRef.value.formLoading = false
    }
  }

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

  /** 初始化 **/
  onMounted(async () => {
    getList()
  })
</script>
