index.vue 8.85 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: '启用',
              //   popConfirm: {
              //     title: '是否启用?',
              //     confirm: handleOpen.bind(null, record),
              //   },
              // },
              {
                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 { SELECT_FIELD_COLUMNS } from './selectData';

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

  import { getFormConfig, getOrderColumns } from './tableData';
  import FormDetail from './FormDetail.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';

  const orderStore = useOrderStoreWithOut();

  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 [checkModalRegister, { openDrawer: openCheckDetailDrawer }] = useDrawer();
      onMounted(async () => {
        await orderStore.getDict();
      });

      const [registerTable, { getForm, reload }] = useTable({
        api: getOrderList,
        title: '订单列表',
        // api: () => {
        //   const res = demoListApi();
        //   total.value = res.data.total;
        //   return res;
        // // },
        // pagination: {
        //   total: 30,
        // },
        pagination: {
          total: 60,
        },
        columns: getOrderColumns(),
        useSearchForm: true,
        formConfig: getFormConfig(),
        showTableSetting: true,
        // tableSetting: { fullScreen: true },
        showIndexColumn: false,
        rowKey: 'id',
        rowSelection: {
          type: 'checkbox',
          selectedRowKeys: checkedKeys,
          onSelect: onSelect,
          onSelectAll: 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 handleOpen(record: Recordable) {}

      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() {
        await orderExport();
      }

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

      return {
        fieldDetailRegister,
        profitModalRegister,
        historyDetailRegister,
        formDetailRegister,
        handleProfitModal,
        registerTable,
        getFormValues,
        checkedKeys,
        onSelect,
        handleEdit,
        handleCheck,
        handleOpen,
        onSelectAll,
        tooltipVisible,
        handleFieldVisible,
        checkModalRegister,
        handleGoCheckDetail,
        handleGoFormDetail,
        handleHistory,
        handleAdd,
        SELECT_FIELD_COLUMNS,
        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>