diff --git a/src/App.vue b/src/App.vue index 11f579a..8a24ba0 100644 --- a/src/App.vue +++ b/src/App.vue @@ -49,5 +49,5 @@ const i18nLocale = computed(() => { return document.documentElement.lang === "zh-CN" ? zhCn : en; }); -if (isFunction(log.success)) log.success(__APP_INFO__.pkg.version, "欢迎使用 Teek Design Vue3 系统"); +if (isFunction(log.success)) log.success(__APP_INFO__.pkg.version, "欢迎使用牛安管理系统"); diff --git a/src/common/api/user.ts b/src/common/api/user.ts index 0745652..ab6c24e 100644 --- a/src/common/api/user.ts +++ b/src/common/api/user.ts @@ -21,7 +21,15 @@ export const UserService = { }, checkIsLogined() { - return get("/auth/user/me"); + return get("/open/check-login"); + }, + + /** + * 检测登录状态 + * 用于前端页面刷新后检测当前token是否有效 + */ + checkLogin() { + return get("/open/check-login"); }, // 获取用户信息 diff --git a/src/components/base/base-pageable-table/BasePageableTable.vue b/src/components/base/base-pageable-table/BasePageableTable.vue index 4d25672..c6ea3b7 100644 --- a/src/components/base/base-pageable-table/BasePageableTable.vue +++ b/src/components/base/base-pageable-table/BasePageableTable.vue @@ -21,6 +21,11 @@ const props = defineProps({ }); const emit = defineEmits(); const tableMainRef = ref | null>(null); +const tableHeaderEl = ref(null); +const tableMainHostEl = ref(null); +const headerBaseHeight = ref(0); +const headerExtraOffset = ref(0); +const tableMainHeight = ref(0); const page = ref(1); const pageSize = ref(30); const total = ref(0); @@ -62,6 +67,15 @@ const handleExpandChange = (row: any, expandedRows: any[]) => { emit("expand-change", row, expandedRows); }; +const recomputeTableHeight = () => { + if (!tableMainHostEl.value) return; + const top = tableMainHostEl.value.getBoundingClientRect().top; + // 预留一点底部空隙,避免贴边导致分页视觉上“出屏” + const paddingBottom = 12; + const h = Math.floor(window.innerHeight - top - paddingBottom); + tableMainHeight.value = Math.max(240, h); +}; + defineExpose({ reload: loadData, tableMainRef, @@ -73,31 +87,59 @@ defineExpose({ }, }); -onMounted(loadData); +onMounted(async () => { + await loadData(); + + await nextTick(); + if (tableHeaderEl.value) { + headerBaseHeight.value = tableHeaderEl.value.getBoundingClientRect().height; + } + recomputeTableHeight(); + + if (tableHeaderEl.value && "ResizeObserver" in window) { + const ro = new ResizeObserver(entries => { + const h = entries[0]?.contentRect?.height ?? 0; + headerExtraOffset.value = Math.max(0, Math.round(h - headerBaseHeight.value)); + // 表头换行会影响 TableMain 的 top,需要同步重算可用高度 + requestAnimationFrame(recomputeTableHeight); + }); + ro.observe(tableHeaderEl.value); + onBeforeUnmount(() => ro.disconnect()); + } + + window.addEventListener("resize", recomputeTableHeight); + onBeforeUnmount(() => window.removeEventListener("resize", recomputeTableHeight)); +}); diff --git a/src/views/production/finished-product-shipment/FinishedProductShipmentView.vue b/src/views/production/finished-product-shipment/FinishedProductShipmentView.vue index d609dbf..81f669a 100644 --- a/src/views/production/finished-product-shipment/FinishedProductShipmentView.vue +++ b/src/views/production/finished-product-shipment/FinishedProductShipmentView.vue @@ -6,11 +6,10 @@ import { usePage } from "@/composables/use-page"; import BaseFormWithTable from "@/components/base/base-form-with-table/BaseFormWithTable.vue"; import BaseItemDialog from "@/components/base/base-item-dialog/BaseItemDialog.vue"; import { $t } from "@/common/languages"; -import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from "element-plus"; +import { type FormInstance, type FormRules } from "element-plus"; import { formatDate } from "@/common/utils/format-utils"; import BaseSelect from "@/components/base/base-select/BaseSelect.vue"; import { generateDucumentNo } from "@/common/utils/document-no-generator/document-no-generator"; -import { get, post } from "@/common/http/request"; import { useStatus } from "@/common/languages/mapping/base-info-mapping"; import ExpandablePageableTable from "@/components/base/expandable-pageable-table/ExpandablePageableTable.vue"; import { type FieldMappingConfig } from "@/components/base/base-form-with-table/type"; @@ -87,7 +86,7 @@ const mappingConfig: FieldMappingConfig = { * 基本不变通用变量 */ const tableRef = ref | null>(null); -const { useAdd, useEdit, useRemove, useGeneralPageRef } = usePage(tableRef); +const { useAdd, useEdit, useRemove, useGeneralPageRef, useApprove, useReject } = usePage(tableRef); const { title, visible, formType, form, itemVisible, itemParentId } = useGeneralPageRef(); const warehouseSelectRef = ref>(); const { getFormStatusLabel } = useStatus(); @@ -162,35 +161,11 @@ const getFormStatusTagType = (code: number | null): string => { }; const approve = (row: any) => { - ElMessageBox.confirm($t("_message.production.finishedproductshipment.approve_confirm"), $t("_level.warning"), { - confirmButtonText: $t("_button.confirm"), - cancelButtonText: $t("_button.cancel"), - type: "warning", - }).then(async () => { - try { - await post(approveUrl, { id: row.id }); - ElMessage.success($t("_message.production.finishedproductshipment.approve_success")); - tableRef.value?.reload(); - } catch (err: any) { - ElMessage.error($t("_message.production.finishedproductshipment.approve_fail") + err); - } - }); + useApprove(approveUrl, row.id, "_message.production.finishedproductshipment.approve_confirm"); }; const reject = (row: any) => { - ElMessageBox.confirm($t("_message.production.finishedproductshipment.reject_confirm"), $t("_level.warning"), { - confirmButtonText: $t("_button.confirm"), - cancelButtonText: $t("_button.cancel"), - type: "warning", - }).then(async () => { - try { - await post(rejectUrl, { id: row.id }); - ElMessage.success($t("_message.production.finishedproductshipment.reject_success")); - tableRef.value?.reload(); - } catch (err: any) { - ElMessage.error($t("_message.production.finishedproductshipment.reject_fail") + err); - } - }); + useReject(rejectUrl, row.id, "_message.production.finishedproductshipment.reject_confirm"); }; const showItem = (row: any) => { diff --git a/src/views/sale/sale-order/SaleOrderView.vue b/src/views/sale/sale-order/SaleOrderView.vue index 946edb6..37a2b7c 100644 --- a/src/views/sale/sale-order/SaleOrderView.vue +++ b/src/views/sale/sale-order/SaleOrderView.vue @@ -5,11 +5,11 @@ import DefaultStatusSwitchColumn from "@/components/base/default-column/DefaultS import { usePage } from "@/composables/use-page"; import { $t } from "@/common/languages"; import { formatDate } from "@/common/utils/format-utils"; -import { ElMessage, type FormInstance, type FormRules } from "element-plus"; +import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from "element-plus"; import BaseFormWithTable from "@/components/base/base-form-with-table/BaseFormWithTable.vue"; import BaseItemDialog from "@/components/base/base-item-dialog/BaseItemDialog.vue"; import ExpandablePageableTable from "@/components/base/expandable-pageable-table/ExpandablePageableTable.vue"; -import { get } from "@/common/http/request"; +import { get, post } from "@/common/http/request"; import { type FieldMappingConfig } from "@/components/base/base-form-with-table/type"; import { useStatus } from "@/common/languages/mapping/base-info-mapping"; @@ -77,7 +77,7 @@ const getDetailUrl = "/sale/saleorder/getSaleOrderItemList"; * 基本不变通用变量 */ const tableRef = ref | null>(null); -const { useAdd, useEdit, useRemove, useGeneralPageRef, useApprove, useReject } = usePage(tableRef); +const { useAdd, useEdit, useRemove, useGeneralPageRef } = usePage(tableRef); const { title, visible, formType, form, itemVisible, itemParentId } = useGeneralPageRef(); const { getFormStatusLabel } = useStatus(); const baseFormWithTableRef = ref>(); @@ -156,11 +156,35 @@ const remove = (row: any) => { }; const approve = (row: any) => { - useApprove(approveUrl, row.id); + ElMessageBox.confirm($t("_message.sale.saleorder.approve_confirm"), $t("_level.warning"), { + confirmButtonText: $t("_button.confirm"), + cancelButtonText: $t("_button.cancel"), + type: "warning", + }).then(async () => { + try { + await post(approveUrl, { id: row.id }); + ElMessage.success($t("_message.sale.saleorder.approve_success")); + tableRef.value?.reload(); + } catch (err: any) { + ElMessage.error($t("_message.sale.saleorder.approve_fail") + err); + } + }); }; const reject = (row: any) => { - useReject(rejectUrl, row.id); + ElMessageBox.confirm($t("_message.sale.saleorder.reject_confirm"), $t("_level.warning"), { + confirmButtonText: $t("_button.confirm"), + cancelButtonText: $t("_button.cancel"), + type: "warning", + }).then(async () => { + try { + await post(rejectUrl, { id: row.id }); + ElMessage.success($t("_message.sale.saleorder.reject_success")); + tableRef.value?.reload(); + } catch (err: any) { + ElMessage.error($t("_message.sale.saleorder.reject_fail") + err); + } + }); }; const showItem = (row: any) => { @@ -212,10 +236,12 @@ const operateButtonClick = (eventName: string, row: any) => { }; const authShowFunc = (row: any, button: globalThis.ButtonProp) => { - if (row.formStatus === 1 && button.eventName === "approve") return false; - if (row.formStatus === 0 && button.eventName === "reject") return false; - if (row.formStatus === 1 && button.eventName === "edit") return false; - if (row.formStatus === 1 && button.eventName === "remove") return false; + // 已审核(status=1)时不显示审核按钮,显示反审按钮 + // 未审核(status=0)时显示审核按钮,不显示反审按钮 + if (row.status === 0 && button.eventName === "reject") return false; + if (row.status === 1 && button.eventName === "approve") return false; + // 已审核后不能编辑和删除 + if (row.status === 1 && (button.eventName === "edit" || button.eventName === "remove")) return false; return true; }; @@ -294,11 +320,9 @@ const getFormStatusTagType = (code: number | null): string => { @@ -322,7 +346,7 @@ const getFormStatusTagType = (code: number | null): string => { :base-title="$t('_title.sale.saleorder.baseTitle')" :table-title="$t('_title.sale.saleorder.tableTitle')" item-array-name="saleOrderItems" - upload-desc="销售明细" + :upload-desc="$t('_title.sale.saleorder.tableTitle')" :mapping-config="mappingConfig" >