gaoluyang
3 天以前 7a5c5250b66cc6faffbcac9e192073473c50f79f
src/views/erp/sale/order/index.vue
@@ -2,8 +2,8 @@
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { ErpSaleOrderApi } from '#/api/erp/sale/order';
import { ref } from 'vue';
import { useRouter } from 'vue-router';
import { onMounted, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart, isEmpty } from '@vben/utils';
@@ -16,20 +16,23 @@
  deleteSaleOrder,
  enableSaleOrder,
  exportSaleOrder,
  getSaleOrderApproveProcessList,
  getSaleOrderPage,
  updateSaleOrderStatus,
  submitSaleOrder,
} from '#/api/erp/sale/order';
import { generateFromSaleOrder } from '#/api/mes/wm/salesnotice';
import { $t } from '#/locales';
import { useGridColumns, useGridFormSchema } from './data';
import Form from './modules/form.vue';
import SaleOrderPrint from './modules/print.vue';
import SalesNoticeForm from '#/views/wls/salesnotice/modules/form.vue';
/** ERP 销售订单列表 */
defineOptions({ name: 'ErpSaleOrder' });
const router = useRouter();
const route = useRoute();
const [FormModal, formModalApi] = useVbenModal({
  connectedComponent: Form,
@@ -77,21 +80,34 @@
  }
}
/** 审批/反审批操作 */
async function handleUpdateStatus(
  row: ErpSaleOrderApi.SaleOrder,
  status: number,
) {
/** 提交销售订单审批(协同办公) */
async function handleSubmit(row: ErpSaleOrderApi.SaleOrder) {
  // 获取可用的审批流程定义
  const processList = await getSaleOrderApproveProcessList();
  if (isEmpty(processList)) {
    message.error('销售订单审批流程未配置,请先在「协同办公→流程管理」中创建并发布销售订单审批流程');
    return;
  }
  const hideLoading = message.loading({
    content: `确定${status === 20 ? '审批' : '反审批'}该订单吗?`,
    content: '正在提交审批...',
    duration: 0,
  });
  try {
    await updateSaleOrderStatus(row.id!, status);
    message.success(`${status === 20 ? '审批' : '反审批'}成功`);
    await submitSaleOrder(row.id!, processList[0].key);
    message.success('提交审批成功,请到协同办公中处理');
    handleRefresh();
  } finally {
    hideLoading();
  }
}
/** 查看审批进度(跳转协同办公流程详情,只读模式,不显示审批操作) */
function handleViewApproval(row: ErpSaleOrderApi.SaleOrder) {
  if (row.processInstanceId) {
    router.push({
      name: 'BpmProcessInstanceDetail',
      query: { id: row.processInstanceId, viewOnly: '1' },
    });
  }
}
@@ -139,6 +155,12 @@
  formModalApi.setData({ formType: 'detail', id: row.id }).open();
}
/** 打印/导出销售订单详情,供企业盖章留存 */
const printRef = ref<InstanceType<typeof SaleOrderPrint>>();
function handlePrint(row: ErpSaleOrderApi.SaleOrder) {
  printRef.value?.print(row.id!);
}
/** 查看关联合同 */
function handleViewContract(row: ErpSaleOrderApi.SaleOrder) {
  if (row.contractId) {
@@ -174,10 +196,19 @@
    proxyConfig: {
      ajax: {
        query: async ({ page }, formValues) => {
          // 生产状态搜索参数转换:-1(无需生产) → needProduction=0
          const { productionStatus, ...rest } = formValues;
          const params: Record<string, any> = { ...rest };
          if (productionStatus === -1) {
            params.needProduction = 0;
          } else if (productionStatus != null) {
            params.productionStatus = productionStatus;
            params.needProduction = 1;
          }
          return await getSaleOrderPage({
            pageNo: page.currentPage,
            pageSize: page.pageSize,
            ...formValues,
            ...params,
          });
        },
      },
@@ -196,12 +227,21 @@
    checkboxChange: handleRowCheckboxChange,
  },
});
/** 处理从合同跳转过来的查询参数 */
onMounted(() => {
  const orderId = route.query.id;
  if (orderId) {
    formModalApi.setData({ formType: 'detail', id: Number(orderId) }).open();
  }
});
</script>
<template>
  <Page auto-content-height>
    <FormModal @success="handleRefresh" />
    <SalesNoticeFormModal />
    <SaleOrderPrint ref="printRef" />
    <Grid table-title="销售订单列表">
      <template #toolbar-tools>
        <TableAction
@@ -252,8 +292,10 @@
        <span v-else>-</span>
      </template>
      <template #status="{ row }">
        <Tag v-if="row.status === 10" color="warning">未审核</Tag>
        <Tag v-if="row.status === 0" color="default">未提交</Tag>
        <Tag v-if="row.status === 15" color="processing">审批中</Tag>
        <Tag v-if="row.status === 20" color="success">已审核</Tag>
        <Tag v-if="row.status === 35" color="warning">已驳回</Tag>
        <Tag v-if="row.status === 30" color="error">已作废</Tag>
      </template>
      <template #needProduction="{ row }">
@@ -286,34 +328,38 @@
              onClick: handleDetail.bind(null, row),
            },
            {
              label: '打印',
              type: 'link',
              icon: 'lucide:printer',
              auth: ['erp:sale-order:query'],
              onClick: handlePrint.bind(null, row),
            },
            {
              label: $t('common.edit'),
              type: 'link',
              icon: ACTION_ICON.EDIT,
              auth: ['erp:sale-order:update'],
              ifShow: () => row.status === 10,
              ifShow: () => row.status === 0 || row.status === 35,
              onClick: handleEdit.bind(null, row),
            },
            {
              label: '审批',
              label: '提交审批',
              type: 'link',
              icon: ACTION_ICON.AUDIT,
              auth: ['erp:sale-order:update-status'],
              ifShow: () => row.status === 10,
              ifShow: () => row.status === 0 || row.status === 35,
              popConfirm: {
                title: `确认审批${row.no}吗?`,
                confirm: handleUpdateStatus.bind(null, row, 20),
                title: `确认提交${row.no}的审批吗?提交后审批将在协同办公中完成`,
                confirm: handleSubmit.bind(null, row),
              },
            },
            {
              label: '反审批',
              label: '审批进度',
              type: 'link',
              icon: ACTION_ICON.AUDIT,
              auth: ['erp:sale-order:update-status'],
              ifShow: () => row.status === 20,
              popConfirm: {
                title: `确认反审批${row.no}吗?`,
                confirm: handleUpdateStatus.bind(null, row, 10),
              },
              icon: 'lucide:file-clock',
              auth: ['erp:sale-order:query'],
              ifShow: () => row.status === 15 && !!row.processInstanceId,
              onClick: handleViewApproval.bind(null, row),
            },
            {
              label: '作废',
@@ -342,7 +388,7 @@
              type: 'link',
              icon: 'ant-design:file-protect-outlined',
              auth: ['mes:wm-sales-notice:create'],
              ifShow: () => row.status === 20 && row.canCreateSalesNotice,
              ifShow: () => row.status === 20 && !!row.canCreateSalesNotice,
              onClick: handleGenerateNotice.bind(null, row),
            },
            {
@@ -351,7 +397,7 @@
              danger: true,
              icon: ACTION_ICON.DELETE,
              auth: ['erp:sale-order:delete'],
              ifShow: () => row.status === 10,
              ifShow: () => row.status === 0 || row.status === 35,
              popConfirm: {
                title: $t('ui.actionMessage.deleteConfirm', [row.no]),
                confirm: handleDelete.bind(null, [row.id!]),