index.vue 11 KB
<template>
  <div class="order-page">
    <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) && role === ROLE.ADMIN">
          <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="[
              {
                // 数据分析没有编辑权限
                ...(role !== ROLE.DATA_REPORT_USER && {
                  label: '编辑',
                  // icon: 'ic:outline-delete-outline',
                  onClick: handleEdit.bind(null, record),
                }),
              },
              {
                ...(role !== ROLE.DATA_REPORT_USER && {
                  label: '申请权限',
                  // icon: 'ic:outline-delete-outline',
                  onClick: handleCheck.bind(null, record),
                }),
              },
            ]"
            :dropDownActions="
              role !== ROLE.DATA_REPORT_USER
                ? [
                    {
                      label: '历史记录',
                      onClick: handleHistory.bind(null, record),
                    },
                    {
                      ...(role === ROLE.ADMIN && {
                        label: '删除',
                        popConfirm: {
                          title: '是否确认删除',
                          placement: 'left',
                          confirm: handleDelete.bind(null, record?.id),
                        },
                      }),
                    },
                  ]
                : []
            "
          />
        </template>
        <template v-if="column.key === 'picUrl'">
          <img
            :width="100"
            :height="100"
            :src="record.smallPicUrl"
            :key="record.smallPicUrl"
            @click="handlePreview(record.picUrl)"
          />
        </template>
      </template>

      <template #toolbar>
        <a-button type="primary" @click="handleRateModal" v-if="role === ROLE.ADMIN"
          >比重计算</a-button
        >
        <a-button type="primary" @click="handleExportModal">导出</a-button>
        <a-button type="primary" @click="handleProfitModal" v-if="role === ROLE.ADMIN"
          >分析利润</a-button
        >
        <a-button
          type="primary"
          @click="handleAdd"
          v-if="role === ROLE.ADMIN && role === ROLE.BUSINESS && role === ROLE.TRACKER"
          >创建订单</a-button
        >
      </template>
    </BasicTable>
    <FormDetail
      @register="formDetailRegister"
      :onGoCheckDetail="handleGoCheckDetail"
      @success="handleFormSuccess"
    />
    <ProfitAnalysis @register="profitModalRegister" />
    <RateModal @register="rateModalRegister" />
    <ExportModal @register="exportModalRegister" :role="role" :ids="checkedKeys" />
    <CheckDetail @register="checkModalRegister" :onGoFormDetail="handleGoFormDetail" />
    <HistoryDetail @register="historyDetailRegister" />
    <FieldDetail @register="fieldDetailRegister" />
  </div>
</template>
<script lang="ts">
  import { defineComponent, onMounted, ref, toRaw, computed } 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 RateModal from './RateModal.vue';
  import ExportModal from './ExportModal.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, orderDelete } from '/@/api/project/order';
  import { useOrderStoreWithOut } from '/@/store/modules/order';
  import { useUserStoreWithOut } from '/@/store/modules/user';
  import { ROLE } from './type.d';

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

  export default defineComponent({
    components: {
      HeaderCell,
      BasicTable,
      AAlert: Alert,
      TableAction,
      FormDetail,
      ProfitAnalysis,
      FormOutlined,
      CheckDetail,
      HistoryDetail,
      FieldDetail,
      RateModal,
      ExportModal,
    },
    setup() {
      const checkedKeys = ref<Array<string | number>>([]);
      const [profitModalRegister, { openModal: openProfitModal }] = useModal();
      const [rateModalRegister, { openModal: openRateModal }] = useModal();
      const [exportModalRegister, { openModal: openExportModal }] = 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 role = computed(() => {
        return user?.roleSmallVO?.code;
      });

      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() {
        const form = getForm();
        const values = form.getFieldsValue();
        openProfitModal(true, {
          data: checkedKeys.value,
          searchData: values,
        });
      }

      function handleRateModal() {
        const form = getForm();
        const values = form.getFieldsValue();

        openRateModal(true, {
          data: values,
        });
      }

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

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

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

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

      async function handleExportModal() {
        const form = getForm();
        const values = form.getFieldsValue();

        openExportModal(true, {
          data: values,
        });
      }

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

      async function handleDelete(id: string) {
        try {
          await orderDelete({ ids: [id] });
          reload();
        } catch (error) {
          console.log(error);
        }
      }

      return {
        user,
        SELECT_FIELD_COLUMNS,
        fieldDetailRegister,
        profitModalRegister,
        rateModalRegister,
        exportModalRegister,
        historyDetailRegister,
        formDetailRegister,
        handleProfitModal,
        registerTable,
        getFormValues,
        checkedKeys,
        onSelect,
        handleEdit,
        handleCheck,
        onSelectAll,
        tooltipVisible,
        handleFieldVisible,
        checkModalRegister,
        handleGoCheckDetail,
        handleGoFormDetail,
        handleHistory,
        handleAdd,
        createImgPreview,
        handleExportModal,
        handlePreview,
        handleFormSuccess,
        handleRateModal,
        openExportModal,
        handleDelete,
        role,
        ROLE,
      };
    },
  });
</script>

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

  .ant-table-cell img {
    width: 40px;
    height: 40px;
  }

  .order-page .vben-basic-table .ant-form-item .ant-picker {
    width: 100%;
  }

  .order-page .ant-table.ant-table-middle .ant-table-tbody > tr > td {
    padding-top: 0;
    padding-bottom: 0;
  }
</style>
./constant