zhou zhou
1 天以前 aaf8a50511d77dbc209ca93bbba308c21179a8bc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<template>
  <div class="flow-step-instance-page art-full-height">
    <ArtSearchBar v-model="searchForm" :items="searchItems" :showExpand="true" @search="handleSearch" @reset="handleReset" />
    <ElCard class="art-table-card">
      <ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
        <template #left>
          <ListExportPrint
            class="inline-flex"
            :preview-visible="previewVisible"
            @update:previewVisible="handlePreviewVisibleChange"
            :report-title="reportTitle"
            :selected-rows="selectedRows"
            :query-params="reportQueryParams"
            :columns="reportColumns"
            :preview-rows="previewRows"
            :preview-meta="previewMeta"
            :total="pagination.total"
            :disabled="loading"
            @export="handleExport"
            @print="handlePrint"
          />
        </template>
      </ArtTableHeader>
      <ArtTable
        :loading="loading"
        :data="data"
        :columns="columns"
        :pagination="pagination"
        @selection-change="handleSelectionChange"
        @pagination:size-change="handleSizeChange"
        @pagination:current-change="handleCurrentChange"
      />
    </ElCard>
    <FlowStepInstanceDetailDrawer v-model:visible="detailDrawerVisible" :detail="detailData" />
  </div>
</template>
 
<script setup>
  import { computed, ref } from 'vue'
  import { useUserStore } from '@/store/modules/user'
  import { useTable } from '@/hooks/core/useTable'
  import { usePrintExportPage } from '@/views/system/common/usePrintExportPage'
  import ListExportPrint from '@/components/biz/list-export-print/index.vue'
  import { defaultResponseAdapter } from '@/utils/table/tableUtils'
  import { fetchExportFlowStepInstanceReport, fetchFlowStepInstancePage, fetchGetFlowStepInstanceDetail, fetchGetFlowStepInstanceMany } from '@/api/flow-step-instance'
  import { buildFlowStepInstancePageQueryParams, buildFlowStepInstancePrintRows, buildFlowStepInstanceSearchParams, createFlowStepInstanceSearchState, getFlowStepInstancePaginationKey, getFlowStepInstanceReportColumns, normalizeFlowStepInstanceRow, FLOW_STEP_INSTANCE_REPORT_TITLE } from './flowStepInstancePage.helpers'
  import { createFlowStepInstanceTableColumns } from './flowStepInstanceTable.columns'
  import FlowStepInstanceDetailDrawer from './modules/flow-step-instance-detail-drawer.vue'
 
  defineOptions({ name: 'FlowStepInstance' })
  const userStore = useUserStore()
  const searchForm = ref(createFlowStepInstanceSearchState())
  const detailDrawerVisible = ref(false)
  const detailData = ref({})
  const selectedRows = ref([])
  const reportTitle = FLOW_STEP_INSTANCE_REPORT_TITLE
  const reportQueryParams = computed(() => buildFlowStepInstanceSearchParams(searchForm.value))
  const reportColumns = getFlowStepInstanceReportColumns()
  const searchItems = computed(() => [
    { label: '关键字', key: 'condition', type: 'input', props: { clearable: true, placeholder: '请输入流程实例号/步骤编码/步骤名称' } },
    { label: '流程实例号', key: 'flowInstanceNo', type: 'input', props: { clearable: true, placeholder: '请输入流程实例号' } },
    { label: '步骤编码', key: 'stepCode', type: 'input', props: { clearable: true, placeholder: '请输入步骤编码' } },
    { label: '步骤名称', key: 'stepName', type: 'input', props: { clearable: true, placeholder: '请输入步骤名称' } },
    { label: '开始日期', key: 'timeStart', type: 'date', props: { clearable: true, valueFormat: 'YYYY-MM-DD', type: 'date' } },
    { label: '结束日期', key: 'timeEnd', type: 'date', props: { clearable: true, valueFormat: 'YYYY-MM-DD', type: 'date' } }
  ])
  function openDetail(row) {
    detailDrawerVisible.value = true
    loadDetail(row.id, row)
  }
  const { columns, columnChecks, data, loading, pagination, getData, replaceSearchParams, resetSearchParams, handleSizeChange, handleCurrentChange, refreshData } =
    useTable({
      core: {
        apiFn: fetchFlowStepInstancePage,
        apiParams: buildFlowStepInstancePageQueryParams(searchForm.value),
        paginationKey: getFlowStepInstancePaginationKey(),
        columnsFactory: () => createFlowStepInstanceTableColumns({ handleView: openDetail })
      },
      transform: {
        dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeFlowStepInstanceRow(item)) : [])
      }
    })
  const resolvePrintRecords = async (payload) => {
    if (Array.isArray(payload?.ids) && payload.ids.length > 0) {
      return defaultResponseAdapter(await fetchGetFlowStepInstanceMany(payload.ids)).records
    }
    return defaultResponseAdapter(await fetchFlowStepInstancePage({ ...reportQueryParams.value, current: 1, pageSize: Number(pagination.total) > 0 ? Number(pagination.total) : 20 })).records
  }
  const { previewVisible, previewRows, previewMeta, handlePreviewVisibleChange, handleExport, handlePrint } = usePrintExportPage({
    downloadFileName: 'flow-step-instance.xlsx',
    requestExport: (payload) => fetchExportFlowStepInstanceReport(payload, { headers: { Authorization: userStore.accessToken || '' } }),
    resolvePrintRecords,
    buildPreviewRows: (records) => buildFlowStepInstancePrintRows(records),
    buildPreviewMeta: (rows) => ({
      reportTitle,
      reportDate: new Date().toLocaleDateString('zh-CN'),
      printedAt: new Date().toLocaleString('zh-CN', { hour12: false }),
      operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
      count: rows.length
    })
  })
  async function loadDetail(id, fallback) {
    const detail = await fetchGetFlowStepInstanceDetail(id)
    detailData.value = normalizeFlowStepInstanceRow({ ...fallback, ...detail })
  }
  function handleSelectionChange(rows) {
    selectedRows.value = Array.isArray(rows) ? rows : []
  }
  function handleSearch(params) {
    replaceSearchParams(buildFlowStepInstanceSearchParams(params))
    getData()
  }
  function handleReset() {
    Object.assign(searchForm.value, createFlowStepInstanceSearchState())
    resetSearchParams()
  }
</script>