index.vue 10.2 KB
<template>
  <div>
    <BasicTable @register="registerTable" bordered>
      <template #headerCell="{ column }">
        <!-- <template v-if="column.key === 'address1'">
          <span class="flex items-center justify-center"> 自定义字段列11 </span>
        </template> -->
        <template v-if="SELECT_FIELD_COLUMNS.includes(column.key)">
          <span class="flex items-center justify-center">
            {{ column.customTitle }}
            <FormOutlined class="ml-2 cursor-pointer" @click="handleFieldVisible(column)" />
          </span>
        </template>
        <template v-else>
          <HeaderCell :column="column" />
        </template>
      </template>
      <template #headerTop>
        <a-alert type="info" show-icon>
          <template #message>
            <template v-if="checkedKeys.length > 0">
              <span>已选中{{ checkedKeys.length }}条记录(可跨页)</span>
              <a-button type="link" @click="checkedKeys = []" size="small">清空</a-button>
            </template>
            <template v-else>
              <span>未选中任何订单</span>
            </template>
          </template>
        </a-alert>
      </template>
      <template #bodyCell="{ column, record }">
        <template v-if="column.key === 'action'">
          <TableAction
            :actions="[
              {
                label: '编辑',
                // icon: 'ic:outline-delete-outline',
                onClick: handleEdit.bind(null, record),
              },
              {
                label: '申请权限',
                // icon: 'ic:outline-delete-outline',
                onClick: handleCheck.bind(null, record),
              },
            ]"
            :dropDownActions="[
              {
                label: '历史记录',
                onClick: handleHistory.bind(null, record),
              },
            ]"
          />
        </template>
        <template v-if="column.key === 'picUrl'">
          <img
            :width="100"
            :height="100"
            :src="record.picUrl"
            :key="record.picUrl"
            @click="handlePreview(record.picUrl)"
          />
        </template>
      </template>

      <template #toolbar>
        <a-button type="primary" @click="handleExport">导出</a-button>
        <a-button type="primary" @click="handleProfitModal" :disabled="!checkedKeys.length"
          >分析利润</a-button
        >
        <a-button type="primary" @click="handleAdd">创建订单</a-button>
      </template>
    </BasicTable>
    <FormDetail
      @register="formDetailRegister"
      :onGoCheckDetail="handleGoCheckDetail"
      @success="handleFormSuccess"
    />
    <ProfitAnalysis @register="profitModalRegister" />
    <CheckDetail @register="checkModalRegister" :onGoFormDetail="handleGoFormDetail" />
    <HistoryDetail @register="historyDetailRegister" />
    <FieldDetail @register="fieldDetailRegister" />
  </div>
</template>
<script lang="ts">
  import { defineComponent, onMounted, ref, toRaw, toRefs, unref } from 'vue';
  import { BasicTable, useTable, TableAction } from '/@/components/Table';
  import { FormOutlined } from '@ant-design/icons-vue';
  import HeaderCell from '/@/components/Table/src/components/HeaderCell.vue';
  import { Alert } from 'ant-design-vue';

  import { useDrawer } from '/@/components/Drawer';
  import ProfitAnalysis from './ProfitAnalysis.vue';
  import { useModal } from '/@/components/Modal';

  import { getFormConfig, getOrderColumns, SELECT_FIELD_COLUMNS } from './tableData';
  import FormDetail from './FormDetail/index.vue';
  import CheckDetail from './CheckDetail.vue';
  import HistoryDetail from './HistoryDetail.vue';
  import FieldDetail from './FieldDetail.vue';
  import { createImgPreview } from '/@/components/Preview/index';
  import { getOrderList, orderExport } from '/@/api/project/order';
  import { useOrderStoreWithOut } from '/@/store/modules/order';
  import { keyBy, reduce } from 'lodash-es';
  import { useUserStoreWithOut } from '/@/store/modules/user';

  const orderStore = useOrderStoreWithOut();
  const userStore = useUserStoreWithOut();

  export default defineComponent({
    components: {
      HeaderCell,
      BasicTable,
      AAlert: Alert,
      TableAction,
      FormDetail,
      ProfitAnalysis,
      FormOutlined,
      CheckDetail,
      HistoryDetail,
      FieldDetail,
    },
    setup() {
      const checkedKeys = ref<Array<string | number>>([]);
      const [profitModalRegister, { openModal: openProfitModal }] = useModal();
      const tooltipVisible = ref(false);
      const [formDetailRegister, { openDrawer: openFormDetailDrawer }] = useDrawer();
      const [historyDetailRegister, { openDrawer: openHistoryDetailDrawer }] = useDrawer();
      const [fieldDetailRegister, { openDrawer: openFieldDetailDrawer }] = useDrawer();

      const user = userStore.getUserInfo;

      const [checkModalRegister, { openDrawer: openCheckDetailDrawer }] = useDrawer();
      onMounted(async () => {
        await orderStore.getDict();
      });

      const [registerTable, { getForm, reload, getColumns }] = useTable({
        api: getOrderList,
        title: '订单列表',
        pagination: {
          total: 60,
        },
        columns: getOrderColumns(user?.roleSmallVO?.code),
        useSearchForm: true,
        formConfig: getFormConfig(),
        showTableSetting: true,
        // tableSetting: { fullScreen: true },
        showIndexColumn: false,
        rowKey: 'id',
        rowSelection: {
          type: 'checkbox',
          selectedRowKeys: checkedKeys,
          onSelect,
          onSelectAll,
        },
        actionColumn: {
          width: 160,
          title: 'Action',
          dataIndex: 'action',
          // slots: { customRender: 'action' },
        },
      });

      function getFormValues() {
        console.log(getForm().getFieldsValue());
      }

      function onSelect(record, selected) {
        if (selected) {
          checkedKeys.value = [...checkedKeys.value, record.id];
        } else {
          checkedKeys.value = checkedKeys.value.filter((id) => id !== record.id);
        }
      }
      function onSelectAll(selected, selectedRows, changeRows) {
        const changeIds = changeRows.map((item) => item.id);
        if (selected) {
          checkedKeys.value = [...checkedKeys.value, ...changeIds];
        } else {
          checkedKeys.value = checkedKeys.value.filter((id) => {
            return !changeIds.includes(id);
          });
        }
      }

      function handleEdit(record, e) {
        openFormDetailDrawer(true, { ...toRaw(record) });
        e?.stopPropagation();
        return false;
      }

      function handleAdd() {
        openFormDetailDrawer(true, {});
      }

      function handleCheck(record, e) {
        openCheckDetailDrawer(true, record);
        e?.stopPropagation();
        return false;
      }

      function handleHistory(record, e) {
        openHistoryDetailDrawer(true, record);
        e?.stopPropagation();
        return false;
      }

      function handleProfitModal() {
        openProfitModal(true, {
          data: checkedKeys.value,
        });
      }

      function handleFieldVisible(record) {
        openFieldDetailDrawer(true, record);
      }

      function handleGoCheckDetail() {
        openCheckDetailDrawer(true);
        openFormDetailDrawer(false);
      }

      function handleGoFormDetail() {
        openCheckDetailDrawer(false);
        openFormDetailDrawer(true);
      }

      function handlePreview(url, e) {
        createImgPreview({ imageList: [url], defaultWidth: 500 });
        // e?.stopPropagation();
        // e?.preventDefault();
        return false;
      }

      async function handleExport() {
        const columns = getColumns();
        const colObj = keyBy(columns, 'dataIndex');
        const {
          trackStageInfo,
          reportInfo,
          profitAnalysisInfo,
          inspectionStageInfo,
          ...baseFields
        } = colObj;

        for (const key in baseFields) {
          baseFields[key] = 'selected';
        }
        delete baseFields.action;

        const fieldVO = {
          baseFields,
          profitAnalysisFields: profitAnalysisInfo?.children?.length
            ? reduce(
                profitAnalysisInfo.children,
                (result, item) => {
                  result[item.dataIndex] = 'selected';
                  return result;
                },
                {},
              )
            : {},
          reportFields: reportInfo?.children?.length
            ? reduce(
                reportInfo.children,
                (result, item) => {
                  result[item.dataIndex] = 'selected';
                  return result;
                },
                {},
              )
            : {},
          trackStageFields: trackStageInfo?.children?.length
            ? reduce(
                trackStageInfo.children,
                (result, item) => {
                  result[item.dataIndex] = 'selected';
                  return result;
                },
                {},
              )
            : {},
          inspectionStageFields: inspectionStageInfo?.children?.length
            ? reduce(
                inspectionStageInfo.children,
                (result, item) => {
                  result[item.dataIndex] = 'selected';
                  return result;
                },
                {},
              )
            : {},
        };

        await orderExport({ fieldVO });
      }

      const handleFormSuccess = () => {
        reload();
      };

      return {
        SELECT_FIELD_COLUMNS,
        fieldDetailRegister,
        profitModalRegister,
        historyDetailRegister,
        formDetailRegister,
        handleProfitModal,
        registerTable,
        getFormValues,
        checkedKeys,
        onSelect,
        handleEdit,
        handleCheck,
        onSelectAll,
        tooltipVisible,
        handleFieldVisible,
        checkModalRegister,
        handleGoCheckDetail,
        handleGoFormDetail,
        handleHistory,
        handleAdd,
        createImgPreview,
        handleExport,
        handlePreview,
        handleFormSuccess,
      };
    },
  });
</script>

<style>
  .ant-table-thead th,
  .ant-table-tbody td {
    padding: 0;
    white-space: pre-wrap;
  }

  .ant-table-cell img {
    width: 100px;
    height: 100px;
  }
</style>
./constant