From 50e95b985a72fcec4a93a2470e9efdfb2620148a Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 02 四月 2026 15:46:09 +0800
Subject: [PATCH] #i18n
---
rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasPage.helpers.js | 52
rsf-design/src/views/basic-info/loc/locTable.columns.js | 41
rsf-design/src/views/system/ai-mcp-mount/index.vue | 84
rsf-design/src/views/basic-info/companys/index.vue | 60
rsf-design/src/views/orders/asn-order-item/asnOrderItemTable.columns.js | 47
rsf-design/src/views/orders/transfer-item/modules/transfer-item-detail-drawer.vue | 67
rsf-design/src/components/core/layouts/art-page-content/index.vue | 11
rsf-design/src/views/basic-info/loc-area/locAreaTable.columns.js | 29
rsf-design/src/views/orders/wave/modules/wave-detail-drawer.vue | 41
rsf-design/src/views/orders/asn-order/asnOrderPage.helpers.js | 47
rsf-design/src/views/manager/wave-rule/index.vue | 28
rsf-design/src/views/orders/transfer/index.vue | 21
rsf-design/src/views/orders/purchase/purchaseTable.columns.js | 13
rsf-design/src/views/orders/out-stock/index.vue | 153
rsf-design/src/views/system/operation-record/operationRecordPage.helpers.js | 35
rsf-design/src/views/orders/out-stock/outStockPage.helpers.js | 149
rsf-design/src/views/orders/asn-order-log/asnOrderLogTable.columns.js | 85
rsf-design/src/views/orders/wave-item/modules/wave-item-detail-drawer.vue | 35
rsf-design/src/views/orders/preparation/preparationPage.helpers.js | 18
rsf-design/src/views/orders/wave/waveTable.columns.js | 63
rsf-design/src/views/system/menu/menuPage.helpers.js | 18
rsf-design/src/views/system/ai-observe/index.vue | 81
rsf-design/src/views/basic-info/wh-mat/whMatPage.helpers.js | 88
rsf-design/src/views/manager/task-log/taskLogTable.columns.js | 31
rsf-design/src/views/manager/task-log/taskLogPage.helpers.js | 26
rsf-design/src/views/manager/in-statistic-item/inStatisticItemPage.helpers.js | 3
rsf-design/src/views/manager/task-log/index.vue | 30
rsf-design/src/views/system/config/index.vue | 34
rsf-design/src/views/system/ai-param/modules/ai-param-runtime-summary.vue | 26
rsf-design/src/views/manager/task-log/modules/task-log-detail-drawer.vue | 48
rsf-design/src/components/core/forms/art-drag-verify/index.vue | 10
rsf-design/src/views/basic-info/bas-container/basContainerTable.columns.js | 31
rsf-design/src/views/manager/menu-pda/menuPdaTable.columns.js | 19
rsf-design/src/views/manager/loc-item/locItemPage.helpers.js | 11
rsf-design/src/views/orders/transfer-item/transferItemTable.columns.js | 48
rsf-design/src/views/orders/asn-order/index.vue | 19
rsf-design/src/views/system/config/configPage.helpers.js | 36
rsf-design/src/views/basic-info/bas-station-area/modules/bas-station-area-dialog.vue | 14
rsf-design/src/views/manager/loc-item/modules/loc-item-detail-drawer.vue | 45
rsf-design/src/views/orders/wave-item/waveItemPage.helpers.js | 46
rsf-design/src/views/basic-info/matnr-group/matnrGroupTable.columns.js | 15
rsf-design/src/components/core/forms/art-excel-export/index.vue | 2
rsf-design/src/views/system/dict-type/dictTypeTable.columns.js | 30
rsf-design/src/views/basic-info/loc-area-rela/locAreaRelaTable.columns.js | 27
rsf-design/src/views/orders/wave-item/waveItemTable.columns.js | 61
rsf-design/src/views/system/config/modules/config-dialog.vue | 52
rsf-design/src/views/basic-info/device-site/deviceSiteTable.columns.js | 41
rsf-design/src/views/manager/loc-preview/index.vue | 46
rsf-design/src/views/manager/menu-pda/modules/menu-pda-dialog.vue | 85
rsf-design/src/views/orders/wave/modules/wave-public-task-dialog.vue | 19
rsf-design/src/views/basic-info/bas-station-area/basStationAreaTable.columns.js | 49
rsf-design/src/views/manager/wave-rule/modules/wave-rule-dialog.vue | 38
rsf-design/src/views/basic-info/task-path-template-merge/taskPathTemplateMergeTable.columns.js | 52
rsf-design/src/views/system/ai-observe/aiObserveTable.columns.js | 18
rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-mount-dialog.vue | 213
rsf-design/src/views/system/ai-observe/modules/ai-observe-detail-drawer.vue | 50
rsf-design/src/views/orders/out-stock-item/modules/out-stock-item-detail-drawer.vue | 76
rsf-design/src/views/orders/asn-order-item-log/asnOrderItemLogPage.helpers.js | 51
rsf-design/src/views/orders/wave-item/index.vue | 40
rsf-design/src/views/orders/asn-order-item/asnOrderItemPage.helpers.js | 149
rsf-design/src/views/system/dict-type/modules/dict-type-detail-drawer.vue | 26
rsf-design/src/components/core/banners/art-basic-banner/index.vue | 8
rsf-design/src/views/system/dept/deptTable.columns.js | 30
rsf-design/src/views/orders/transfer-item/transferItemPage.helpers.js | 50
rsf-design/src/views/system/ai-prompt/aiPromptPage.helpers.js | 28
rsf-design/src/views/orders/delivery-item/deliveryItemPage.helpers.js | 37
rsf-design/src/views/orders/transfer-item/index.vue | 122
rsf-design/src/views/manager/freeze/modules/freeze-detail-drawer.vue | 58
rsf-design/src/views/system/ai-param/aiParamPage.helpers.js | 46
rsf-design/src/views/system/ai-param/modules/ai-param-dialog.vue | 126
rsf-design/src/components/core/layouts/art-fast-enter/index.vue | 8
rsf-design/src/views/system/dict-type/index.vue | 37
rsf-design/src/views/basic-info/bas-station-area/basStationAreaPage.helpers.js | 126
rsf-design/src/views/basic-info/loc-type/locTypeTable.columns.js | 31
rsf-design/src/views/basic-info/wh-mat/index.vue | 60
rsf-design/src/views/basic-info/task-path-template/taskPathTemplateTable.columns.js | 53
rsf-design/src/views/basic-info/wh-mat/whMatTable.columns.js | 25
rsf-design/src/views/system/operation-record/operationRecordTable.columns.js | 27
rsf-design/src/views/orders/delivery-item/modules/delivery-item-detail-drawer.vue | 61
rsf-design/src/views/basic-info/loc-area-mat-rela/locAreaMatRelaTable.columns.js | 35
rsf-design/src/views/manager/loc-preview/locPreviewTable.columns.js | 25
rsf-design/src/views/manager/menu-pda/index.vue | 38
rsf-design/src/components/core/banners/art-card-banner/index.vue | 10
rsf-design/src/views/manager/wave-rule/waveRuleTable.columns.js | 15
rsf-design/src/views/system/ai-prompt/modules/ai-prompt-dialog.vue | 122
rsf-design/src/views/manager/menu-pda/menuPdaPage.helpers.js | 14
rsf-design/src/views/system/ai-prompt/index.vue | 74
rsf-design/src/views/manager/freeze/index.vue | 36
rsf-design/src/views/orders/delivery/deliveryPage.helpers.js | 73
rsf-design/src/views/system/config/modules/config-detail-drawer.vue | 30
rsf-design/src/views/system/user-login/index.vue | 50
rsf-design/src/views/orders/out-stock/modules/out-stock-detail-drawer.vue | 56
rsf-design/src/views/system/operation-record/index.vue | 58
rsf-design/src/views/basic-info/companys/companysTable.columns.js | 52
rsf-design/src/views/orders/out-stock-item/outStockItemTable.columns.js | 34
rsf-design/src/views/manager/freeze/freezeTable.columns.js | 29
rsf-design/src/views/orders/asn-order-item/modules/asn-order-item-detail-drawer.vue | 89
rsf-design/src/views/basic-info/wh-mat/modules/wh-mat-detail-drawer.vue | 76
rsf-design/src/views/basic-info/companys/modules/companys-dialog.vue | 74
rsf-design/src/components/core/layouts/art-notification/index.vue | 42
rsf-design/src/views/manager/loc-preview/locPreviewPage.helpers.js | 4
rsf-design/src/views/system/dict-type/dictTypePage.helpers.js | 12
rsf-design/src/views/manager/wave-rule/modules/wave-rule-detail-drawer.vue | 22
rsf-design/src/views/manager/in-statistic-item/modules/in-statistic-item-detail-drawer.vue | 60
rsf-design/src/locales/langs/en.json | 2398 ++++++++++++
rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-tools-drawer.vue | 101
rsf-design/src/views/system/ai-param/index.vue | 82
rsf-design/src/views/orders/wave/wavePage.helpers.js | 97
rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasTable.columns.js | 51
rsf-design/src/views/basic-info/warehouse/warehouseTable.columns.js | 31
rsf-design/src/views/manager/loc-item/index.vue | 54
rsf-design/src/views/basic-info/task-path-template-node/taskPathTemplateNodeTable.columns.js | 37
rsf-design/src/views/manager/wave-rule/waveRulePage.helpers.js | 6
rsf-design/src/views/basic-info/device-bind/deviceBindTable.columns.js | 37
rsf-design/src/views/manager/loc-item/locItemTable.columns.js | 45
rsf-design/src/components/core/media/art-cutter-img/index.vue | 18
rsf-design/src/views/system/ai-mcp-mount/aiMcpMountPage.helpers.js | 10
rsf-design/src/views/manager/in-statistic-item/inStatisticItemTable.columns.js | 31
rsf-design/src/views/orders/out-stock-item/outStockItemPage.helpers.js | 23
rsf-design/src/views/basic-info/warehouse-areas/index.vue | 58
rsf-design/src/views/orders/wave/index.vue | 115
rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-detail-drawer.vue | 48
rsf-design/src/views/stock/stock-transfer/stockTransferTable.columns.js | 7
rsf-design/src/views/manager/freeze/freezePage.helpers.js | 4
rsf-design/src/views/basic-info/contract/contractTable.columns.js | 29
rsf-design/src/views/orders/transfer/transferPage.helpers.js | 79
rsf-design/src/views/orders/asn-order-item-log/index.vue | 42
rsf-design/src/views/orders/delivery/index.vue | 16
rsf-design/src/components/core/layouts/art-screen-lock/index.vue | 32
rsf-design/src/views/orders/delivery-item/deliveryItemTable.columns.js | 41
rsf-design/src/views/system/menu/index.vue | 3
rsf-design/src/views/system/dept/modules/dept-dialog.vue | 42
rsf-design/src/views/system/dict-type/modules/dict-type-dialog.vue | 38
rsf-design/src/views/system/menu/menuTable.columns.js | 33
rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-dialog.vue | 78
rsf-design/src/views/system/config/configTable.columns.js | 29
rsf-design/src/views/system/dept/index.vue | 44
rsf-design/src/views/system/ai-observe/aiObservePage.helpers.js | 46
rsf-design/src/utils/sys/upgrade.js | 7
rsf-design/src/locales/langs/zh.json | 2398 ++++++++++++
rsf-design/src/views/orders/out-stock-item/index.vue | 65
rsf-design/src/views/basic-info/companys/modules/companys-detail-drawer.vue | 46
rsf-design/src/views/system/dept/deptPage.helpers.js | 3
rsf-design/src/views/orders/out-stock/outStockTable.columns.js | 36
rsf-design/src/views/basic-info/bas-station/basStationTable.columns.js | 45
rsf-design/src/views/basic-info/bas-station-area/index.vue | 17
rsf-design/src/views/manager/loc-preview/modules/loc-preview-detail-drawer.vue | 26
rsf-design/src/views/basic-info/companys/companysPage.helpers.js | 21
rsf-design/src/views/orders/delivery-item/index.vue | 46
rsf-design/src/views/manager/in-statistic-item/index.vue | 20
rsf-design/src/views/orders/asn-order-item/index.vue | 95
rsf-design/src/views/system/operation-record/modules/operation-record-detail-drawer.vue | 32
rsf-design/src/views/basic-info/loc-area-mat/locAreaMatTable.columns.js | 32
153 files changed, 8,627 insertions(+), 3,013 deletions(-)
diff --git a/rsf-design/src/components/core/banners/art-basic-banner/index.vue b/rsf-design/src/components/core/banners/art-basic-banner/index.vue
index e38ea6e..129ef26 100644
--- a/rsf-design/src/components/core/banners/art-basic-banner/index.vue
+++ b/rsf-design/src/components/core/banners/art-basic-banner/index.vue
@@ -46,7 +46,7 @@
}"
@click.stop="emit('buttonClick')"
>
- {{ buttonConfig?.text }}
+ {{ buttonConfig?.text || t('components.banner.basic.view') }}
</div>
</slot>
@@ -60,7 +60,7 @@
:src="imageConfig.src"
:style="{ width: imageConfig.width, bottom: imageConfig.bottom, right: imageConfig.right }"
loading="lazy"
- alt="鑳屾櫙鍥剧墖"
+ :alt="t('components.banner.basic.backgroundAlt')"
/>
</div>
</div>
@@ -68,10 +68,12 @@
<script setup>
import { onMounted, ref, computed } from 'vue'
+ import { useI18n } from 'vue-i18n'
import { useSettingStore } from '@/store/modules/setting'
const settingStore = useSettingStore()
const { isDark } = storeToRefs(settingStore)
defineOptions({ name: 'ArtBasicBanner' })
+ const { t } = useI18n()
const props = defineProps({
height: { required: false, default: '11rem' },
title: { required: false, default: '' },
@@ -84,7 +86,7 @@
required: false,
default: () => ({
show: true,
- text: '鏌ョ湅',
+ text: '',
color: '#fff',
textColor: '#333',
radius: '6px'
diff --git a/rsf-design/src/components/core/banners/art-card-banner/index.vue b/rsf-design/src/components/core/banners/art-card-banner/index.vue
index 0e16579..b920a40 100644
--- a/rsf-design/src/components/core/banners/art-card-banner/index.vue
+++ b/rsf-design/src/components/core/banners/art-card-banner/index.vue
@@ -19,7 +19,7 @@
}"
@click="handleCancel"
>
- {{ cancelButton?.text }}
+ {{ cancelButton?.text || t('components.banner.card.cancel') }}
</div>
<div
v-if="button?.show"
@@ -27,7 +27,7 @@
:style="{ backgroundColor: button?.color, color: button?.textColor }"
@click="handleClick"
>
- {{ button?.text }}
+ {{ button?.text || t('components.banner.card.viewDetails') }}
</div>
</div>
</div>
@@ -36,7 +36,9 @@
<script setup>
import defaultIcon from '@imgs/3d/icon1.webp'
+ import { useI18n } from 'vue-i18n'
defineOptions({ name: 'ArtCardBanner' })
+ const { t } = useI18n()
defineProps({
height: { required: false, default: '24rem' },
image: { required: false, default: defaultIcon },
@@ -46,7 +48,7 @@
required: false,
default: () => ({
show: true,
- text: '鏌ョ湅璇︽儏',
+ text: '',
color: 'var(--theme-color)',
textColor: '#fff'
})
@@ -55,7 +57,7 @@
required: false,
default: () => ({
show: false,
- text: '鍙栨秷',
+ text: '',
color: '#f5f5f5',
textColor: '#666'
})
diff --git a/rsf-design/src/components/core/forms/art-drag-verify/index.vue b/rsf-design/src/components/core/forms/art-drag-verify/index.vue
index db85563..aa974bc 100644
--- a/rsf-design/src/components/core/forms/art-drag-verify/index.vue
+++ b/rsf-design/src/components/core/forms/art-drag-verify/index.vue
@@ -41,14 +41,16 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
defineOptions({ name: 'ArtDragVerify' })
+ const { t } = useI18n()
const emit = defineEmits(['handlerMove', 'update:value', 'passCallback'])
const props = defineProps({
value: { required: false, default: false },
width: { required: false, default: '100%' },
height: { required: false, default: 40 },
- text: { required: false, default: '鎸変綇婊戝潡鎷栧姩' },
- successText: { required: false, default: 'success' },
+ text: { required: false, default: '' },
+ successText: { required: false, default: '' },
background: { required: false, default: '#eee' },
progressBarBg: { required: false, default: '#1385FF' },
completedBg: { required: false, default: '#57D187' },
@@ -134,7 +136,9 @@
fontSize: props.textSize
}))
const message = computed(() => {
- return props.value ? props.successText : props.text
+ const dragText = props.text || t('components.dragVerify.dragText')
+ const successText = props.successText || t('components.dragVerify.successText')
+ return props.value ? successText : dragText
})
const dragStart = (e) => {
if (!props.value) {
diff --git a/rsf-design/src/components/core/forms/art-excel-export/index.vue b/rsf-design/src/components/core/forms/art-excel-export/index.vue
index ea1d955..6fbe99a 100644
--- a/rsf-design/src/components/core/forms/art-excel-export/index.vue
+++ b/rsf-design/src/components/core/forms/art-excel-export/index.vue
@@ -206,7 +206,7 @@
duration: 5e3
})
}
- console.error('Excel 瀵煎嚭閿欒:', exportError)
+ console.error(t('message.exportExcelFailed', { message: String(exportError) }))
} finally {
isExporting.value = false
emit('export-progress', 0)
diff --git a/rsf-design/src/components/core/layouts/art-fast-enter/index.vue b/rsf-design/src/components/core/layouts/art-fast-enter/index.vue
index 5272af7..ef1fe0d 100644
--- a/rsf-design/src/components/core/layouts/art-fast-enter/index.vue
+++ b/rsf-design/src/components/core/layouts/art-fast-enter/index.vue
@@ -45,7 +45,9 @@
</div>
<div class="border-l-d pl-6 pt-2">
- <h3 class="mb-2.5 text-base font-medium text-g-800">蹇�熼摼鎺�</h3>
+ <h3 class="mb-2.5 text-base font-medium text-g-800">
+ {{ t('components.fastEnter.quickLinks') }}
+ </h3>
<ul>
<li
v-for="quickLink in enabledQuickLinks"
@@ -63,14 +65,16 @@
<script setup>
import { useFastEnter } from '@/hooks/core/useFastEnter'
+ import { useI18n } from 'vue-i18n'
defineOptions({ name: 'ArtFastEnter' })
+ const { t } = useI18n()
const router = useRouter()
const popoverRef = ref()
const { enabledApplications, enabledQuickLinks } = useFastEnter()
const handleNavigate = (routeName, link) => {
const targetPath = routeName || link
if (!targetPath) {
- console.warn('瀵艰埅閰嶇疆鏃犳晥锛氱己灏戣矾鐢卞悕绉版垨閾炬帴')
+ console.warn(t('components.fastEnter.invalidNavigation'))
return
}
if (targetPath.startsWith('http')) {
diff --git a/rsf-design/src/components/core/layouts/art-notification/index.vue b/rsf-design/src/components/core/layouts/art-notification/index.vue
index fdcdec0..5b86b4a 100644
--- a/rsf-design/src/components/core/layouts/art-notification/index.vue
+++ b/rsf-design/src/components/core/layouts/art-notification/index.vue
@@ -86,7 +86,7 @@
>
<ArtSvgIcon icon="system-uicons:inbox" class="text-5xl" />
<p class="mt-3.5 text-xs !bg-transparent"
- >{{ $t('notice.text[0]') }}{{ barList[barActiveIndex].name }}</p
+ >{{ $t('notice.emptyPrefix') }}{{ barList[barActiveIndex].name }}</p
>
</div>
</div>
@@ -121,66 +121,66 @@
const visible = ref(false)
const barActiveIndex = ref(0)
const useNotificationData = () => {
- const noticeList2 = ref([
+ const noticeList2 = computed(() => [
{
- title: '鏂板鍥介檯鍖�',
+ title: t('notice.samples.notice.addI18n'),
time: '2024-6-13 0:10',
type: 'notice'
},
{
- title: '鍐锋湀鍛嗗憜缁欎綘鍙戜簡涓�鏉℃秷鎭�',
+ title: t('notice.samples.notice.receiveMessage'),
time: '2024-4-21 8:05',
type: 'message'
},
{
- title: '灏忚偉鐚叧娉ㄤ簡浣�',
+ title: t('notice.samples.notice.newFollower'),
time: '2020-3-17 21:12',
type: 'collection'
},
{
- title: '鏂板浣跨敤鏂囨。',
+ title: t('notice.samples.notice.addDocs'),
time: '2024-02-14 0:20',
type: 'notice'
},
{
- title: '灏忚偉鐚粰浣犲彂浜嗕竴灏侀偖浠�',
+ title: t('notice.samples.notice.receiveMail'),
time: '2024-1-20 0:15',
type: 'email'
},
{
- title: '鑿滃崟mock鏈湴鐪熷疄鏁版嵁',
+ title: t('notice.samples.notice.menuMock'),
time: '2024-1-17 22:06',
type: 'notice'
}
])
- const msgList2 = ref([
+ const msgList2 = computed(() => [
{
- title: '姹犱笉鑳� 鍏虫敞浜嗕綘',
+ title: t('notice.samples.message.chibupang'),
time: '2021-2-26 23:50',
avatar: avatar1
},
{
- title: '鍞愪笉鑻� 鍏虫敞浜嗕綘',
+ title: t('notice.samples.message.tangbuku'),
time: '2021-2-21 8:05',
avatar: avatar2
},
{
- title: '涓皬楸� 鍏虫敞浜嗕綘',
+ title: t('notice.samples.message.zhongxiaoyu'),
time: '2020-1-17 21:12',
avatar: avatar3
},
{
- title: '浣曞皬鑽� 鍏虫敞浜嗕綘',
+ title: t('notice.samples.message.hexiaohe'),
time: '2021-01-14 0:20',
avatar: avatar4
},
{
- title: '瑾惰娣� 鍏虫敞浜嗕綘',
+ title: t('notice.samples.message.suixuinian'),
time: '2020-12-20 0:15',
avatar: avatar5
},
{
- title: '鍐锋湀鍛嗗憜 鍏虫敞浜嗕綘',
+ title: t('notice.samples.message.lengyuedaidai'),
time: '2020-12-17 22:06',
avatar: avatar6
}
@@ -188,15 +188,15 @@
const pendingList2 = ref([])
const barList2 = computed(() => [
{
- name: computed(() => t('notice.bar[0]')),
+ name: computed(() => t('notice.bar.notice')),
num: noticeList2.value.length
},
{
- name: computed(() => t('notice.bar[1]')),
+ name: computed(() => t('notice.bar.message')),
num: msgList2.value.length
},
{
- name: computed(() => t('notice.bar[2]')),
+ name: computed(() => t('notice.bar.todo')),
num: pendingList2.value.length
}
])
@@ -286,13 +286,13 @@
}
const useBusinessLogic = () => {
const handleNoticeAll2 = () => {
- console.log('鏌ョ湅鍏ㄩ儴閫氱煡')
+ console.log(t('notice.actions.viewAllNotice'))
}
const handleMsgAll2 = () => {
- console.log('鏌ョ湅鍏ㄩ儴娑堟伅')
+ console.log(t('notice.actions.viewAllMessage'))
}
const handlePendingAll2 = () => {
- console.log('鏌ョ湅鍏ㄩ儴寰呭姙')
+ console.log(t('notice.actions.viewAllTodo'))
}
return {
handleNoticeAll: handleNoticeAll2,
diff --git a/rsf-design/src/components/core/layouts/art-page-content/index.vue b/rsf-design/src/components/core/layouts/art-page-content/index.vue
index 5c1c4c3..b6c9e1a 100644
--- a/rsf-design/src/components/core/layouts/art-page-content/index.vue
+++ b/rsf-design/src/components/core/layouts/art-page-content/index.vue
@@ -16,9 +16,11 @@
<div v-if="routeRenderError" class="art-page-view art-route-state">
<div class="art-route-state__panel">
- <div class="art-route-state__title">椤甸潰鍔犺浇澶辫触</div>
+ <div class="art-route-state__title">{{ t('message.routeRenderFailedTitle') }}</div>
<div class="art-route-state__desc">{{ routeRenderError }}</div>
- <ElButton type="primary" @click="reloadCurrentRoute">閲嶆柊鍔犺浇</ElButton>
+ <ElButton type="primary" @click="reloadCurrentRoute">
+ {{ t('common.actions.reload') }}
+ </ElButton>
</div>
</div>
@@ -51,10 +53,12 @@
</template>
<script setup>
import { useRoute } from 'vue-router'
+ import { useI18n } from 'vue-i18n'
import { useAutoLayoutHeight } from '@/hooks/core/useLayoutHeight'
import { useSettingStore } from '@/store/modules/setting'
import { useWorktabStore } from '@/store/modules/worktab'
defineOptions({ name: 'ArtPageContent' })
+ const { t } = useI18n()
const route = useRoute()
const { containerMinHeight } = useAutoLayoutHeight()
const { pageTransition, containerWidth, refresh } = storeToRefs(useSettingStore())
@@ -118,7 +122,8 @@
}
)
onErrorCaptured((error) => {
- routeRenderError.value = error instanceof Error ? error.message : String(error || '椤甸潰娓叉煋寮傚父')
+ routeRenderError.value =
+ error instanceof Error ? error.message : String(error || t('message.routeRenderFailed'))
return false
})
onMounted(() => {
diff --git a/rsf-design/src/components/core/layouts/art-screen-lock/index.vue b/rsf-design/src/components/core/layouts/art-screen-lock/index.vue
index 679c80e..2522cae 100644
--- a/rsf-design/src/components/core/layouts/art-screen-lock/index.vue
+++ b/rsf-design/src/components/core/layouts/art-screen-lock/index.vue
@@ -6,14 +6,16 @@
v-if="showDevToolsWarning"
class="fixed top-0 left-0 z-[999999] flex-cc w-full h-full text-white bg-gradient-to-br from-[#1e1e1e] to-black animate-fade-in"
>
- <div class="p-5 text-center select-none">
+ <div class="p-5 text-center select-none">
<div class="mb-7.5 text-5xl">馃敀</div>
- <h1 class="m-0 mb-5 text-3xl font-semibold text-danger">绯荤粺宸查攣瀹�</h1>
+ <h1 class="m-0 mb-5 text-3xl font-semibold text-danger">
+ {{ $t('lockScreen.devTools.title') }}
+ </h1>
<p class="max-w-125 m-0 text-lg leading-relaxed text-white">
- 妫�娴嬪埌寮�鍙戣�呭伐鍏峰凡鎵撳紑<br />
- 涓轰簡绯荤粺瀹夊叏锛岃鍏抽棴寮�鍙戣�呭伐鍏峰悗缁х画浣跨敤
+ {{ $t('lockScreen.devTools.descriptionLine1') }}<br />
+ {{ $t('lockScreen.devTools.descriptionLine2') }}
</p>
- <div class="mt-7.5 text-sm text-gray-400">Security Lock Activated</div>
+ <div class="mt-7.5 text-sm text-gray-400">{{ $t('lockScreen.devTools.footer') }}</div>
</div>
</div>
@@ -21,7 +23,11 @@
<div v-if="!isLock">
<ElDialog v-model="visible" :width="370" :show-close="false" @open="handleDialogOpen">
<div class="flex-c flex-col">
- <img class="w-16 h-16 rounded-full" src="@imgs/user/avatar.webp" alt="鐢ㄦ埛澶村儚" />
+ <img
+ class="w-16 h-16 rounded-full"
+ src="@imgs/user/avatar.webp"
+ :alt="$t('lockScreen.avatarAlt')"
+ />
<div class="mt-7.5 mb-3.5 text-base font-medium">{{ userInfo.userName }}</div>
<ElForm
ref="formRef"
@@ -59,7 +65,11 @@
<!-- 瑙i攣鐣岄潰 -->
<div v-else class="unlock-content">
<div class="flex-c flex-col w-80">
- <img class="w-16 h-16 mt-5 rounded-full" src="@imgs/user/avatar.webp" alt="鐢ㄦ埛澶村儚" />
+ <img
+ class="w-16 h-16 mt-5 rounded-full"
+ src="@imgs/user/avatar.webp"
+ :alt="$t('lockScreen.avatarAlt')"
+ />
<div class="mt-3 mb-3.5 text-base font-medium">
{{ userInfo.userName }}
</div>
@@ -269,7 +279,7 @@
)
return inputPassword === decryptedPassword
} catch (error) {
- console.error('瀵嗙爜瑙e瘑澶辫触:', error)
+ console.error(t('lockScreen.errors.decryptFailed'), error)
return false
}
}
@@ -294,7 +304,7 @@
visible.value = false
formData.password = ''
} else {
- console.error('琛ㄥ崟楠岃瘉澶辫触:', fields)
+ console.error(t('lockScreen.errors.validationFailed'), fields)
}
})
}
@@ -311,7 +321,7 @@
visible.value = false
showDevToolsWarning.value = false
} catch (error) {
- console.error('鏇存柊store澶辫触:', error)
+ console.error(t('lockScreen.errors.updateStoreFailed'), error)
}
} else {
const inputElement = unlockInputRef.value?.$el
@@ -325,7 +335,7 @@
unlockForm.password = ''
}
} else {
- console.error('琛ㄥ崟楠岃瘉澶辫触:', fields)
+ console.error(t('lockScreen.errors.validationFailed'), fields)
}
})
}
diff --git a/rsf-design/src/components/core/media/art-cutter-img/index.vue b/rsf-design/src/components/core/media/art-cutter-img/index.vue
index f7f613d..a3b10d1 100644
--- a/rsf-design/src/components/core/media/art-cutter-img/index.vue
+++ b/rsf-design/src/components/core/media/art-cutter-img/index.vue
@@ -14,10 +14,10 @@
class="img-cutter"
>
<template #choose>
- <ElButton type="primary" plain v-ripple>閫夋嫨鍥剧墖</ElButton>
+ <ElButton type="primary" plain v-ripple>{{ t('components.cropper.chooseImage') }}</ElButton>
</template>
<template #cancel>
- <ElButton type="danger" plain v-ripple>娓呴櫎</ElButton>
+ <ElButton type="danger" plain v-ripple>{{ t('components.cropper.clearImage') }}</ElButton>
</template>
<template #confirm>
<!-- <ElButton type="primary" style="margin-left: 10px">纭畾</ElButton> -->
@@ -35,10 +35,10 @@
height: `${cutterProps.cutHeight}px`
}"
>
- <img class="preview-img" :src="temImgPath" alt="棰勮鍥�" v-if="temImgPath" />
+ <img class="preview-img" :src="temImgPath" :alt="t('components.cropper.previewAlt')" v-if="temImgPath" />
</div>
<ElButton class="download-btn" @click="downloadImg" :disabled="!temImgPath" v-ripple
- >涓嬭浇鍥剧墖</ElButton
+ >{{ t('components.cropper.downloadImage') }}</ElButton
>
</div>
</div>
@@ -46,8 +46,10 @@
<script setup>
import ImgCutter from 'vue-img-cutter'
+ import { useI18n } from 'vue-i18n'
defineOptions({ name: 'ArtCutterImg' })
+ const { t } = useI18n()
const props = defineProps({
isModal: { required: false, default: false },
tool: { required: false, default: true },
@@ -96,12 +98,12 @@
try {
await preloadImage(props.imgUrl)
imgCutterModal.value?.handleOpen({
- name: '灏侀潰鍥剧墖',
+ name: t('components.cropper.coverImage'),
src: props.imgUrl
})
} catch (error) {
emit('error', error)
- console.error('鍥剧墖鍔犺浇澶辫触:', error)
+ console.error(t('components.cropper.imageLoadFailed'), error)
}
}
}
@@ -137,10 +139,10 @@
temImgPath.value = ''
}
function downloadImg() {
- console.log('涓嬭浇鍥剧墖')
+ console.log(t('components.cropper.downloadLog'))
const a = document.createElement('a')
a.href = temImgPath.value
- a.download = 'image.png'
+ a.download = t('components.cropper.fileName')
a.click()
}
</script>
diff --git a/rsf-design/src/locales/langs/en.json b/rsf-design/src/locales/langs/en.json
index a34ec06..571d9c3 100644
--- a/rsf-design/src/locales/langs/en.json
+++ b/rsf-design/src/locales/langs/en.json
@@ -36,6 +36,7 @@
"tips": "Prompt",
"cancel": "Cancel",
"confirm": "Confirm",
+ "close": "Close",
"logOutTips": "Do you want to log out?",
"count": "{count} items",
"listSeparator": ", ",
@@ -43,6 +44,7 @@
"search": "Search",
"reset": "Reset",
"refresh": "Refresh",
+ "reload": "Reload",
"add": "Add",
"batchDelete": "Batch Delete",
"edit": "Edit",
@@ -58,7 +60,8 @@
"collapse": "Collapse",
"viewAll": "View All",
"save": "Save",
- "submit": "Submit"
+ "submit": "Submit",
+ "initialize": "Initialize"
},
"status": {
"enabled": "Enabled",
@@ -113,6 +116,18 @@
"index": "No.",
"unit": "Unit",
"id": "ID",
+ "name": "Name",
+ "code": "Code",
+ "status": "Status",
+ "memo": "Remark",
+ "createBy": "Created By",
+ "createTime": "Created At",
+ "updateBy": "Updated By",
+ "updateTime": "Updated At",
+ "sort": "Sort",
+ "route": "Route",
+ "authority": "Authority",
+ "operation": "Operation",
"wcs": "WCS",
"source": "Source",
"supplier": "Supplier",
@@ -207,15 +222,66 @@
"notice": {
"title": "Notice",
"btnRead": "Mark as read",
- "bar": [
- "Notice",
- "Message",
- "Todo"
- ],
- "text": [
- "No"
- ],
- "viewAll": "View all"
+ "bar": {
+ "notice": "Notice",
+ "message": "Message",
+ "todo": "Todo"
+ },
+ "emptyPrefix": "No",
+ "viewAll": "View all",
+ "actions": {
+ "viewAllNotice": "View all notice",
+ "viewAllMessage": "View all message",
+ "viewAllTodo": "View all todo"
+ },
+ "samples": {
+ "notice": {
+ "addI18n": "Internationalization added",
+ "receiveMessage": "Lengyuedaidai sent you a message",
+ "newFollower": "Xiaofeizhu followed you",
+ "addDocs": "Usage documentation added",
+ "receiveMail": "Xiaofeizhu sent you an email",
+ "menuMock": "Menu mock switched to local real data"
+ },
+ "message": {
+ "chibupang": "Chibupang followed you",
+ "tangbuku": "Tangbuku followed you",
+ "zhongxiaoyu": "Zhongxiaoyu followed you",
+ "hexiaohe": "Hexiaohe followed you",
+ "suixuinian": "Suixuinian followed you",
+ "lengyuedaidai": "Lengyuedaidai followed you"
+ }
+ }
+ },
+ "components": {
+ "fastEnter": {
+ "quickLinks": "Quick Links",
+ "invalidNavigation": "Invalid navigation config: missing route name or link"
+ },
+ "dragVerify": {
+ "dragText": "Hold the slider and drag",
+ "successText": "Verified"
+ },
+ "banner": {
+ "card": {
+ "viewDetails": "View Details",
+ "cancel": "Cancel"
+ },
+ "basic": {
+ "view": "View",
+ "backgroundAlt": "Background Image"
+ }
+ },
+ "cropper": {
+ "chooseImage": "Choose Image",
+ "clearImage": "Clear",
+ "previewAlt": "Preview Image",
+ "downloadImage": "Download Image",
+ "coverImage": "Cover Image",
+ "imageLoadFailed": "Image load failed:",
+ "downloadLog": "Download image",
+ "fileName": "image.png"
+ }
},
"worktab": {
"btn": {
@@ -287,6 +353,18 @@
},
"lockScreen": {
"pwdError": "Password error",
+ "avatarAlt": "User avatar",
+ "devTools": {
+ "title": "System Locked",
+ "descriptionLine1": "Developer tools have been detected as open",
+ "descriptionLine2": "For system security, please close developer tools before continuing",
+ "footer": "Security Lock Activated"
+ },
+ "errors": {
+ "decryptFailed": "Password decryption failed:",
+ "validationFailed": "Form validation failed:",
+ "updateStoreFailed": "Store update failed:"
+ },
"lock": {
"inputPlaceholder": "Please input lock screen password",
"btnText": "Lock"
@@ -467,7 +545,8 @@
"subsystemFlowTemplate": "SubsystemFlowTemplate",
"flowStepTemplate": "FlowStepTemplate",
"taskPathTemplateMerge": "TaskPathTemplateMerge",
- "missionFlowStepInstance": "Mission Flow Steps"
+ "missionFlowStepInstance": "Mission Flow Steps",
+ "aiManagementCenter": "AI Management Center"
},
"ai": {
"drawer": {
@@ -582,13 +661,18 @@
},
"index": "Index",
"id": "ID",
+ "name": "Name",
+ "code": "Code",
+ "keyword": "Keyword",
"operation": "Operation",
"status": "Status",
"type": "Type",
"source": "Source",
"supplier": "Supplier",
"supplierBatch": "Supplier Batch",
+ "memo": "Remark",
"remark": "Remark",
+ "createBy": "Created By",
"updateBy": "Updated By",
"updateTime": "Updated At",
"createTime": "Created At",
@@ -613,6 +697,11 @@
"requestTimeoutStopped": "Request timed out and waiting has stopped",
"exportTimeoutStopped": "Export request timed out and waiting has stopped",
"printTimeoutStopped": "Print data loading timed out and waiting has stopped",
+ "routeRenderFailedTitle": "Page failed to load",
+ "routeRenderFailed": "The page failed to render. Please try again later.",
+ "systemUpgradeTitle": "System Upgrade Notice",
+ "systemUpgradeIntro": "The system has been upgraded to version {version}. Please review the following updates:",
+ "systemUpgradeRelogin": "This upgrade requires you to sign in again to apply the latest changes.",
"exportInvalidDataType": "Data must be an array",
"exportNoData": "No data available for export",
"exportExceedMaxRows": "Row count exceeds the limit ({maxRows} rows)",
@@ -626,7 +715,321 @@
"exportWorkbookComments": "Generated automatically by the system"
},
"pages": {
- "system": {
+ "systemDraft": {
+ "aiParam": {
+ "title": "AI Params",
+ "subtitle": "Manage model connection parameters and default settings with cards.",
+ "entity": "AI parameter",
+ "reportTitle": "AI Parameter Report",
+ "empty": "No AI parameters",
+ "buttons": {
+ "add": "Add Parameter"
+ },
+ "actions": {
+ "setDefault": "Set Default"
+ },
+ "fields": {
+ "baseUrl": "Base URL",
+ "lastValidateTime": "Last Validation",
+ "timeoutMs": "Timeout",
+ "streamingEnabled": "Streaming",
+ "maxTokens": "Max Tokens"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter parameter name",
+ "providerType": "Provider",
+ "providerTypePlaceholder": "Enter provider type",
+ "model": "Model",
+ "modelPlaceholder": "Enter model name",
+ "status": "Default Status"
+ },
+ "status": {
+ "default": "Default",
+ "candidate": "Candidate"
+ },
+ "validation": {
+ "valid": "Validated",
+ "invalid": "Invalid",
+ "notTested": "Not Tested"
+ },
+ "streaming": {
+ "enabled": "Streaming",
+ "disabled": "Non-streaming"
+ },
+ "table": {
+ "name": "Name",
+ "providerType": "Provider Type",
+ "model": "Model",
+ "status": "Default Status",
+ "validateStatus": "Validation Status",
+ "timeoutMs": "Timeout"
+ },
+ "summary": {
+ "title": "Runtime Summary",
+ "subtitle": "Overview of the active model, prompt and MCP mounts.",
+ "refresh": "Refresh Summary",
+ "activeModel": "Active Model",
+ "activePrompt": "Active Prompt",
+ "lastPromptUpdate": "Last updated {value}",
+ "enabledMcp": "Enabled MCP",
+ "enabledMcpCount": "{count}",
+ "noMcp": "No mounts"
+ },
+ "dialog": {
+ "titleCreate": "Create AI Param",
+ "titleEdit": "Edit AI Param",
+ "titleDetail": "AI Param Detail",
+ "runtimeTitle": "Runtime Status",
+ "runtimeDescription": "Run draft validation before saving. Runtime status comes from the backend.",
+ "validateDraft": "Validate Draft",
+ "labels": {
+ "validateStatus": "Validation Status",
+ "lastValidateElapsedMs": "Last Validation Elapsed",
+ "lastValidateTime": "Last Validation Time",
+ "updateBy": "Updated By",
+ "updateTime": "Updated At",
+ "lastValidateMessage": "Last Validation Message",
+ "name": "Parameter Name",
+ "providerType": "Provider Type",
+ "baseUrl": "Base URL",
+ "apiKey": "API Key",
+ "model": "Model",
+ "temperature": "Temperature",
+ "topP": "Top P",
+ "maxTokens": "Max Tokens",
+ "timeoutMs": "Timeout (ms)",
+ "streamingEnabled": "Streaming",
+ "status": "Default Status",
+ "memo": "Remark"
+ },
+ "placeholders": {
+ "name": "Enter parameter name",
+ "providerType": "Select provider type",
+ "baseUrl": "Enter an OpenAI-compatible base URL",
+ "apiKey": "Enter API key",
+ "model": "Enter model name",
+ "temperature": "Enter temperature",
+ "topP": "Enter topP",
+ "maxTokens": "Enter max token count",
+ "timeoutMs": "Enter timeout",
+ "status": "Select default status",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "name": "Please enter a parameter name",
+ "providerType": "Please select a provider type",
+ "baseUrl": "Please enter a base URL",
+ "apiKey": "Please enter an API key",
+ "model": "Please enter a model name"
+ }
+ },
+ "messages": {
+ "setDefaultSuccess": "Default parameter updated",
+ "summaryTimeout": "Runtime summary timed out and waiting has stopped",
+ "summaryUnavailable": "Runtime summary is currently unavailable"
+ }
+ },
+ "aiPrompt": {
+ "title": "Prompt Management",
+ "subtitle": "Manage system prompts and scene-based user prompt templates with cards.",
+ "entity": "Prompt",
+ "reportTitle": "Prompt Report",
+ "empty": "No prompts",
+ "buttons": {
+ "add": "Add Prompt"
+ },
+ "fields": {
+ "sceneTag": "Scene {value}",
+ "systemPrompt": "System Prompt",
+ "userPromptTemplate": "User Prompt Template"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter prompt name",
+ "code": "Prompt Code",
+ "codePlaceholder": "Enter prompt code",
+ "scene": "Scene",
+ "scenePlaceholder": "Enter scene",
+ "status": "Status"
+ },
+ "table": {
+ "name": "Prompt Name",
+ "code": "Prompt Code",
+ "scene": "Scene",
+ "status": "Status",
+ "systemPrompt": "System Prompt",
+ "userPromptTemplate": "User Prompt Template"
+ },
+ "dialog": {
+ "titleCreate": "Create Prompt",
+ "titleEdit": "Edit Prompt",
+ "titleDetail": "Prompt Detail",
+ "defaultPreviewInput": "Please summarize the current input",
+ "previewTitle": "Render Preview",
+ "previewDescription": "Input sample content and metadata to preview the final rendering.",
+ "previewAction": "Render Preview",
+ "previewResolvedVariables": "Resolved variables: {value}",
+ "previewNoVariables": "None",
+ "runtimeTitle": "Runtime Status",
+ "labels": {
+ "updateBy": "Updated By",
+ "updateTime": "Updated At",
+ "name": "Prompt Name",
+ "code": "Prompt Code",
+ "scene": "Scene",
+ "systemPrompt": "System Prompt",
+ "userPromptTemplate": "User Prompt Template",
+ "status": "Status",
+ "memo": "Remark"
+ },
+ "placeholders": {
+ "previewInput": "Enter sample input",
+ "metadata": "Enter JSON metadata, for example {\"path\":\"/system/aiPrompt\"}",
+ "renderedSystemPrompt": "Rendered system prompt",
+ "renderedUserPrompt": "Rendered user prompt",
+ "name": "Enter prompt name",
+ "code": "Enter prompt code",
+ "scene": "Enter scene",
+ "systemPrompt": "Enter system prompt",
+ "userPromptTemplate": "Enter user prompt template",
+ "status": "Select status",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "name": "Please enter a prompt name",
+ "code": "Please enter a prompt code",
+ "scene": "Please enter a scene",
+ "systemPrompt": "Please enter the system prompt",
+ "userPromptTemplate": "Please enter the user prompt template"
+ }
+ },
+ "messages": {
+ "previewFailed": "Render preview failed"
+ }
+ },
+ "aiMcpMount": {
+ "title": "MCP Mounts",
+ "subtitle": "Manage MCP service mounts and runtime health in the current environment.",
+ "entity": "MCP mount",
+ "empty": "No MCP mounts",
+ "buttons": {
+ "add": "Add Mount"
+ },
+ "fields": {
+ "target": "Target",
+ "lastTestTime": "Last Test Time",
+ "timeoutMs": "Request Timeout",
+ "lastInitElapsedMs": "Last Init Elapsed"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter mount name",
+ "transportType": "Transport Type",
+ "status": "Status"
+ },
+ "actions": {
+ "connectivityTest": "Connectivity Test",
+ "toolsPreview": "Tools Preview"
+ },
+ "health": {
+ "healthy": "Healthy",
+ "unhealthy": "Unhealthy",
+ "notTested": "Not Tested"
+ },
+ "groups": {
+ "builtin": {
+ "title": "Built-in Mounts",
+ "description": "Platform built-in MCP capabilities."
+ },
+ "sse": {
+ "title": "SSE / HTTP Mounts",
+ "description": "Remote MCP services connected through HTTP/SSE."
+ },
+ "stdio": {
+ "title": "STDIO Mounts",
+ "description": "MCP services launched locally and communicated with through stdio."
+ }
+ },
+ "dialog": {
+ "titleCreate": "Create Mount",
+ "titleEdit": "Edit Mount",
+ "titleDetail": "Mount Detail",
+ "draftTestTitle": "Draft Connectivity Test",
+ "draftTestDescription": "Validate the current mount configuration before saving.",
+ "draftTestAction": "Test Draft Connectivity",
+ "runtimeTitle": "Runtime Status",
+ "runtimeLabels": {
+ "healthStatus": "Health Status",
+ "lastTestTime": "Last Test Time",
+ "lastInitElapsedMs": "Last Init Elapsed",
+ "updateTime": "Updated At",
+ "lastTestMessage": "Last Test Message"
+ },
+ "labels": {
+ "name": "Name",
+ "transportType": "Transport Type",
+ "builtinCode": "Built-in MCP Code",
+ "serverUrl": "Server URL",
+ "endpoint": "SSE Endpoint",
+ "headersJson": "Headers JSON",
+ "command": "Command",
+ "argsJson": "Args JSON",
+ "envJson": "Environment JSON",
+ "requestTimeoutMs": "Request Timeout (ms)",
+ "sort": "Sort",
+ "status": "Status",
+ "memo": "Remark"
+ },
+ "placeholders": {
+ "name": "Enter name",
+ "transportType": "Select transport type",
+ "builtinCode": "Enter built-in MCP code",
+ "serverUrl": "Enter server URL",
+ "endpoint": "Enter SSE endpoint",
+ "headersJson": "Enter headers JSON",
+ "command": "Enter command",
+ "argsJson": "Enter command args JSON",
+ "envJson": "Enter environment JSON",
+ "requestTimeoutMs": "Enter request timeout",
+ "sort": "Enter sort",
+ "status": "Select status",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "name": "Please enter a name",
+ "transportType": "Please select a transport type"
+ }
+ },
+ "toolsDrawer": {
+ "title": "MCP Tools Preview",
+ "currentMount": "Current Mount",
+ "description": "Preview the tool list and run debug tests for tool inputs.",
+ "refreshTools": "Refresh Tools",
+ "connectivityTest": "Connectivity Test",
+ "empty": "No tools available",
+ "toolTest": "Run Tool Test",
+ "inputJson": "Input JSON",
+ "inputJsonPlaceholder": "Enter JSON, for example {\"taskCode\":\"TK001\"}",
+ "output": "Tool Output",
+ "outputPlaceholder": "Tool output will be shown here",
+ "inputSchema": "Input Schema",
+ "toolInputRequired": "Please enter tool test input JSON",
+ "toolTestSuccess": "Tool test succeeded",
+ "toolTestFailed": "Tool test failed",
+ "toolsLoadFailed": "Failed to load tool list"
+ },
+ "messages": {
+ "connectivityTimeout": "Connectivity test timed out and waiting has stopped",
+ "connectivitySuccess": "Connectivity test succeeded",
+ "connectivityFailed": "Connectivity test failed",
+ "draftConnectivitySuccess": "Draft connectivity test succeeded",
+ "draftConnectivityFailed": "Draft connectivity test failed",
+ "toolsTimeout": "Tool list timed out and waiting has stopped",
+ "toolTestTimeout": "Tool test timed out and waiting has stopped",
+ "initElapsedMs": "Initialization elapsed {value} ms"
+ }
+ },
"role": {
"entity": "Role",
"reportTitle": "Role Report",
@@ -721,6 +1124,98 @@
}
},
"orders": {
+ "common": {
+ "orderCode": "Document Code",
+ "trackCode": "Track Code"
+ },
+ "asnOrderItem": {
+ "reportTitle": "Receiving Item Report",
+ "sourceTitle": "Current Source",
+ "sourceLabel": "ASN ID: {id}",
+ "orderType": {
+ "in": "Inbound",
+ "out": "Outbound"
+ },
+ "ntyStatus": {
+ "notReported": "Not Reported",
+ "reported": "Reported"
+ },
+ "search": {
+ "conditionPlaceholder": "Enter PO No./material code/material name/supplier",
+ "poCode": "PO No.",
+ "poCodePlaceholder": "Enter PO No.",
+ "orderCode": "ASN No.",
+ "orderCodePlaceholder": "Enter ASN No.",
+ "platWorkCode": "Plan Track No.",
+ "platWorkCodePlaceholder": "Enter plan track No.",
+ "platItemId": "Line No.",
+ "platItemIdPlaceholder": "Enter line No.",
+ "matnrCodePlaceholder": "Enter material code",
+ "maktxPlaceholder": "Enter material name",
+ "splrBatchPlaceholder": "Enter supplier batch",
+ "stockUnit": "Stock Unit",
+ "stockUnitPlaceholder": "Enter stock unit",
+ "ntyStatus": "Report Status",
+ "createTimeRange": "Created At",
+ "updateTimeRange": "Updated At",
+ "startTime": "Start Time",
+ "endTime": "End Time",
+ "rangeSeparator": "To"
+ },
+ "table": {
+ "poCode": "PO No.",
+ "wkType": "Business Type",
+ "type": "Document Type",
+ "purchaseOrg": "Purchase Org",
+ "purchaseUser": "Purchaser",
+ "platWorkCode": "Plan Track No.",
+ "platItemId": "Line No.",
+ "stockUnit": "Stock Unit",
+ "anfme": "Delivery Qty",
+ "qty": "Received Qty",
+ "targetWarehouseId": "Suggested Target Warehouse",
+ "businessTime": "Business Time"
+ },
+ "detail": {
+ "title": "Receiving Item Detail",
+ "baseInfo": "Basic Information",
+ "itemInfo": "Item Information",
+ "auditInfo": "Audit Information",
+ "extendFields": "Extended Fields",
+ "poCode": "PO No.",
+ "orderCode": "ASN No.",
+ "wkType": "Business Type",
+ "orderType": "Document Type",
+ "purchaseOrg": "Purchase Org",
+ "purchaseUser": "Purchaser",
+ "supplierId": "Supplier ID",
+ "supplierName": "Supplier Name",
+ "businessTime": "Business Time",
+ "targetWarehouseId": "Suggested Target Warehouse",
+ "ntyStatus": "Report Status",
+ "platItemId": "Plan Line No.",
+ "platWorkCode": "Plan Track No.",
+ "spec": "Specification",
+ "model": "Model",
+ "barcode": "Barcode",
+ "qrcode": "QR Code",
+ "packName": "Package Name",
+ "stockUnit": "Stock Unit",
+ "purUnit": "Purchase Unit",
+ "anfme": "Delivery Qty",
+ "qty": "Received Qty",
+ "purQty": "Purchase Qty",
+ "prodTime": "Production Date",
+ "isptResult": "Inspection Result",
+ "sourceWarehouseId": "Source Warehouse"
+ },
+ "messages": {
+ "detailTimeout": "Receiving item detail timed out and waiting has stopped",
+ "detailFailed": "Failed to load receiving item detail",
+ "pageTimeout": "Receiving item loading timed out and waiting has stopped",
+ "noExportData": "No data available for export"
+ }
+ },
"asnOrder": {
"reportTitle": "ASN Report",
"entity": "ASN",
@@ -830,6 +1325,258 @@
"receivedQtyTotal": "Received Qty"
}
},
+ "asnOrderLog": {
+ "table": {
+ "poId": "PO ID",
+ "type": "Order Type",
+ "wkType": "Business Type",
+ "anfme": "Delivery Qty",
+ "qty": "Received Qty",
+ "logisNo": "Logistics No.",
+ "arrTime": "Estimated Arrival Time",
+ "rleStatus": "Release Status",
+ "exceStatus": "Execution Status"
+ }
+ },
+ "asnOrderItemLog": {
+ "reportTitle": "ASN Item Log Report",
+ "table": {
+ "asnCode": "ASN No.",
+ "platItemId": "Platform Line No.",
+ "poDetlId": "PO Item ID",
+ "poCode": "PO No.",
+ "fieldsIndex": "Dynamic Field Index",
+ "matnrCode": "Material Code",
+ "maktx": "Material Name",
+ "anfme": "Delivery Qty",
+ "stockUnit": "Stock Unit",
+ "purQty": "Purchase Qty",
+ "purUnit": "Purchase Unit",
+ "qty": "Received Qty",
+ "splrCode": "Supplier Code",
+ "splrBatch": "Supplier Batch",
+ "splrName": "Supplier Name",
+ "qrcode": "QR Code",
+ "trackCode": "Track Code",
+ "barcode": "Barcode",
+ "packName": "Package Name",
+ "ntyStatus": "Report Status"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter ASN No./PO No./material code",
+ "logId": "Log ID",
+ "logIdPlaceholder": "Enter log ID",
+ "asnCodePlaceholder": "Enter ASN No.",
+ "poCodePlaceholder": "Enter PO No.",
+ "matnrCodePlaceholder": "Enter material code",
+ "maktxPlaceholder": "Enter material name",
+ "splrBatchPlaceholder": "Enter supplier batch"
+ },
+ "status": {
+ "notReported": "Not Reported",
+ "reported": "Reported",
+ "partialReported": "Partially Reported"
+ }
+ },
+ "outStock": {
+ "reportTitle": "Out Stock Report",
+ "entity": "Out Stock Order",
+ "type": {
+ "out": "Out Stock Order"
+ },
+ "businessType": {
+ "salesOut": "Sales Outbound",
+ "transferOut": "Transfer Outbound",
+ "stockOut": "Stock Outbound",
+ "preOut": "Preparation Outbound"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter out stock order / PO No. / customer",
+ "code": "Out Stock Order",
+ "codePlaceholder": "Enter out stock order",
+ "poCode": "PO No.",
+ "poCodePlaceholder": "Enter PO No.",
+ "wkType": "Business Type",
+ "wkTypePlaceholder": "Select business type",
+ "exceStatus": "Document Status",
+ "exceStatusPlaceholder": "Select document status",
+ "rleStatus": "Release Status",
+ "rleStatusPlaceholder": "Select release status",
+ "logisNo": "Logistics No.",
+ "logisNoPlaceholder": "Enter logistics No.",
+ "customerName": "Customer Name",
+ "customerNamePlaceholder": "Enter customer name",
+ "saleOrgName": "Sales Org",
+ "saleOrgNamePlaceholder": "Enter sales org",
+ "memo": "Remark",
+ "memoPlaceholder": "Enter remark"
+ },
+ "status": {
+ "initialized": "Initialized",
+ "pending": "Pending",
+ "generated": "Generated Work File",
+ "running": "Running",
+ "completed": "Completed",
+ "cancelled": "Cancelled",
+ "released": "Released"
+ },
+ "actions": {
+ "view": "View Detail",
+ "items": "Items",
+ "print": "Print",
+ "complete": "Complete",
+ "cancel": "Cancel",
+ "delete": "Delete"
+ },
+ "table": {
+ "code": "Out Stock Order",
+ "poCode": "PO No.",
+ "type": "Order Type",
+ "wkType": "Business Type",
+ "customerName": "Customer",
+ "saleOrgName": "Sales Org",
+ "anfme": "Required Qty",
+ "workQty": "Execution Qty",
+ "qty": "Outbound Qty",
+ "logisNo": "Logistics No.",
+ "rleStatus": "Release Status",
+ "exceStatus": "Document Status",
+ "updateTime": "Updated At"
+ },
+ "detail": {
+ "title": "Out Stock Detail",
+ "baseInfo": "Basic Information",
+ "auditInfo": "Audit Information",
+ "items": "Order Items",
+ "count": "{count} items",
+ "code": "Out Stock Order",
+ "poCode": "PO No.",
+ "type": "Order Type",
+ "wkType": "Business Type",
+ "exceStatus": "Document Status",
+ "rleStatus": "Release Status",
+ "logisNo": "Logistics No.",
+ "businessTime": "Business Time",
+ "saleOrgName": "Sales Org",
+ "saleUserName": "Sales User",
+ "customerId": "Customer Code",
+ "customerName": "Customer Name",
+ "stockOrgName": "Warehouse Org",
+ "anfme": "Required Qty",
+ "workQty": "Execution Qty",
+ "qty": "Outbound Qty",
+ "memo": "Remark",
+ "createBy": "Created By",
+ "createTime": "Created At",
+ "updateBy": "Updated By",
+ "updateTime": "Updated At"
+ },
+ "messages": {
+ "detailTimeout": "Out stock detail timed out and waiting has stopped",
+ "itemsTimeout": "Out stock items timed out and waiting has stopped",
+ "detailLoadFailed": "Failed to load out stock detail",
+ "completeTitle": "Complete Confirmation",
+ "completeConfirm": "Are you sure you want to complete out stock order {code}?",
+ "completeSuccess": "Completed successfully",
+ "cancelTitle": "Cancel Confirmation",
+ "cancelConfirm": "Are you sure you want to cancel out stock order {code}?",
+ "cancelSuccess": "Cancelled successfully",
+ "actionFailed": "Out stock action failed"
+ }
+ },
+ "outStockItem": {
+ "title": "Out Stock Item",
+ "reportTitle": "Out Stock Item Report",
+ "sourceSummary": {
+ "title": "Current Source",
+ "orderId": "Out stock order ID: {id}"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter out stock order / material code / material name",
+ "orderCode": "Out Stock Order",
+ "orderCodePlaceholder": "Enter out stock order",
+ "poCode": "PO No.",
+ "poCodePlaceholder": "Enter PO No.",
+ "platItemId": "Platform Line No.",
+ "platItemIdPlaceholder": "Enter platform line No.",
+ "matnrCode": "Material Code",
+ "matnrCodePlaceholder": "Enter material code",
+ "maktx": "Material Name",
+ "maktxPlaceholder": "Enter material name",
+ "batch": "Batch",
+ "batchPlaceholder": "Enter batch",
+ "splrBatch": "Supplier Batch",
+ "splrBatchPlaceholder": "Enter supplier batch",
+ "barcode": "Barcode",
+ "barcodePlaceholder": "Enter barcode",
+ "fieldsIndex": "Field Index",
+ "fieldsIndexPlaceholder": "Enter field index",
+ "status": "Status",
+ "statusPlaceholder": "Select status"
+ },
+ "detail": {
+ "title": "Out Stock Item Detail",
+ "orderCode": "Out Stock Order",
+ "poCode": "PO No.",
+ "platItemId": "Platform Line No.",
+ "platOrderCode": "Platform Order No.",
+ "platWorkCode": "Platform Work Order No.",
+ "projectCode": "Project No.",
+ "matnrCode": "Material Code",
+ "maktx": "Material Name",
+ "spec": "Specification",
+ "model": "Model",
+ "batch": "Batch",
+ "splrBatch": "Supplier Batch",
+ "stockUnit": "Stock Unit",
+ "purUnit": "Purchase Unit",
+ "baseUnit": "Base Unit",
+ "fieldsIndex": "Field Index",
+ "barcode": "Barcode",
+ "qrcode": "QR Code",
+ "packName": "Package Name",
+ "status": "Status",
+ "anfme": "Quantity",
+ "workQty": "Execution Qty",
+ "qty": "Outbound Qty",
+ "purQty": "Purchase Qty",
+ "demandQty": "Demand Qty",
+ "splrCode": "Supplier Code",
+ "splrName": "Supplier Name",
+ "sourceWarehouseId": "Source Warehouse",
+ "targetWarehouseId": "Target Warehouse",
+ "ownerName": "Owner",
+ "keeperName": "Keeper",
+ "memo": "Remark",
+ "createBy": "Created By",
+ "createTime": "Created At",
+ "updateBy": "Updated By",
+ "updateTime": "Updated At"
+ },
+ "table": {
+ "orderCode": "Out Stock Order",
+ "poCode": "PO No.",
+ "platItemId": "Platform Line No.",
+ "matnrCode": "Material Code",
+ "maktx": "Material Name",
+ "batch": "Batch",
+ "splrBatch": "Supplier Batch",
+ "stockUnit": "Stock Unit",
+ "anfme": "Quantity",
+ "workQty": "Execution Qty",
+ "qty": "Outbound Qty",
+ "fieldsIndex": "Field Index",
+ "status": "Status",
+ "updateTime": "Updated At"
+ },
+ "messages": {
+ "detailTimeout": "Out stock item detail timed out and waiting has stopped",
+ "detailFailed": "Failed to load out stock item detail"
+ }
+ },
"delivery": {
"reportTitle": "DO Report",
"detailReportTitle": "DO Item Report",
@@ -922,6 +1669,56 @@
"itemsTimeout": "DO items timed out and waiting has stopped",
"detailTimeout": "DO detail timed out and waiting has stopped",
"detailLoadFailed": "Failed to load DO detail"
+ }
+ },
+ "deliveryItem": {
+ "reportTitle": "DO Item Report",
+ "sourceTitle": "Current Source",
+ "sourceLabel": "DO ID: {id}",
+ "search": {
+ "conditionPlaceholder": "Enter DO No./material code/material name/supplier",
+ "deliveryCode": "DO No.",
+ "deliveryCodePlaceholder": "Enter DO No.",
+ "platItemId": "Platform Line No.",
+ "platItemIdPlaceholder": "Enter platform line No.",
+ "matnrCodePlaceholder": "Enter material code",
+ "maktxPlaceholder": "Enter material name",
+ "supplierName": "Supplier Name",
+ "supplierNamePlaceholder": "Enter supplier name",
+ "supplierBatchPlaceholder": "Enter supplier batch"
+ },
+ "table": {
+ "deliveryId": "DO ID",
+ "deliveryCode": "DO No.",
+ "platItemId": "Platform Line No.",
+ "fieldsIndex": "Field Index",
+ "workQty": "Execution Qty",
+ "qty": "Outbound Qty",
+ "nromQty": "Std. Pack",
+ "printQty": "Print Qty",
+ "supplierCode": "Supplier Code",
+ "supplierName": "Supplier Name"
+ },
+ "detail": {
+ "title": "DO Item Detail",
+ "baseInfo": "Basic Information",
+ "auditInfo": "Audit Information",
+ "deliveryId": "DO ID",
+ "deliveryCode": "DO No.",
+ "platItemId": "Platform Line No.",
+ "fieldsIndex": "Field Index",
+ "workQty": "Execution Qty",
+ "qty": "Outbound Qty",
+ "nromQty": "Std. Pack",
+ "printQty": "Print Qty",
+ "supplierCode": "Supplier Code",
+ "supplierName": "Supplier Name",
+ "packName": "Package Name",
+ "prodTime": "Production Date"
+ },
+ "messages": {
+ "detailTimeout": "DO item detail timed out and waiting has stopped",
+ "detailFailed": "Failed to load DO item detail"
}
},
"transfer": {
@@ -1038,6 +1835,267 @@
"publishFailed": "Dispatch failed",
"typeOptionsTimeout": "Transfer type options timed out and waiting has stopped",
"areaOptionsTimeout": "Area options timed out and waiting has stopped"
+ }
+ },
+ "transferItem": {
+ "reportTitle": "Transfer Item Report",
+ "sourceTitle": "Current Source",
+ "sourceLabel": "Transfer ID: {id}",
+ "search": {
+ "conditionPlaceholder": "Enter transfer No./material code/material name",
+ "transferId": "Transfer ID",
+ "transferIdPlaceholder": "Enter transfer ID",
+ "transferCode": "Transfer No.",
+ "transferCodePlaceholder": "Enter transfer No.",
+ "platItemId": "Platform Line No.",
+ "platItemIdPlaceholder": "Enter platform line No.",
+ "matnrId": "Material ID",
+ "matnrIdPlaceholder": "Enter material ID",
+ "matnrCodePlaceholder": "Enter material code",
+ "maktxPlaceholder": "Enter material name",
+ "spec": "Specification",
+ "specPlaceholder": "Enter specification",
+ "model": "Model",
+ "modelPlaceholder": "Enter model",
+ "batchPlaceholder": "Enter batch",
+ "unitPlaceholder": "Enter unit",
+ "workQty": "Execution Qty",
+ "workQtyPlaceholder": "Enter execution qty",
+ "qty": "Completed Qty",
+ "qtyPlaceholder": "Enter completed qty",
+ "anfmePlaceholder": "Enter planned qty",
+ "fieldsIndex": "Field Index",
+ "fieldsIndexPlaceholder": "Enter field index",
+ "platOrderCode": "Platform Order No.",
+ "platOrderCodePlaceholder": "Enter platform order No.",
+ "platWorkCode": "Platform Work No.",
+ "platWorkCodePlaceholder": "Enter platform work No.",
+ "projectCode": "Project Code",
+ "projectCodePlaceholder": "Enter project code",
+ "splrId": "Supplier ID",
+ "splrIdPlaceholder": "Enter supplier ID",
+ "memoPlaceholder": "Enter remark",
+ "timeStart": "Start Time",
+ "timeStartPlaceholder": "Select start time",
+ "timeEnd": "End Time",
+ "timeEndPlaceholder": "Select end time"
+ },
+ "table": {
+ "transferId": "Transfer ID",
+ "transferCode": "Transfer No.",
+ "platItemId": "Platform Line No.",
+ "fieldsIndex": "Field Index",
+ "spec": "Specification",
+ "model": "Model",
+ "workQty": "Execution Qty",
+ "qty": "Completed Qty",
+ "platOrderCode": "Platform Order No.",
+ "platWorkCode": "Platform Work No.",
+ "projectCode": "Project Code",
+ "supplierCode": "Supplier Code",
+ "supplierName": "Supplier Name"
+ },
+ "detail": {
+ "title": "Transfer Item Detail",
+ "baseInfo": "Basic Information",
+ "materialInfo": "Material Information",
+ "platformInfo": "Platform Information",
+ "auditInfo": "Audit Information",
+ "transferId": "Transfer ID",
+ "transferCode": "Transfer No.",
+ "platItemId": "Platform Line No.",
+ "fieldsIndex": "Field Index",
+ "matnrId": "Material ID",
+ "spec": "Specification",
+ "model": "Model",
+ "workQty": "Execution Qty",
+ "qty": "Completed Qty",
+ "platOrderCode": "Platform Order No.",
+ "platWorkCode": "Platform Work No.",
+ "projectCode": "Project Code",
+ "splrId": "Supplier ID",
+ "supplierCode": "Supplier Code",
+ "supplierName": "Supplier Name"
+ },
+ "messages": {
+ "detailTimeout": "Transfer item detail timed out and waiting has stopped",
+ "detailFailed": "Failed to load transfer item detail"
+ }
+ },
+ "wave": {
+ "reportTitle": "Wave Report",
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter wave No./remark",
+ "code": "Wave No.",
+ "codePlaceholder": "Enter wave No.",
+ "type": "Wave Type",
+ "exceStatus": "Wave Status",
+ "status": "Status",
+ "memo": "Remark",
+ "memoPlaceholder": "Enter remark",
+ "timeStart": "Start Time",
+ "timeEnd": "End Time"
+ },
+ "status": {
+ "type": {
+ "0": "Manual",
+ "1": "Automatic"
+ },
+ "exceStatus": {
+ "0": "Pending",
+ "1": "Running",
+ "2": "Paused",
+ "3": "Completed"
+ }
+ },
+ "actions": {
+ "view": "View Detail",
+ "publicTask": "Dispatch Task",
+ "pause": "Pause",
+ "continue": "Continue",
+ "stop": "Stop",
+ "print": "Print"
+ },
+ "table": {
+ "code": "Wave No.",
+ "type": "Wave Type",
+ "exceStatus": "Wave Status",
+ "anfme": "Expected Qty",
+ "workQty": "Running Qty",
+ "qty": "Completed Qty",
+ "orderNum": "Document Count",
+ "progress": "Progress",
+ "createTime": "Created At",
+ "updateTime": "Updated At",
+ "status": "Status"
+ },
+ "preview": {
+ "waveCode": "Wave No.",
+ "orderCode": "Document Code",
+ "matnrCode": "Material Code",
+ "maktx": "Material Name",
+ "batch": "Batch",
+ "unit": "Unit",
+ "anfme": "Required Qty",
+ "workQty": "Allocated Qty",
+ "stockQty": "Stock Qty",
+ "splrBatch": "Supplier Batch",
+ "stockLocs": "Location"
+ },
+ "detail": {
+ "title": "Wave Detail",
+ "code": "Wave No.",
+ "type": "Wave Type",
+ "exceStatus": "Wave Status",
+ "status": "Status",
+ "anfme": "Expected Qty",
+ "workQty": "Running Qty",
+ "qty": "Completed Qty",
+ "orderNum": "Document Count",
+ "groupQty": "Category Count",
+ "targSite": "Target Site",
+ "stationId": "Assigned Station",
+ "locCode": "Assigned Location",
+ "createBy": "Created By",
+ "createTime": "Created At",
+ "updateBy": "Updated By",
+ "updateTime": "Updated At",
+ "memo": "Remark",
+ "previewTitle": "Wave Preview Items - Material Code"
+ },
+ "publicTask": {
+ "title": "Dispatch Wave Task",
+ "code": "Wave No.",
+ "type": "Wave Type",
+ "exceStatus": "Wave Status",
+ "workQty": "Running Qty"
+ },
+ "messages": {
+ "pauseSuccess": "Wave paused",
+ "continueSuccess": "Wave resumed",
+ "stopConfirm": "Are you sure you want to stop wave {code}?",
+ "stopTitle": "Stop Confirmation",
+ "stopSuccess": "Wave stopped",
+ "actionFailed": "Wave action failed",
+ "detailTimeout": "Wave detail timed out and waiting has stopped",
+ "previewTimeout": "Wave preview timed out and waiting has stopped",
+ "publicTaskTimeout": "Wave dispatch preview timed out and waiting has stopped",
+ "publicTaskSuccess": "Wave dispatched",
+ "publicTaskFailed": "Wave dispatch failed",
+ "publicTaskWarning": "Wave preview data is unavailable. Please check location configuration first."
+ }
+ },
+ "waveItem": {
+ "reportTitle": "Wave Item Report",
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter wave No./material code/material name",
+ "waveCode": "Wave No.",
+ "waveCodePlaceholder": "Enter wave No.",
+ "orderCode": "Document Code",
+ "orderCodePlaceholder": "Enter document code",
+ "matnrCode": "Material Code",
+ "matnrCodePlaceholder": "Enter material code",
+ "maktx": "Material Name",
+ "maktxPlaceholder": "Enter material name",
+ "batch": "Batch",
+ "batchPlaceholder": "Enter batch",
+ "splrBatch": "Supplier Batch",
+ "splrBatchPlaceholder": "Enter supplier batch",
+ "fieldsIndex": "Dynamic Field Index",
+ "fieldsIndexPlaceholder": "Enter dynamic field index",
+ "timeStart": "Start Time",
+ "timeEnd": "End Time"
+ },
+ "status": {
+ "exceStatus": {
+ "0": "Pending",
+ "1": "Running",
+ "2": "Paused",
+ "3": "Dispatched",
+ "4": "Task Completed"
+ }
+ },
+ "actions": {
+ "view": "View Detail"
+ },
+ "table": {
+ "waveCode": "Wave No.",
+ "orderCode": "Document Code",
+ "matnrCode": "Material Code",
+ "maktx": "Material Name",
+ "batch": "Batch",
+ "splrBatch": "Supplier Batch",
+ "unit": "Unit",
+ "anfme": "Required Qty",
+ "workQty": "Allocated Qty",
+ "stockQty": "Stock Qty",
+ "fieldsIndex": "Dynamic Field Index",
+ "exceStatus": "Execution Status",
+ "updateTime": "Updated At",
+ "stockLocs": "Location"
+ },
+ "detail": {
+ "title": "Wave Item Detail",
+ "waveCode": "Wave No.",
+ "orderCode": "Document Code",
+ "matnrCode": "Material Code",
+ "maktx": "Material Name",
+ "batch": "Batch",
+ "splrBatch": "Supplier Batch",
+ "unit": "Unit",
+ "fieldsIndex": "Dynamic Field Index",
+ "anfme": "Required Qty",
+ "workQty": "Allocated Qty",
+ "stockQty": "Stock Qty",
+ "exceStatus": "Execution Status",
+ "createTime": "Created At",
+ "updateTime": "Updated At",
+ "stockLocs": "Location"
+ },
+ "messages": {
+ "detailTimeout": "Wave item detail timed out and waiting has stopped"
}
}
},
@@ -1272,9 +2330,1325 @@
"containerTypeTimeout": "Container type options timed out and waiting has stopped",
"useStatusTimeout": "Usage status options timed out and waiting has stopped"
}
+ },
+ "basContainer": {
+ "table": {
+ "containerType": "Container Type",
+ "code": "Unique Code",
+ "codeType": "Barcode Type",
+ "areas": "Inbound Areas"
+ }
+ },
+ "companys": {
+ "title": "Companies",
+ "entity": "Company",
+ "reportTitle": "Company Report",
+ "buttons": {
+ "add": "Add Company"
+ },
+ "table": {
+ "code": "Company Code",
+ "name": "Company Name",
+ "nameEn": "English Alias",
+ "briefCode": "Mnemonic Code",
+ "type": "Company Type",
+ "contact": "Contact",
+ "tel": "Phone",
+ "email": "Email",
+ "postCode": "Post Code",
+ "province": "Province",
+ "city": "City",
+ "address": "Address"
+ },
+ "search": {
+ "conditionPlaceholder": "Enter company name/code/contact/phone",
+ "codePlaceholder": "Enter company code",
+ "namePlaceholder": "Enter company name",
+ "nameEnPlaceholder": "Enter English alias",
+ "briefCodePlaceholder": "Enter mnemonic code",
+ "contactPlaceholder": "Enter contact",
+ "telPlaceholder": "Enter phone",
+ "emailPlaceholder": "Enter email",
+ "postCodePlaceholder": "Enter post code",
+ "provincePlaceholder": "Enter province",
+ "cityPlaceholder": "Enter city",
+ "addressPlaceholder": "Enter address",
+ "memoPlaceholder": "Enter remark"
+ },
+ "placeholders": {
+ "code": "Leave blank to auto-generate",
+ "name": "Enter company name",
+ "nameEn": "Enter English alias",
+ "briefCode": "Enter mnemonic code",
+ "type": "Select company type",
+ "contact": "Enter contact",
+ "tel": "Enter phone",
+ "email": "Enter email",
+ "postCode": "Enter post code",
+ "province": "Enter province",
+ "city": "Enter city",
+ "address": "Enter address",
+ "status": "Select status",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "name": "Please enter the company name",
+ "briefCode": "Please enter the mnemonic code",
+ "type": "Please select the company type"
+ },
+ "dialog": {
+ "titleCreate": "Create Company",
+ "titleEdit": "Edit Company",
+ "titleDetail": "Company Detail"
+ },
+ "detail": {
+ "sections": {
+ "basic": "Basic Information",
+ "audit": "Audit Information"
+ }
+ },
+ "messages": {
+ "detailTimeout": "Company detail loading timed out and waiting has stopped",
+ "detailFailed": "Failed to load company detail",
+ "typeOptionsTimeout": "Company type loading timed out and waiting has stopped"
+ }
+ },
+ "contract": {
+ "table": {
+ "code": "Contract Code",
+ "name": "Contract Name",
+ "projectName": "Project Name"
+ }
+ },
+ "whMat": {
+ "title": "Materials",
+ "labels": {
+ "allMaterials": "All Materials"
+ },
+ "search": {
+ "groupKeywordPlaceholder": "Search material groups",
+ "keyword": "Keyword",
+ "keywordPlaceholder": "Enter material code/name",
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter material code/name",
+ "code": "Material Code",
+ "codePlaceholder": "Enter material code",
+ "name": "Material Name",
+ "namePlaceholder": "Enter material name",
+ "spec": "Specification",
+ "specPlaceholder": "Enter specification",
+ "barcode": "Barcode",
+ "barcodePlaceholder": "Enter barcode"
+ },
+ "messages": {
+ "emptyGroups": "No material groups",
+ "groupTimeout": "Material groups loading timed out and waiting has stopped",
+ "groupLoadFailed": "Failed to load material groups",
+ "listTimeout": "Material list loading timed out and waiting has stopped",
+ "listLoadFailed": "Failed to load material list",
+ "detailTimeout": "Material detail timed out and waiting has stopped",
+ "detailLoadFailed": "Failed to load material detail"
+ },
+ "table": {
+ "code": "Material Code",
+ "name": "Material Name",
+ "groupName": "Material Group",
+ "group": "Material Group",
+ "barcode": "Barcode",
+ "spec": "Specification",
+ "model": "Model"
+ },
+ "detail": {
+ "title": "Material Detail",
+ "sections": {
+ "basic": "Basic Information",
+ "stock": "Stock Information",
+ "audit": "Audit Information",
+ "extend": "Extended Information"
+ },
+ "code": "Material Code",
+ "name": "Material Name",
+ "groupName": "Material Group",
+ "shipperName": "Shipper",
+ "shipper": "Shipper",
+ "barcode": "Barcode",
+ "spec": "Specification",
+ "model": "Model",
+ "color": "Color",
+ "size": "Size",
+ "description": "Description",
+ "unit": "Unit",
+ "purUnit": "Purchase Unit",
+ "purchaseUnit": "Purchase Unit",
+ "stockUnit": "Stock Unit",
+ "stockLevel": "Stock Level",
+ "flagLabelManage": "Label Management",
+ "flagCheck": "Review Management",
+ "safeQty": "Safety Stock",
+ "minQty": "Minimum Stock",
+ "maxQty": "Maximum Stock",
+ "stagn": "Stagnation Days",
+ "valid": "Valid",
+ "validWarn": "Validity Warning",
+ "baseUnit": "Base Unit",
+ "useOrgName": "Using Organization",
+ "erpClsId": "ERP Class"
+ }
+ },
+ "warehouse": {
+ "table": {
+ "name": "Warehouse Name",
+ "code": "Warehouse Code",
+ "factory": "Factory",
+ "address": "Warehouse Address"
+ }
+ },
+ "warehouseAreas": {
+ "title": "Warehouse Areas",
+ "entity": "Warehouse Area",
+ "reportTitle": "Warehouse Area Report",
+ "search": {
+ "conditionPlaceholder": "Enter warehouse area name/code/remark",
+ "codePlaceholder": "Enter warehouse area code",
+ "namePlaceholder": "Enter warehouse area name"
+ },
+ "placeholders": {
+ "warehouse": "Select warehouse",
+ "code": "Enter warehouse area code",
+ "name": "Enter warehouse area name",
+ "type": "Select business type",
+ "shipper": "Select shipper",
+ "supplier": "Select supplier",
+ "flagMinus": "Select negative stock option",
+ "flagLabelManage": "Select label management option",
+ "flagMix": "Select mixed storage option",
+ "status": "Select status",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "warehouse": "Please select warehouse",
+ "code": "Please enter warehouse area code",
+ "name": "Please enter warehouse area name",
+ "type": "Please select business type",
+ "flagMinus": "Please select negative stock option",
+ "flagMix": "Please select mixed storage option"
+ },
+ "dialog": {
+ "titleCreate": "Add Warehouse Area",
+ "titleEdit": "Edit Warehouse Area"
+ },
+ "detail": {
+ "title": "Warehouse Area Detail",
+ "sections": {
+ "basic": "Basic Information",
+ "audit": "Audit Information"
+ }
+ },
+ "messages": {
+ "detailTimeout": "Warehouse area detail loading timed out and has stopped waiting.",
+ "detailFailed": "Failed to get warehouse area detail",
+ "companyOptionsTimeout": "Company options loading timed out and has stopped waiting.",
+ "warehouseOptionsTimeout": "Warehouse options loading timed out and has stopped waiting.",
+ "typeOptionsTimeout": "Business type loading timed out and has stopped waiting."
+ },
+ "table": {
+ "warehouseName": "Warehouse",
+ "code": "Area Code",
+ "name": "Area Name",
+ "type": "Business Type",
+ "shipperName": "Shipper",
+ "supplierName": "Supplier",
+ "flagMix": "Mixed Storage",
+ "flagMinus": "Negative Stock",
+ "flagLabelManage": "Label Management",
+ "sort": "Sort"
+ }
+ },
+ "deviceSite": {
+ "table": {
+ "type": "Station Type",
+ "site": "Work Site",
+ "name": "Name",
+ "target": "Target Site",
+ "label": "Station Label",
+ "deviceType": "Device Type",
+ "deviceCode": "Device Code",
+ "deviceSite": "Device Site",
+ "channel": "Channel",
+ "areaStart": "Source Area",
+ "areaEnd": "Target Area"
+ }
+ },
+ "basStation": {
+ "table": {
+ "stationCode": "Station Code",
+ "stationName": "Station Name",
+ "type": "Station Type",
+ "useStatus": "Usage Status",
+ "area": "Warehouse Area",
+ "crossZoneArea": "Cross-zone Area",
+ "containerTypes": "Inbound Container Types",
+ "barcode": "Barcode",
+ "inAble": "Inbound Allowed",
+ "outAble": "Outbound Allowed",
+ "isCrossZone": "Cross Zone",
+ "isWcs": "WCS Enabled",
+ "autoTransfer": "Auto Transfer"
+ }
+ },
+ "loc": {
+ "table": {
+ "code": "Location Code",
+ "warehouseName": "Warehouse",
+ "areaName": "Area",
+ "typeIds": "Location Type",
+ "row": "Row",
+ "col": "Column",
+ "lev": "Level",
+ "channel": "Channel",
+ "useStatus": "Usage Status",
+ "flagLogic": "Virtual Location",
+ "flagLabelManage": "Label Management",
+ "barcode": "Container Code"
+ }
+ },
+ "taskPathTemplate": {
+ "actions": {
+ "flow": "Flow Diagram"
+ },
+ "table": {
+ "templateCode": "Template Code",
+ "templateName": "Template Name",
+ "sourceType": "Source Type",
+ "targetType": "Target Type",
+ "conditionDesc": "Condition Description",
+ "version": "Version",
+ "isCurrent": "Current Version",
+ "effectiveTime": "Effective Time",
+ "expireTime": "Expire Time",
+ "priority": "Priority",
+ "timeoutMinutes": "Timeout (min)",
+ "stepSize": "Step Length",
+ "maxRetryTimes": "Max Retries",
+ "retryIntervalSeconds": "Retry Interval (sec)"
+ }
+ },
+ "taskPathTemplateNode": {
+ "table": {
+ "templateId": "Template ID",
+ "templateCode": "Template Code",
+ "nodeOrder": "Node Order",
+ "nodeCode": "Node Code",
+ "nodeName": "Node Name",
+ "nodeType": "Node Type",
+ "systemCode": "System Code",
+ "systemName": "System Name",
+ "mandatory": "Mandatory Node",
+ "parallelExecutable": "Parallel",
+ "timeoutMinutes": "Timeout (min)"
+ }
+ },
+ "taskPathTemplateMerge": {
+ "table": {
+ "templateCode": "Template Code",
+ "templateName": "Template Name",
+ "sourceType": "Source Type",
+ "targetType": "Target Type",
+ "conditionExpression": "Condition Expression",
+ "conditionDesc": "Condition Description",
+ "version": "Version",
+ "isCurrent": "Current Version",
+ "effectiveTime": "Effective Time",
+ "expireTime": "Expire Time",
+ "priority": "Priority",
+ "timeoutMinutes": "Timeout (min)",
+ "maxRetryTimes": "Max Retries",
+ "retryIntervalSeconds": "Retry Interval (sec)",
+ "stepSize": "Step Length"
+ }
+ },
+ "locArea": {
+ "table": {
+ "area": "Area"
+ }
+ },
+ "locAreaMat": {
+ "table": {
+ "code": "Logical Code",
+ "warehouseName": "Warehouse",
+ "areaName": "Area",
+ "depict": "Description"
+ }
+ },
+ "locAreaRela": {
+ "table": {
+ "locAreaId": "Zone ID",
+ "locId": "Location ID"
+ }
+ },
+ "locAreaMatRela": {
+ "table": {
+ "areaMatId": "Parent Record",
+ "areaId": "Area",
+ "code": "Code",
+ "matnrId": "Material",
+ "groupId": "Material Group",
+ "locTypeId": "Location Type",
+ "locId": "Location",
+ "relationType": "Relation Type"
+ }
+ },
+ "locType": {
+ "table": {
+ "uuid": "Identifier",
+ "regex": "Barcode Rule"
+ }
+ },
+ "matnrGroup": {
+ "table": {
+ "code": "Group Code",
+ "parentCode": "Parent Code",
+ "name": "Group Name"
+ }
+ },
+ "deviceBind": {
+ "table": {
+ "currentRow": "Current Row",
+ "startRow": "Start Row",
+ "endRow": "End Row",
+ "deviceQty": "Device Qty",
+ "startDeviceNo": "Start Device No.",
+ "endDeviceNo": "End Device No.",
+ "staList": "Station List",
+ "typeId": "Area Type",
+ "beSimilar": "Material Similar",
+ "emptySimilar": "Empty Board Nearby"
+ }
+ },
+ "manager": {
+ "menuPda": {
+ "actions": {
+ "add": "Add PDA Menu"
+ },
+ "search": {
+ "name": "Menu Name",
+ "namePlaceholder": "Enter menu name",
+ "route": "Route",
+ "routePlaceholder": "Enter route"
+ },
+ "table": {
+ "name": "Menu Name",
+ "iconPreview": "Icon Preview",
+ "menuType": "Menu Type"
+ },
+ "tree": {
+ "topLevel": "Top Level Menu"
+ },
+ "type": {
+ "menu": "Menu",
+ "button": "Button",
+ "directory": "Directory"
+ },
+ "dialog": {
+ "titleAddMenu": "Add Menu",
+ "titleEditMenu": "Edit Menu",
+ "titleAddButton": "Add Button",
+ "titleEditButton": "Edit Button",
+ "menuType": "Menu Type",
+ "parentMenu": "Parent Menu",
+ "menuName": "Menu Name",
+ "permissionName": "Permission Name",
+ "route": "Route",
+ "component": "Component Key",
+ "authority": "Authority",
+ "icon": "Icon",
+ "sort": "Sort",
+ "status": "Status",
+ "placeholder": {
+ "parentMenu": "Select parent menu",
+ "menuName": "Enter menu name",
+ "permissionName": "Enter permission name",
+ "route": "Enter route",
+ "component": "Enter component key",
+ "authority": "Enter authority",
+ "icon": "Enter icon name",
+ "status": "Select status",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "menuName": "Please enter menu name",
+ "permissionName": "Please enter permission name",
+ "route": "Please enter route",
+ "authority": "Please enter authority"
+ }
+ },
+ "messages": {
+ "listTimeout": "PDA menu timed out and waiting has stopped",
+ "loadFailed": "Failed to load PDA menu",
+ "parentSelf": "Parent menu cannot be the current menu",
+ "deleteConfirm": "Are you sure you want to delete PDA menu \"{title}\"? This action cannot be undone."
+ }
+ }
+ }
+ },
+ "manager": {
+ "menuPda": {
+ "actions": {
+ "add": "Add PDA Menu"
+ },
+ "search": {
+ "name": "Menu Name",
+ "namePlaceholder": "Enter menu name",
+ "route": "Route",
+ "routePlaceholder": "Enter route"
+ },
+ "table": {
+ "name": "Menu Name",
+ "iconPreview": "Icon Preview",
+ "menuType": "Menu Type"
+ },
+ "tree": {
+ "topLevel": "Top Level Menu"
+ },
+ "type": {
+ "menu": "Menu",
+ "button": "Button",
+ "directory": "Directory"
+ },
+ "dialog": {
+ "titleAddMenu": "Add Menu",
+ "titleEditMenu": "Edit Menu",
+ "titleAddButton": "Add Button",
+ "titleEditButton": "Edit Button",
+ "menuType": "Menu Type",
+ "parentMenu": "Parent Menu",
+ "menuName": "Menu Name",
+ "permissionName": "Permission Name",
+ "route": "Route",
+ "component": "Component Key",
+ "authority": "Authority",
+ "icon": "Icon",
+ "sort": "Sort",
+ "status": "Status",
+ "placeholder": {
+ "parentMenu": "Select parent menu",
+ "menuName": "Enter menu name",
+ "permissionName": "Enter permission name",
+ "route": "Enter route",
+ "component": "Enter component key",
+ "authority": "Enter authority",
+ "icon": "Enter icon name",
+ "status": "Select status",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "menuName": "Please enter menu name",
+ "permissionName": "Please enter permission name",
+ "route": "Please enter route",
+ "authority": "Please enter authority"
+ }
+ },
+ "messages": {
+ "listTimeout": "PDA menu timed out and waiting has stopped",
+ "loadFailed": "Failed to load PDA menu",
+ "parentSelf": "Parent menu cannot be the current menu",
+ "deleteConfirm": "Are you sure you want to delete PDA menu \"{title}\"? This action cannot be undone."
+ }
+ },
+ "waveRule": {
+ "entity": "Wave Rule",
+ "reportTitle": "Wave Rule Report",
+ "actions": {
+ "add": "Add Wave Rule"
+ },
+ "table": {
+ "type": "Type"
+ },
+ "search": {
+ "conditionPlaceholder": "Enter code or name",
+ "codePlaceholder": "Enter code",
+ "namePlaceholder": "Enter rule name"
+ },
+ "dialog": {
+ "titleCreate": "Add Wave Rule",
+ "titleEdit": "Edit Wave Rule",
+ "validation": {
+ "type": "Please select a rule type",
+ "name": "Please enter a rule name"
+ },
+ "placeholder": {
+ "code": "Generated after creation",
+ "type": "Select rule type",
+ "name": "Enter rule name",
+ "status": "Select status",
+ "memo": "Enter remark"
+ }
+ },
+ "detail": {
+ "title": "Wave Rule Detail"
+ },
+ "messages": {
+ "typeTimeout": "Wave rule types timed out and waiting has stopped",
+ "detailFailed": "Failed to get wave rule detail"
+ }
+ },
+ "taskLog": {
+ "reportTitle": "Task Log Report",
+ "table": {
+ "taskCode": "Task Code",
+ "taskStatus": "Task Status",
+ "taskType": "Task Type",
+ "orgLoc": "Source Location",
+ "orgSite": "Source Station",
+ "targLoc": "Target Location",
+ "targSite": "Target Station",
+ "barcode": "Pallet Code",
+ "robotCode": "Robot Code",
+ "startTime": "Start Time",
+ "endTime": "End Time"
+ },
+ "search": {
+ "conditionPlaceholder": "Enter task code, pallet code, or robot code",
+ "taskCodePlaceholder": "Enter task code",
+ "orgLocPlaceholder": "Enter source location",
+ "targLocPlaceholder": "Enter target location",
+ "barcodePlaceholder": "Enter pallet code",
+ "robotCodePlaceholder": "Enter robot code",
+ "timeStart": "Start Date",
+ "timeEnd": "End Date"
+ },
+ "detail": {
+ "title": "Task Log Detail",
+ "taskId": "Task ID",
+ "exceStatus": "Execution Status",
+ "sort": "Priority",
+ "expDesc": "Exception Description",
+ "expCode": "Exception Code"
+ }
+ },
+ "inStatisticItem": {
+ "title": "Inbound Statistic Item",
+ "table": {
+ "dayTime": "Statistic Date",
+ "locCode": "Location",
+ "matnrCode": "Material Code",
+ "maktx": "Material Name",
+ "anfme": "Quantity",
+ "batch": "Batch",
+ "barcode": "Pallet Code"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter material name/code/batch",
+ "dayTime": "Statistic Date",
+ "maktx": "Material Name",
+ "maktxPlaceholder": "Enter material name",
+ "matnrCode": "Material Code",
+ "matnrCodePlaceholder": "Enter material code",
+ "batch": "Batch",
+ "batchPlaceholder": "Enter batch"
+ },
+ "detail": {
+ "title": "{title} Detail",
+ "taskType": "Task Type",
+ "taskStatus": "Task Status",
+ "fieldsIndex": "Field Index"
+ }
+ },
+ "freeze": {
+ "table": {
+ "locCode": "Location Code",
+ "wareArea": "Area",
+ "matnrCode": "Material Code",
+ "maktx": "Material Name",
+ "batch": "Batch",
+ "trackCode": "Track Code",
+ "anfme": "Available Qty",
+ "qty": "Stock Qty",
+ "workQty": "Working Qty"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter location code/material code",
+ "locCode": "Location Code",
+ "locCodePlaceholder": "Enter location code",
+ "matnrCode": "Material Code",
+ "matnrCodePlaceholder": "Enter material code",
+ "maktx": "Material Name",
+ "maktxPlaceholder": "Enter material name",
+ "batch": "Batch",
+ "batchPlaceholder": "Enter batch",
+ "trackCode": "Track Code",
+ "trackCodePlaceholder": "Enter track code",
+ "dynamicPlaceholder": "Enter {label}"
+ },
+ "detail": {
+ "title": "Freeze Stock Detail"
+ },
+ "messages": {
+ "fieldsTimeout": "Extended fields timed out and waiting has stopped",
+ "pageTimeout": "Frozen stock timed out and waiting has stopped",
+ "detailTimeout": "Frozen stock detail timed out and waiting has stopped"
+ }
+ },
+ "locItem": {
+ "table": {
+ "locId": "Location ID",
+ "wareArea": "Area",
+ "locCode": "Location Code",
+ "type": "Business Type",
+ "wkType": "Workstation Type",
+ "orderId": "Order ID",
+ "orderItemId": "Order Item ID",
+ "matnrId": "Material ID",
+ "matnrCode": "Material Code",
+ "maktx": "Material Name",
+ "spec": "Spec",
+ "model": "Model",
+ "batch": "Batch",
+ "trackCode": "Track Code",
+ "anfme": "Available Qty",
+ "qty": "Stock Qty",
+ "workQty": "Working Qty"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter location code/material code/track code",
+ "timeStart": "Start Date",
+ "timeEnd": "End Date",
+ "locId": "Location ID",
+ "locIdPlaceholder": "Enter location ID",
+ "orderId": "Order ID",
+ "orderIdPlaceholder": "Enter order ID",
+ "type": "Business Type",
+ "typePlaceholder": "Enter business type",
+ "wkType": "Workstation Type",
+ "wkTypePlaceholder": "Enter workstation type",
+ "matnrCode": "Material Code",
+ "matnrCodePlaceholder": "Enter material code",
+ "maktx": "Material Name",
+ "maktxPlaceholder": "Enter material name",
+ "trackCode": "Track Code",
+ "trackCodePlaceholder": "Enter track code",
+ "batch": "Batch",
+ "batchPlaceholder": "Enter batch",
+ "splrBatch": "Supplier Batch",
+ "splrBatchPlaceholder": "Enter supplier batch"
+ },
+ "detail": {
+ "title": "Stock Item Detail",
+ "extendFields": "Extended Fields",
+ "emptyExtendFields": "No extended fields"
+ },
+ "messages": {
+ "pageTimeout": "Stock item loading timed out and waiting has stopped",
+ "detailFailed": "Failed to get stock item detail",
+ "fieldsTimeout": "Extended fields timed out and waiting has stopped"
+ }
+ },
+ "locPreview": {
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter location code or barcode",
+ "code": "Location Code",
+ "codePlaceholder": "Enter location code",
+ "barcode": "Barcode",
+ "barcodePlaceholder": "Enter barcode"
+ },
+ "table": {
+ "locCode": "Location Code",
+ "warehouseLabel": "Warehouse",
+ "areaLabel": "Area",
+ "typeLabel": "Location Type",
+ "barcode": "Barcode",
+ "useStatusLabel": "Usage Status",
+ "row": "Row",
+ "col": "Column",
+ "lev": "Level",
+ "channel": "Channel"
+ },
+ "detail": {
+ "title": "Location Detail",
+ "stockItems": "Stock Items"
+ },
+ "messages": {
+ "fieldsTimeout": "Loading extended fields timed out and waiting has stopped",
+ "pageTimeout": "Loading location details timed out and waiting has stopped",
+ "detailTimeout": "Loading location detail timed out and waiting has stopped",
+ "itemPageTimeout": "Loading location stock details timed out and waiting has stopped"
+ }
}
},
"system": {
+ "config": {
+ "title": "Config",
+ "entity": "config",
+ "buttons": {
+ "add": "Add Config"
+ },
+ "table": {
+ "flag": "Flag",
+ "type": "Type",
+ "value": "Value",
+ "content": "Content"
+ },
+ "search": {
+ "conditionPlaceholder": "Enter config name",
+ "flagPlaceholder": "Enter config flag"
+ },
+ "types": {
+ "boolean": "Boolean",
+ "number": "Number",
+ "string": "String",
+ "json": "JSON",
+ "date": "Date"
+ },
+ "placeholders": {
+ "uuid": "Generated after creation",
+ "name": "Enter config name",
+ "flag": "Enter config flag",
+ "type": "Select type",
+ "value": "Enter config value",
+ "content": "Enter config content",
+ "status": "Select status",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "name": "Please enter config name",
+ "flag": "Please enter config flag"
+ },
+ "dialog": {
+ "titleCreate": "Create Config",
+ "titleEdit": "Edit Config",
+ "titleDetail": "Config Detail"
+ },
+ "messages": {
+ "detailFailed": "Failed to fetch config detail"
+ }
+ },
+ "dictType": {
+ "title": "Dictionary Type",
+ "entity": "Dictionary Type",
+ "buttons": {
+ "add": "Add Dictionary Type"
+ },
+ "search": {
+ "conditionPlaceholder": "Enter code or name",
+ "codePlaceholder": "Enter dictionary code",
+ "namePlaceholder": "Enter dictionary name"
+ },
+ "table": {
+ "description": "Description"
+ },
+ "placeholders": {
+ "code": "Enter dictionary code",
+ "name": "Enter dictionary name",
+ "status": "Select status",
+ "description": "Enter dictionary description",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "code": "Please enter dictionary code",
+ "name": "Please enter dictionary name"
+ },
+ "dialog": {
+ "titleCreate": "Add Dictionary Type",
+ "titleEdit": "Edit Dictionary Type",
+ "titleDetail": "Dictionary Type Detail"
+ },
+ "messages": {
+ "detailFailed": "Failed to fetch dictionary type detail"
+ }
+ },
+ "dept": {
+ "title": "Department",
+ "entity": "department",
+ "buttons": {
+ "add": "Add Department"
+ },
+ "table": {
+ "parent": "Parent Department",
+ "name": "Department Name",
+ "fullName": "Department Full Name",
+ "leader": "Leader"
+ },
+ "search": {
+ "conditionPlaceholder": "Enter department name"
+ },
+ "placeholders": {
+ "parentId": "Select parent department",
+ "name": "Enter department name",
+ "fullName": "Enter full department name",
+ "leader": "Enter leader",
+ "status": "Select status",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "name": "Please enter department name"
+ },
+ "dialog": {
+ "titleCreate": "Create Department",
+ "titleEdit": "Edit Department"
+ },
+ "messages": {
+ "pageTimeout": "Department loading timed out and waiting has stopped",
+ "detailFailed": "Failed to fetch department detail",
+ "parentSelfInvalid": "Parent department cannot be the current department"
+ }
+ },
+ "userLogin": {
+ "title": "Login Logs",
+ "search": {
+ "token": "Token",
+ "tokenPlaceholder": "Enter token",
+ "ip": "IP",
+ "ipPlaceholder": "Enter IP",
+ "system": "System",
+ "systemPlaceholder": "Enter system identifier",
+ "type": "Type",
+ "typePlaceholder": "Select type"
+ },
+ "table": {
+ "user": "User",
+ "token": "Token",
+ "ip": "IP",
+ "system": "System"
+ },
+ "types": {
+ "loginSuccess": "Login Success",
+ "loginFailed": "Login Failed",
+ "logout": "Logout",
+ "tokenRenew": "Token Renew"
+ }
+ },
+ "operationRecord": {
+ "title": "Operation Log",
+ "entity": "Operation Log",
+ "reportTitle": "Operation Log Report",
+ "search": {
+ "conditionPlaceholder": "Enter namespace",
+ "urlPlaceholder": "Enter API URL",
+ "clientIpPlaceholder": "Enter client IP",
+ "timeStart": "Start Date",
+ "timeEnd": "End Date"
+ },
+ "table": {
+ "namespace": "Namespace",
+ "url": "API URL",
+ "user": "User",
+ "clientIp": "Client IP",
+ "spendTime": "Latency (ms)",
+ "result": "Result",
+ "timestamp": "Operation Time"
+ },
+ "result": {
+ "success": "Success",
+ "failed": "Failed"
+ },
+ "detail": {
+ "appkey": "App Key",
+ "error": "Error",
+ "request": "Request Content",
+ "response": "Response Content"
+ },
+ "dialog": {
+ "titleDetail": "Operation Log Detail"
+ },
+ "messages": {
+ "detailFailed": "Failed to load operation log detail"
+ }
+ },
+ "aiParam": {
+ "title": "AI Params",
+ "subtitle": "Manage the current user's model access settings and defaults with cards.",
+ "entity": "AI Params",
+ "reportTitle": "AI Params Report",
+ "empty": "No AI parameters yet",
+ "buttons": {
+ "add": "Add Param"
+ },
+ "actions": {
+ "setDefault": "Set Default"
+ },
+ "fields": {
+ "baseUrl": "Base URL",
+ "lastValidateTime": "Last Validation",
+ "timeoutMs": "Timeout",
+ "streamingEnabled": "Streaming",
+ "maxTokens": "Max Tokens"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter parameter name",
+ "providerType": "Provider",
+ "providerTypePlaceholder": "Enter provider type",
+ "model": "Model",
+ "modelPlaceholder": "Enter model name",
+ "status": "Default Status"
+ },
+ "status": {
+ "default": "Default",
+ "candidate": "Candidate"
+ },
+ "validation": {
+ "valid": "Validated",
+ "invalid": "Invalid",
+ "notTested": "Not Tested"
+ },
+ "streaming": {
+ "enabled": "Streaming",
+ "disabled": "Non-streaming"
+ },
+ "table": {
+ "name": "Name",
+ "providerType": "Provider Type",
+ "model": "Model",
+ "status": "Default Status",
+ "validateStatus": "Validation Status",
+ "timeoutMs": "Timeout"
+ },
+ "summary": {
+ "title": "Runtime Summary",
+ "subtitle": "Overview of the active model, prompt, and MCP mounts",
+ "refresh": "Refresh Summary",
+ "activeModel": "Active Model",
+ "activePrompt": "Active Prompt",
+ "lastPromptUpdate": "Last updated {value}",
+ "enabledMcp": "Enabled MCP",
+ "enabledMcpCount": "{count} enabled",
+ "noMcp": "No mounts"
+ },
+ "dialog": {
+ "titleCreate": "Create AI Param",
+ "titleEdit": "Edit AI Param",
+ "titleDetail": "AI Param Detail",
+ "runtimeTitle": "Runtime Status",
+ "runtimeDescription": "Run a draft validation before saving. Runtime status is returned from the backend.",
+ "validateDraft": "Validate Draft",
+ "labels": {
+ "validateStatus": "Validation Status",
+ "lastValidateElapsedMs": "Validation Duration",
+ "lastValidateTime": "Last Validation Time",
+ "updateBy": "Updated By",
+ "updateTime": "Updated At",
+ "lastValidateMessage": "Validation Message",
+ "name": "Name",
+ "providerType": "Provider Type",
+ "baseUrl": "Base URL",
+ "apiKey": "API Key",
+ "model": "Model",
+ "temperature": "Temperature",
+ "topP": "Top P",
+ "maxTokens": "Max Tokens",
+ "timeoutMs": "Timeout (ms)",
+ "streamingEnabled": "Streaming",
+ "status": "Default Status",
+ "memo": "Remark"
+ },
+ "placeholders": {
+ "name": "Enter parameter name",
+ "providerType": "Select provider type",
+ "baseUrl": "Enter OpenAI-compatible base URL",
+ "apiKey": "Enter API key",
+ "model": "Enter model name",
+ "temperature": "Enter temperature",
+ "topP": "Enter topP",
+ "maxTokens": "Enter max tokens",
+ "timeoutMs": "Enter timeout",
+ "status": "Select default status",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "name": "Please enter a parameter name",
+ "providerType": "Please select a provider type",
+ "baseUrl": "Please enter a base URL",
+ "apiKey": "Please enter an API key",
+ "model": "Please enter a model name"
+ }
+ },
+ "messages": {
+ "setDefaultSuccess": "Default parameter updated",
+ "summaryTimeout": "Runtime summary timed out and waiting has stopped",
+ "summaryUnavailable": "Runtime summary is currently unavailable"
+ }
+ },
+ "aiPrompt": {
+ "title": "Prompts",
+ "subtitle": "Manage system prompts and scene-based user prompt templates with cards.",
+ "entity": "Prompt",
+ "reportTitle": "Prompt Report",
+ "empty": "No prompts yet",
+ "buttons": {
+ "add": "Add Prompt"
+ },
+ "fields": {
+ "sceneTag": "Scene {value}",
+ "systemPrompt": "System Prompt",
+ "userPromptTemplate": "User Prompt Template"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter prompt name",
+ "code": "Prompt Code",
+ "codePlaceholder": "Enter prompt code",
+ "scene": "Scene",
+ "scenePlaceholder": "Enter scene",
+ "status": "Status"
+ },
+ "table": {
+ "name": "Prompt Name",
+ "code": "Prompt Code",
+ "scene": "Scene",
+ "status": "Status",
+ "systemPrompt": "System Prompt",
+ "userPromptTemplate": "User Prompt Template"
+ },
+ "dialog": {
+ "titleCreate": "Create Prompt",
+ "titleEdit": "Edit Prompt",
+ "titleDetail": "Prompt Detail",
+ "defaultPreviewInput": "Please summarize the current input",
+ "previewTitle": "Render Preview",
+ "previewDescription": "Enter sample input and metadata to preview the rendered output.",
+ "previewAction": "Render Preview",
+ "previewResolvedVariables": "Resolved variables: {value}",
+ "previewNoVariables": "None",
+ "runtimeTitle": "Runtime Status",
+ "labels": {
+ "updateBy": "Updated By",
+ "updateTime": "Updated At",
+ "name": "Prompt Name",
+ "code": "Prompt Code",
+ "scene": "Scene",
+ "systemPrompt": "System Prompt",
+ "userPromptTemplate": "User Prompt Template",
+ "status": "Status",
+ "memo": "Remark"
+ },
+ "placeholders": {
+ "previewInput": "Enter sample input",
+ "metadata": "Enter JSON metadata, e.g. {\"path\":\"/system/aiPrompt\"}",
+ "renderedSystemPrompt": "Rendered system prompt",
+ "renderedUserPrompt": "Rendered user prompt",
+ "name": "Enter prompt name",
+ "code": "Enter prompt code",
+ "scene": "Enter scene",
+ "systemPrompt": "Enter system prompt",
+ "userPromptTemplate": "Enter user prompt template",
+ "status": "Select status",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "name": "Please enter a prompt name",
+ "code": "Please enter a prompt code",
+ "scene": "Please enter a scene",
+ "systemPrompt": "Please enter a system prompt",
+ "userPromptTemplate": "Please enter a user prompt template"
+ }
+ },
+ "messages": {
+ "previewFailed": "Failed to render preview"
+ }
+ },
+ "aiMcpMount": {
+ "title": "MCP Mounts",
+ "subtitle": "Maintain MCP mounts and health status for the current environment.",
+ "entity": "MCP Mount",
+ "empty": "No MCP mounts yet",
+ "buttons": {
+ "add": "Add Mount"
+ },
+ "fields": {
+ "target": "Target",
+ "lastTestTime": "Last Test Time",
+ "timeoutMs": "Timeout",
+ "lastInitElapsedMs": "Last Init Duration"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter mount name",
+ "transportType": "Transport Type",
+ "status": "Status"
+ },
+ "actions": {
+ "connectivityTest": "Connectivity Test",
+ "toolsPreview": "Tools Preview"
+ },
+ "health": {
+ "healthy": "Healthy",
+ "unhealthy": "Unhealthy",
+ "notTested": "Not Tested"
+ },
+ "groups": {
+ "builtin": {
+ "title": "Built-in Mount",
+ "description": "Platform built-in MCP capabilities."
+ },
+ "sse": {
+ "title": "SSE / HTTP Mount",
+ "description": "Remote MCP service connected through HTTP/SSE."
+ },
+ "stdio": {
+ "title": "STDIO Mount",
+ "description": "MCP service started and communicated through local commands."
+ }
+ },
+ "dialog": {
+ "titleCreate": "Create MCP Mount",
+ "titleEdit": "Edit MCP Mount",
+ "titleDetail": "MCP Mount Detail",
+ "runtimeTitle": "Runtime Status",
+ "draftTestTitle": "Draft Connectivity Test",
+ "draftTestDescription": "Test current draft settings before saving.",
+ "draftTestAction": "Test Current Settings",
+ "runtimeLabels": {
+ "healthStatus": "Health Status",
+ "lastTestTime": "Last Test Time",
+ "lastTestMessage": "Last Test Message",
+ "lastInitElapsedMs": "Last Init Duration",
+ "updateTime": "Updated At"
+ },
+ "labels": {
+ "name": "Mount Name",
+ "transportType": "Transport Type",
+ "status": "Status",
+ "serverUrl": "Server URL",
+ "endpoint": "SSE/HTTP Path",
+ "command": "Command",
+ "argsJson": "Command Args (JSON)",
+ "envJson": "Environment JSON",
+ "headersJson": "Headers JSON",
+ "builtinCode": "Built-in Code",
+ "requestTimeoutMs": "Request Timeout (ms)",
+ "sort": "Sort",
+ "memo": "Remark"
+ },
+ "placeholders": {
+ "name": "Enter mount name",
+ "transportType": "Select transport type",
+ "status": "Select status",
+ "serverUrl": "Enter server URL",
+ "endpoint": "Enter endpoint path",
+ "command": "Enter command",
+ "argsJson": "Enter JSON array, e.g. [\"server.js\"]",
+ "envJson": "Enter JSON object, e.g. {\"NODE_ENV\":\"production\"}",
+ "headersJson": "Enter JSON object, e.g. {\"Authorization\":\"Bearer ...\"}",
+ "builtinCode": "Enter built-in code",
+ "requestTimeoutMs": "Enter request timeout",
+ "sort": "Enter sort value",
+ "memo": "Enter remark"
+ },
+ "validation": {
+ "name": "Please enter a mount name",
+ "transportType": "Please select a transport type"
+ }
+ },
+ "toolsDrawer": {
+ "title": "MCP Tools Preview",
+ "currentMount": "Current Mount",
+ "description": "Preview tools exposed by the current mount and test them online.",
+ "refreshTools": "Refresh Tools",
+ "connectivityTest": "Connectivity Test",
+ "empty": "No tools available for the current mount",
+ "toolTest": "Test Tool",
+ "toolInputRequired": "Please enter tool input JSON",
+ "toolTestSuccess": "Tool call succeeded",
+ "toolTestFailed": "Tool call failed",
+ "toolsLoadFailed": "Failed to load tools",
+ "toolsTimeout": "Tool loading timed out and waiting has stopped",
+ "toolTestTimeout": "Tool call timed out and waiting has stopped",
+ "inputSchema": "Input Schema",
+ "inputJson": "Input JSON",
+ "inputJsonPlaceholder": "Enter JSON, e.g. {\"keyword\":\"task\"}",
+ "output": "Output",
+ "outputPlaceholder": "No output yet"
+ },
+ "messages": {
+ "connectivitySuccess": "Connectivity test succeeded",
+ "connectivityFailed": "Connectivity test failed",
+ "connectivityTimeout": "Connectivity test timed out and waiting has stopped",
+ "draftConnectivitySuccess": "Draft connectivity test succeeded",
+ "draftConnectivityFailed": "Draft connectivity test failed",
+ "toolsTimeout": "Tool list timed out and waiting has stopped",
+ "toolTestTimeout": "Tool call timed out and waiting has stopped",
+ "initElapsedMs": "Init duration {value} ms"
+ }
+ },
+ "aiObserve": {
+ "title": "AI Observe",
+ "summaryTitle": "AI Observe Summary",
+ "summaryDescription": "Observe AI call status, latency, token usage, and MCP tool execution.",
+ "reportTitle": "AI Observe Report",
+ "stats": {
+ "callCount": "Calls",
+ "avgElapsed": "Average Latency",
+ "totalTokens": "Total Tokens",
+ "toolSuccessRate": "Tool Success Rate",
+ "successFailure": "Success {success} / Failure {failure}",
+ "firstTokenLatency": "First token {value} ms",
+ "avgTokens": "Average {value} Tokens",
+ "toolCallFailure": "Calls {callCount} / Failure {failureCount}"
+ },
+ "search": {
+ "condition": "Keyword",
+ "conditionPlaceholder": "Enter request ID or prompt",
+ "requestId": "Request ID",
+ "requestIdPlaceholder": "Enter request ID",
+ "promptCode": "Prompt Code",
+ "promptCodePlaceholder": "Enter prompt code",
+ "user": "User",
+ "userPlaceholder": "Enter user ID",
+ "status": "Status",
+ "statusPlaceholder": "Select status"
+ },
+ "status": {
+ "running": "Running",
+ "completed": "Completed",
+ "failed": "Failed",
+ "aborted": "Aborted"
+ },
+ "detail": {
+ "title": "AI Observe Detail",
+ "requestId": "Request ID",
+ "sessionId": "Session ID",
+ "prompt": "Prompt",
+ "model": "Model",
+ "user": "User",
+ "status": "Status",
+ "mountedMcp": "Mounted MCP",
+ "configuredMcpCount": "Configured MCP Count",
+ "toolCallCount": "Tool Calls",
+ "toolSuccessFailure": "Success / Failure",
+ "elapsed": "Total Latency",
+ "firstTokenLatency": "First Token Latency",
+ "createTime": "Created At",
+ "updateTime": "Updated At",
+ "errorCategory": "Error Category",
+ "errorStage": "Error Stage",
+ "errorMessage": "Error Message",
+ "mcpLogs": "MCP Call Logs",
+ "inputSummary": "Input Summary",
+ "outputSummary": "Output Summary",
+ "emptyMcpLogs": "No MCP call logs"
+ },
+ "table": {
+ "requestId": "Request ID",
+ "prompt": "Prompt",
+ "model": "Model",
+ "user": "User",
+ "status": "Status",
+ "elapsed": "Latency",
+ "totalTokens": "Total Tokens",
+ "createTime": "Created At"
+ },
+ "messages": {
+ "detailTimeout": "AI observe detail timed out and waiting has stopped",
+ "mcpLogsTimeout": "MCP call logs timed out and waiting has stopped",
+ "detailFailed": "Failed to load AI observe detail",
+ "statsTimeout": "AI observe summary timed out and waiting has stopped",
+ "statsFailed": "Failed to load AI observe summary"
+ }
+ },
"role": {
"entity": "Role",
"reportTitle": "Role Report",
diff --git a/rsf-design/src/locales/langs/zh.json b/rsf-design/src/locales/langs/zh.json
index f9e4972..3dd220c 100644
--- a/rsf-design/src/locales/langs/zh.json
+++ b/rsf-design/src/locales/langs/zh.json
@@ -36,6 +36,7 @@
"tips": "鎻愮ず",
"cancel": "鍙栨秷",
"confirm": "纭畾",
+ "close": "鍏抽棴",
"logOutTips": "鎮ㄦ槸鍚﹁閫�鍑虹櫥褰�?",
"count": "鍏� {count} 鏉�",
"listSeparator": "銆�",
@@ -43,6 +44,7 @@
"search": "鏌ヨ",
"reset": "閲嶇疆",
"refresh": "鍒锋柊",
+ "reload": "閲嶆柊鍔犺浇",
"add": "鏂板",
"batchDelete": "鎵归噺鍒犻櫎",
"edit": "缂栬緫",
@@ -58,7 +60,8 @@
"collapse": "鏀惰捣",
"viewAll": "鏌ョ湅鍏ㄩ儴",
"save": "淇濆瓨",
- "submit": "鎻愪氦"
+ "submit": "鎻愪氦",
+ "initialize": "鍒濆鍖�"
},
"status": {
"enabled": "鍚敤",
@@ -113,6 +116,18 @@
"index": "搴忓彿",
"unit": "鍗曚綅",
"id": "ID",
+ "name": "鍚嶇О",
+ "code": "缂栫爜",
+ "status": "鐘舵��",
+ "memo": "澶囨敞",
+ "createBy": "鍒涘缓浜�",
+ "createTime": "鍒涘缓鏃堕棿",
+ "updateBy": "鏇存柊浜�",
+ "updateTime": "鏇存柊鏃堕棿",
+ "sort": "鎺掑簭",
+ "route": "璺敱",
+ "authority": "鏉冮檺鏍囪瘑",
+ "operation": "鎿嶄綔",
"wcs": "WCS",
"source": "鏉ユ簮",
"supplier": "渚涘簲鍟�",
@@ -207,15 +222,66 @@
"notice": {
"title": "閫氱煡",
"btnRead": "鏍囦负宸茶",
- "bar": [
- "閫氱煡",
- "娑堟伅",
- "浠e姙"
- ],
- "text": [
- "鏆傛棤"
- ],
- "viewAll": "鏌ョ湅鍏ㄩ儴"
+ "bar": {
+ "notice": "閫氱煡",
+ "message": "娑堟伅",
+ "todo": "浠e姙"
+ },
+ "emptyPrefix": "鏆傛棤",
+ "viewAll": "鏌ョ湅鍏ㄩ儴",
+ "actions": {
+ "viewAllNotice": "鏌ョ湅鍏ㄩ儴閫氱煡",
+ "viewAllMessage": "鏌ョ湅鍏ㄩ儴娑堟伅",
+ "viewAllTodo": "鏌ョ湅鍏ㄩ儴寰呭姙"
+ },
+ "samples": {
+ "notice": {
+ "addI18n": "鏂板鍥介檯鍖�",
+ "receiveMessage": "鍐锋湀鍛嗗憜缁欎綘鍙戜簡涓�鏉℃秷鎭�",
+ "newFollower": "灏忚偉鐚叧娉ㄤ簡浣�",
+ "addDocs": "鏂板浣跨敤鏂囨。",
+ "receiveMail": "灏忚偉鐚粰浣犲彂浜嗕竴灏侀偖浠�",
+ "menuMock": "鑿滃崟 mock 鏈湴鐪熷疄鏁版嵁"
+ },
+ "message": {
+ "chibupang": "姹犱笉鑳� 鍏虫敞浜嗕綘",
+ "tangbuku": "鍞愪笉鑻� 鍏虫敞浜嗕綘",
+ "zhongxiaoyu": "涓皬楸� 鍏虫敞浜嗕綘",
+ "hexiaohe": "浣曞皬鑽� 鍏虫敞浜嗕綘",
+ "suixuinian": "瑾惰娣� 鍏虫敞浜嗕綘",
+ "lengyuedaidai": "鍐锋湀鍛嗗憜 鍏虫敞浜嗕綘"
+ }
+ }
+ },
+ "components": {
+ "fastEnter": {
+ "quickLinks": "蹇�熼摼鎺�",
+ "invalidNavigation": "瀵艰埅閰嶇疆鏃犳晥锛氱己灏戣矾鐢卞悕绉版垨閾炬帴"
+ },
+ "dragVerify": {
+ "dragText": "鎸変綇婊戝潡鎷栧姩",
+ "successText": "楠岃瘉鎴愬姛"
+ },
+ "banner": {
+ "card": {
+ "viewDetails": "鏌ョ湅璇︽儏",
+ "cancel": "鍙栨秷"
+ },
+ "basic": {
+ "view": "鏌ョ湅",
+ "backgroundAlt": "鑳屾櫙鍥剧墖"
+ }
+ },
+ "cropper": {
+ "chooseImage": "閫夋嫨鍥剧墖",
+ "clearImage": "娓呴櫎",
+ "previewAlt": "棰勮鍥�",
+ "downloadImage": "涓嬭浇鍥剧墖",
+ "coverImage": "灏侀潰鍥剧墖",
+ "imageLoadFailed": "鍥剧墖鍔犺浇澶辫触锛�",
+ "downloadLog": "涓嬭浇鍥剧墖",
+ "fileName": "image.png"
+ }
},
"worktab": {
"btn": {
@@ -287,6 +353,18 @@
},
"lockScreen": {
"pwdError": "瀵嗙爜閿欒",
+ "avatarAlt": "鐢ㄦ埛澶村儚",
+ "devTools": {
+ "title": "绯荤粺宸查攣瀹�",
+ "descriptionLine1": "妫�娴嬪埌寮�鍙戣�呭伐鍏峰凡鎵撳紑",
+ "descriptionLine2": "涓轰簡绯荤粺瀹夊叏锛岃鍏抽棴寮�鍙戣�呭伐鍏峰悗缁х画浣跨敤",
+ "footer": "Security Lock Activated"
+ },
+ "errors": {
+ "decryptFailed": "瀵嗙爜瑙e瘑澶辫触锛�",
+ "validationFailed": "琛ㄥ崟楠岃瘉澶辫触锛�",
+ "updateStoreFailed": "鏇存柊 store 澶辫触锛�"
+ },
"lock": {
"inputPlaceholder": "璇疯緭鍏ラ攣灞忓瘑鐮�",
"btnText": "閿佸畾"
@@ -469,7 +547,8 @@
"subsystemFlowTemplate": "瀛愮郴缁熸祦绋嬫ā鏉�",
"flowStepTemplate": "娴佺▼姝ラ妯℃澘",
"taskPathTemplateMerge": "浠诲姟璺緞妯℃澘鍚堝苟",
- "missionFlowStepInstance": "浠诲姟娴佺▼姝ラ"
+ "missionFlowStepInstance": "浠诲姟娴佺▼姝ラ",
+ "aiManagementCenter": "AI绠$悊涓績"
},
"ai": {
"drawer": {
@@ -584,13 +663,18 @@
},
"index": "搴忓彿",
"id": "ID",
+ "name": "鍚嶇О",
+ "code": "缂栫爜",
+ "keyword": "鍏抽敭瀛�",
"operation": "鎿嶄綔",
"status": "鐘舵��",
"type": "绫诲瀷",
"source": "鏉ユ簮",
"supplier": "渚涘簲鍟�",
"supplierBatch": "渚涘簲鍟嗘壒娆�",
+ "memo": "澶囨敞",
"remark": "澶囨敞",
+ "createBy": "鍒涘缓浜�",
"updateBy": "鏇存柊浜�",
"updateTime": "鏇存柊鏃堕棿",
"createTime": "鍒涘缓鏃堕棿",
@@ -615,6 +699,11 @@
"requestTimeoutStopped": "璇锋眰瓒呮椂锛屽凡鍋滄绛夊緟",
"exportTimeoutStopped": "瀵煎嚭璇锋眰瓒呮椂锛屽凡鍋滄绛夊緟",
"printTimeoutStopped": "鎵撳嵃鏁版嵁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "routeRenderFailedTitle": "椤甸潰鍔犺浇澶辫触",
+ "routeRenderFailed": "椤甸潰娓叉煋澶辫触锛岃绋嶅悗閲嶈瘯",
+ "systemUpgradeTitle": "绯荤粺鍗囩骇鎻愮ず",
+ "systemUpgradeIntro": "绯荤粺宸插崌绾у埌 {version} 鐗堟湰锛屽缓璁煡鐪嬩互涓嬫洿鏂板唴瀹癸細",
+ "systemUpgradeRelogin": "鏈鍗囩骇闇�瑕侀噸鏂扮櫥褰曚互搴旂敤鏈�鏂板彉鏇淬��",
"exportInvalidDataType": "鏁版嵁蹇呴』鏄暟缁勬牸寮�",
"exportNoData": "娌℃湁鍙鍑虹殑鏁版嵁",
"exportExceedMaxRows": "鏁版嵁琛屾暟瓒呰繃闄愬埗锛坽maxRows}琛岋級",
@@ -628,7 +717,321 @@
"exportWorkbookComments": "鐢辩郴缁熻嚜鍔ㄧ敓鎴�"
},
"pages": {
- "system": {
+ "systemDraft": {
+ "aiParam": {
+ "title": "AI 鍙傛暟",
+ "subtitle": "鎸夊崱鐗囩鐞嗗綋鍓嶇敤鎴风殑妯″瀷鎺ュ叆鍙傛暟涓庨粯璁ら厤缃��",
+ "entity": "AI 鍙傛暟",
+ "reportTitle": "AI 鍙傛暟鎶ヨ〃",
+ "empty": "鏆傛棤 AI 鍙傛暟",
+ "buttons": {
+ "add": "鏂板缓鍙傛暟"
+ },
+ "actions": {
+ "setDefault": "璁句负榛樿"
+ },
+ "fields": {
+ "baseUrl": "鍩虹鍦板潃",
+ "lastValidateTime": "鏈�杩戞牎楠�",
+ "timeoutMs": "瓒呮椂鏃堕棿",
+ "streamingEnabled": "娴佸紡鍝嶅簲",
+ "maxTokens": "鏈�澶� Token"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ュ弬鏁板悕绉�",
+ "providerType": "鎻愪緵鏂�",
+ "providerTypePlaceholder": "璇疯緭鍏ユ彁渚涙柟绫诲瀷",
+ "model": "妯″瀷",
+ "modelPlaceholder": "璇疯緭鍏ユā鍨嬪悕绉�",
+ "status": "榛樿鐘舵��"
+ },
+ "status": {
+ "default": "榛樿",
+ "candidate": "鍊欓��"
+ },
+ "validation": {
+ "valid": "宸叉牎楠�",
+ "invalid": "寮傚父",
+ "notTested": "鏈牎楠�"
+ },
+ "streaming": {
+ "enabled": "娴佸紡鍝嶅簲",
+ "disabled": "闈炴祦寮�"
+ },
+ "table": {
+ "name": "鍙傛暟鍚嶇О",
+ "providerType": "鎻愪緵鏂圭被鍨�",
+ "model": "妯″瀷鍚嶇О",
+ "status": "榛樿鐘舵��",
+ "validateStatus": "鏍¢獙鐘舵��",
+ "timeoutMs": "瓒呮椂鏃堕棿"
+ },
+ "summary": {
+ "title": "杩愯鏃舵憳瑕�",
+ "subtitle": "褰撳墠鐢熸晥鐨勬ā鍨嬨�丳rompt 涓� MCP 鎸傝浇姒傚喌",
+ "refresh": "鍒锋柊鎽樿",
+ "activeModel": "褰撳墠妯″瀷",
+ "activePrompt": "褰撳墠 Prompt",
+ "lastPromptUpdate": "鏈�杩戞洿鏂版椂闂� {value}",
+ "enabledMcp": "宸插惎鐢� MCP",
+ "enabledMcpCount": "{count} 涓�",
+ "noMcp": "鏆傛棤鎸傝浇"
+ },
+ "dialog": {
+ "titleCreate": "鏂板缓 AI 鍙傛暟",
+ "titleEdit": "缂栬緫 AI 鍙傛暟",
+ "titleDetail": "AI 鍙傛暟璇︽儏",
+ "runtimeTitle": "杩愯鏃剁姸鎬�",
+ "runtimeDescription": "淇濆瓨鍓嶅彲鍏堟墽琛岃崏绋挎牎楠岋紝杩愯鏃剁姸鎬佺敱鍚庣鐪熷疄杩斿洖銆�",
+ "validateDraft": "鑽夌鏍¢獙",
+ "labels": {
+ "validateStatus": "鏍¢獙鐘舵��",
+ "lastValidateElapsedMs": "鏈�杩戞牎楠岃�楁椂",
+ "lastValidateTime": "鏈�杩戞牎楠屾椂闂�",
+ "updateBy": "鏈�杩戞洿鏂颁汉",
+ "updateTime": "鏈�杩戞洿鏂版椂闂�",
+ "lastValidateMessage": "鏈�杩戞牎楠屼俊鎭�",
+ "name": "鍙傛暟鍚嶇О",
+ "providerType": "鎻愪緵鏂圭被鍨�",
+ "baseUrl": "鍩虹鍦板潃",
+ "apiKey": "API Key",
+ "model": "妯″瀷鍚嶇О",
+ "temperature": "Temperature",
+ "topP": "Top P",
+ "maxTokens": "鏈�澶� Token",
+ "timeoutMs": "瓒呮椂鏃堕棿(ms)",
+ "streamingEnabled": "娴佸紡鍝嶅簲",
+ "status": "榛樿鐘舵��",
+ "memo": "澶囨敞"
+ },
+ "placeholders": {
+ "name": "璇疯緭鍏ュ弬鏁板悕绉�",
+ "providerType": "璇烽�夋嫨鎻愪緵鏂圭被鍨�",
+ "baseUrl": "璇疯緭鍏ュ吋瀹� OpenAI 鐨勫熀纭�鍦板潃",
+ "apiKey": "璇疯緭鍏� API Key",
+ "model": "璇疯緭鍏ユā鍨嬪悕绉�",
+ "temperature": "璇疯緭鍏� temperature",
+ "topP": "璇疯緭鍏� topP",
+ "maxTokens": "璇疯緭鍏ユ渶澶� token",
+ "timeoutMs": "璇疯緭鍏ヨ秴鏃舵椂闂�",
+ "status": "璇烽�夋嫨榛樿鐘舵��",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "name": "璇疯緭鍏ュ弬鏁板悕绉�",
+ "providerType": "璇烽�夋嫨鎻愪緵鏂圭被鍨�",
+ "baseUrl": "璇疯緭鍏ュ熀纭�鍦板潃",
+ "apiKey": "璇疯緭鍏� API Key",
+ "model": "璇疯緭鍏ユā鍨嬪悕绉�"
+ }
+ },
+ "messages": {
+ "setDefaultSuccess": "榛樿鍙傛暟宸叉洿鏂�",
+ "summaryTimeout": "杩愯鏃舵憳瑕佸姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+ "summaryUnavailable": "杩愯鏃舵憳瑕佹殏涓嶅彲鐢�"
+ }
+ },
+ "aiPrompt": {
+ "title": "Prompt 绠$悊",
+ "subtitle": "鎸夊崱鐗囩淮鎶ょ郴缁熸彁绀鸿瘝妯℃澘涓庡満鏅寲鐢ㄦ埛鎻愮ず璇嶃��",
+ "entity": "Prompt",
+ "reportTitle": "Prompt 绠$悊鎶ヨ〃",
+ "empty": "鏆傛棤 Prompt",
+ "buttons": {
+ "add": "鏂板缓 Prompt"
+ },
+ "fields": {
+ "sceneTag": "鍦烘櫙 {value}",
+ "systemPrompt": "绯荤粺鎻愮ず璇�",
+ "userPromptTemplate": "鐢ㄦ埛鎻愮ず璇嶆ā鏉�"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏� Prompt 鍚嶇О",
+ "code": "Prompt 缂栫爜",
+ "codePlaceholder": "璇疯緭鍏� Prompt 缂栫爜",
+ "scene": "鍦烘櫙鏍囪瘑",
+ "scenePlaceholder": "璇疯緭鍏ュ満鏅爣璇�",
+ "status": "鐘舵��"
+ },
+ "table": {
+ "name": "Prompt 鍚嶇О",
+ "code": "Prompt 缂栫爜",
+ "scene": "鍦烘櫙鏍囪瘑",
+ "status": "鐘舵��",
+ "systemPrompt": "绯荤粺鎻愮ず璇�",
+ "userPromptTemplate": "鐢ㄦ埛鎻愮ず璇嶆ā鏉�"
+ },
+ "dialog": {
+ "titleCreate": "鏂板缓 Prompt",
+ "titleEdit": "缂栬緫 Prompt",
+ "titleDetail": "Prompt 璇︽儏",
+ "defaultPreviewInput": "璇锋牴鎹綋鍓嶈緭鍏ョ粰鍑烘憳瑕�",
+ "previewTitle": "娓叉煋棰勮",
+ "previewDescription": "杈撳叆绀轰緥鍐呭鍜� metadata锛岀洿鎺ラ瑙堟渶缁堟覆鏌撶粨鏋溿��",
+ "previewAction": "娓叉煋棰勮",
+ "previewResolvedVariables": "宸茶В鏋愬彉閲忥細{value}",
+ "previewNoVariables": "鏃�",
+ "runtimeTitle": "杩愯鏃剁姸鎬�",
+ "labels": {
+ "updateBy": "鏈�杩戞洿鏂颁汉",
+ "updateTime": "鏈�杩戞洿鏂版椂闂�",
+ "name": "Prompt 鍚嶇О",
+ "code": "Prompt 缂栫爜",
+ "scene": "鍦烘櫙鏍囪瘑",
+ "systemPrompt": "绯荤粺鎻愮ず璇�",
+ "userPromptTemplate": "鐢ㄦ埛鎻愮ず璇嶆ā鏉�",
+ "status": "鐘舵��",
+ "memo": "澶囨敞"
+ },
+ "placeholders": {
+ "previewInput": "璇疯緭鍏ョず渚嬭緭鍏ュ唴瀹�",
+ "metadata": "璇疯緭鍏� JSON metadata锛屼緥濡� {\"path\":\"/system/aiPrompt\"}",
+ "renderedSystemPrompt": "绯荤粺鎻愮ず璇嶆覆鏌撶粨鏋�",
+ "renderedUserPrompt": "鐢ㄦ埛鎻愮ず璇嶆覆鏌撶粨鏋�",
+ "name": "璇疯緭鍏� Prompt 鍚嶇О",
+ "code": "璇疯緭鍏� Prompt 缂栫爜",
+ "scene": "璇疯緭鍏ュ満鏅爣璇�",
+ "systemPrompt": "璇疯緭鍏ョ郴缁熸彁绀鸿瘝",
+ "userPromptTemplate": "璇疯緭鍏ョ敤鎴锋彁绀鸿瘝妯℃澘",
+ "status": "璇烽�夋嫨鐘舵��",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "name": "璇疯緭鍏� Prompt 鍚嶇О",
+ "code": "璇疯緭鍏� Prompt 缂栫爜",
+ "scene": "璇疯緭鍏ュ満鏅爣璇�",
+ "systemPrompt": "璇疯緭鍏ョ郴缁熸彁绀鸿瘝",
+ "userPromptTemplate": "璇疯緭鍏ョ敤鎴锋彁绀鸿瘝妯℃澘"
+ }
+ },
+ "messages": {
+ "previewFailed": "娓叉煋棰勮澶辫触"
+ }
+ },
+ "aiMcpMount": {
+ "title": "MCP 鎸傝浇",
+ "subtitle": "缁存姢褰撳墠鐜鐨� MCP 鏈嶅姟鎸傝浇涓庡仴搴风姸鎬併��",
+ "entity": "MCP 鎸傝浇",
+ "empty": "鏆傛棤 MCP 鎸傝浇",
+ "buttons": {
+ "add": "鏂板鎸傝浇"
+ },
+ "fields": {
+ "target": "鐩爣",
+ "lastTestTime": "鏈�杩戞祴璇曟椂闂�",
+ "timeoutMs": "璇锋眰瓒呮椂",
+ "lastInitElapsedMs": "鏈�杩戝垵濮嬪寲鑰楁椂"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ユ寕杞藉悕绉�",
+ "transportType": "浼犺緭绫诲瀷",
+ "status": "鐘舵��"
+ },
+ "actions": {
+ "connectivityTest": "杩為�氭�ф祴璇�",
+ "toolsPreview": "宸ュ叿棰勮"
+ },
+ "health": {
+ "healthy": "鍋ュ悍",
+ "unhealthy": "寮傚父",
+ "notTested": "鏈祴璇�"
+ },
+ "groups": {
+ "builtin": {
+ "title": "鍐呯疆鎸傝浇",
+ "description": "骞冲彴鍐呯疆鐨� MCP 鑳藉姏闆嗗悎銆�"
+ },
+ "sse": {
+ "title": "SSE / HTTP 鎸傝浇",
+ "description": "閫氳繃 HTTP/SSE 鍗忚鎺ュ叆鐨勮繙绋� MCP 鏈嶅姟銆�"
+ },
+ "stdio": {
+ "title": "STDIO 鎸傝浇",
+ "description": "閫氳繃鏈湴鍛戒护鎷夎捣骞朵娇鐢ㄦ爣鍑嗚緭鍏ヨ緭鍑洪�氫俊鐨� MCP 鏈嶅姟銆�"
+ }
+ },
+ "dialog": {
+ "titleCreate": "鏂板缓鎸傝浇",
+ "titleEdit": "缂栬緫鎸傝浇",
+ "titleDetail": "鎸傝浇璇︽儏",
+ "draftTestTitle": "鑽夌杩為�氭�ф祴璇�",
+ "draftTestDescription": "淇濆瓨鍓嶅厛鏍¢獙褰撳墠鎸傝浇閰嶇疆鏄惁鍙繛閫氥��",
+ "draftTestAction": "鑽夌杩為�氭�ф祴璇�",
+ "runtimeTitle": "杩愯鏃剁姸鎬�",
+ "runtimeLabels": {
+ "healthStatus": "鍋ュ悍鐘舵��",
+ "lastTestTime": "鏈�杩戞祴璇曟椂闂�",
+ "lastInitElapsedMs": "鏈�杩戝垵濮嬪寲鑰楁椂",
+ "updateTime": "鏈�杩戞洿鏂版椂闂�",
+ "lastTestMessage": "鏈�杩戞祴璇曚俊鎭�"
+ },
+ "labels": {
+ "name": "鍚嶇О",
+ "transportType": "浼犺緭绫诲瀷",
+ "builtinCode": "鍐呯疆 MCP 缂栫爜",
+ "serverUrl": "鏈嶅姟鍦板潃",
+ "endpoint": "SSE 绔偣",
+ "headersJson": "璇锋眰澶� JSON",
+ "command": "鍛戒护",
+ "argsJson": "鍛戒护鍙傛暟 JSON",
+ "envJson": "鐜鍙橀噺 JSON",
+ "requestTimeoutMs": "璇锋眰瓒呮椂(ms)",
+ "sort": "鎺掑簭",
+ "status": "鐘舵��",
+ "memo": "澶囨敞"
+ },
+ "placeholders": {
+ "name": "璇疯緭鍏ュ悕绉�",
+ "transportType": "璇烽�夋嫨浼犺緭绫诲瀷",
+ "builtinCode": "璇疯緭鍏ュ唴缃� MCP 缂栫爜",
+ "serverUrl": "璇疯緭鍏ユ湇鍔″湴鍧�",
+ "endpoint": "璇疯緭鍏� SSE 绔偣",
+ "headersJson": "璇疯緭鍏ヨ姹傚ご JSON",
+ "command": "璇疯緭鍏ュ懡浠�",
+ "argsJson": "璇疯緭鍏ュ懡浠ゅ弬鏁� JSON",
+ "envJson": "璇疯緭鍏ョ幆澧冨彉閲� JSON",
+ "requestTimeoutMs": "璇疯緭鍏ヨ姹傝秴鏃�",
+ "sort": "璇疯緭鍏ユ帓搴�",
+ "status": "璇烽�夋嫨鐘舵��",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "name": "璇疯緭鍏ュ悕绉�",
+ "transportType": "璇烽�夋嫨浼犺緭绫诲瀷"
+ }
+ },
+ "toolsDrawer": {
+ "title": "MCP 宸ュ叿棰勮",
+ "currentMount": "褰撳墠鎸傝浇",
+ "description": "鍙瑙堝伐鍏峰垪琛紝骞跺宸ュ叿鍏ュ弬鍋氳仈璋冩祴璇曘��",
+ "refreshTools": "鍒锋柊宸ュ叿",
+ "connectivityTest": "杩為�氭�ф祴璇�",
+ "empty": "鏆傛棤宸ュ叿淇℃伅",
+ "toolTest": "宸ュ叿娴嬭瘯",
+ "inputJson": "杈撳叆鍙傛暟 JSON",
+ "inputJsonPlaceholder": "璇疯緭鍏� JSON锛屼緥濡� {\"taskCode\":\"TK001\"}",
+ "output": "宸ュ叿杈撳嚭",
+ "outputPlaceholder": "宸ュ叿杈撳嚭浼氭樉绀哄湪杩欓噷",
+ "inputSchema": "杈撳叆 Schema",
+ "toolInputRequired": "璇疯緭鍏ュ伐鍏锋祴璇曞叆鍙� JSON",
+ "toolTestSuccess": "宸ュ叿娴嬭瘯鎴愬姛",
+ "toolTestFailed": "宸ュ叿娴嬭瘯澶辫触",
+ "toolsLoadFailed": "鑾峰彇宸ュ叿鍒楄〃澶辫触"
+ },
+ "messages": {
+ "connectivityTimeout": "杩為�氭�ф祴璇曡秴鏃讹紝宸插仠姝㈢瓑寰�",
+ "connectivitySuccess": "杩為�氭�ф祴璇曟垚鍔�",
+ "connectivityFailed": "杩為�氭�ф祴璇曞け璐�",
+ "draftConnectivitySuccess": "鑽夌杩為�氭�ф祴璇曟垚鍔�",
+ "draftConnectivityFailed": "鑽夌杩為�氭�ф祴璇曞け璐�",
+ "toolsTimeout": "宸ュ叿鍒楄〃鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "toolTestTimeout": "宸ュ叿娴嬭瘯瓒呮椂锛屽凡鍋滄绛夊緟",
+ "initElapsedMs": "鍒濆鍖栬�楁椂 {value} ms"
+ }
+ },
"role": {
"entity": "瑙掕壊",
"reportTitle": "瑙掕壊绠$悊鎶ヨ〃",
@@ -723,6 +1126,98 @@
}
},
"orders": {
+ "common": {
+ "orderCode": "鍗曟嵁缂栧彿",
+ "trackCode": "杩借釜鐮�"
+ },
+ "asnOrderItem": {
+ "reportTitle": "鏀惰揣鏄庣粏鎶ヨ〃",
+ "sourceTitle": "褰撳墠鏉ユ簮",
+ "sourceLabel": "鍏ュ簱閫氱煡鍗旾D锛歿id}",
+ "orderType": {
+ "in": "鍏ュ簱",
+ "out": "鍑哄簱"
+ },
+ "ntyStatus": {
+ "notReported": "鏈笂鎶�",
+ "reported": "宸蹭笂鎶�"
+ },
+ "search": {
+ "conditionPlaceholder": "璇疯緭鍏� PO 鍗曞彿/鐗╂枡缂栫爜/鐗╂枡鍚嶇О/渚涘簲鍟�",
+ "poCode": "PO鍗曞彿",
+ "poCodePlaceholder": "璇疯緭鍏� PO 鍗曞彿",
+ "orderCode": "ASN鍗曞彿",
+ "orderCodePlaceholder": "璇疯緭鍏� ASN 鍗曞彿",
+ "platWorkCode": "璁″垝璺熻釜鍙�",
+ "platWorkCodePlaceholder": "璇疯緭鍏ヨ鍒掕窡韪彿",
+ "platItemId": "琛屽彿",
+ "platItemIdPlaceholder": "璇疯緭鍏ヨ鍙�",
+ "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+ "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+ "splrBatchPlaceholder": "璇疯緭鍏ヤ緵搴斿晢鎵规",
+ "stockUnit": "搴撳瓨鍗曚綅",
+ "stockUnitPlaceholder": "璇疯緭鍏ュ簱瀛樺崟浣�",
+ "ntyStatus": "涓婃姤鐘舵��",
+ "createTimeRange": "鍒涘缓鏃堕棿",
+ "updateTimeRange": "鏇存柊鏃堕棿",
+ "startTime": "寮�濮嬫椂闂�",
+ "endTime": "缁撴潫鏃堕棿",
+ "rangeSeparator": "鑷�"
+ },
+ "table": {
+ "poCode": "PO鍗曞彿",
+ "wkType": "涓氬姟绫诲瀷",
+ "type": "鍗曟嵁绫诲瀷",
+ "purchaseOrg": "閲囪喘缁勭粐",
+ "purchaseUser": "閲囪喘鍛�",
+ "platWorkCode": "璁″垝璺熻釜鍙�",
+ "platItemId": "琛屽彿",
+ "stockUnit": "搴撳瓨鍗曚綅",
+ "anfme": "閫佽揣鏁伴噺",
+ "qty": "宸叉敹鏁伴噺",
+ "targetWarehouseId": "寤鸿鐩爣浠�",
+ "businessTime": "涓氬姟鏃堕棿"
+ },
+ "detail": {
+ "title": "鏀惰揣鏄庣粏璇︽儏",
+ "baseInfo": "鍩虹淇℃伅",
+ "itemInfo": "鏄庣粏淇℃伅",
+ "auditInfo": "瀹¤淇℃伅",
+ "extendFields": "鎵╁睍瀛楁",
+ "poCode": "PO鍗曞彿",
+ "orderCode": "ASN鍗曞彿",
+ "wkType": "涓氬姟绫诲瀷",
+ "orderType": "鍗曟嵁绫诲瀷",
+ "purchaseOrg": "閲囪喘缁勭粐",
+ "purchaseUser": "閲囪喘鍛�",
+ "supplierId": "渚涘簲鍟咺D",
+ "supplierName": "渚涘簲鍟嗗悕绉�",
+ "businessTime": "涓氬姟鏃堕棿",
+ "targetWarehouseId": "寤鸿鐩爣浠�",
+ "ntyStatus": "涓婃姤鐘舵��",
+ "platItemId": "璁″垝琛屽彿",
+ "platWorkCode": "璁″垝璺熻釜鍙�",
+ "spec": "瑙勬牸",
+ "model": "鍨嬪彿",
+ "barcode": "鏉″舰鐮�",
+ "qrcode": "浜岀淮鐮�",
+ "packName": "鍖呰鍚嶇О",
+ "stockUnit": "搴撳瓨鍗曚綅",
+ "purUnit": "閲囪喘鍗曚綅",
+ "anfme": "閫佽揣鏁伴噺",
+ "qty": "宸叉敹鏁伴噺",
+ "purQty": "閲囪喘鏁伴噺",
+ "prodTime": "鐢熶骇鏃ユ湡",
+ "isptResult": "璐ㄦ缁撴灉",
+ "sourceWarehouseId": "鏉ユ簮浠撳簱"
+ },
+ "messages": {
+ "detailTimeout": "鏀惰揣鏄庣粏璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "detailFailed": "鑾峰彇鏀惰揣鏄庣粏璇︽儏澶辫触",
+ "pageTimeout": "鏀惰揣鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "noExportData": "鏆傛棤鍙鍑虹殑鏁版嵁"
+ }
+ },
"asnOrder": {
"reportTitle": "鍏ュ簱閫氱煡鍗曟姤琛�",
"entity": "鍏ュ簱閫氱煡鍗�",
@@ -832,6 +1327,258 @@
"receivedQtyTotal": "鏀惰揣鏁伴噺"
}
},
+ "asnOrderLog": {
+ "table": {
+ "poId": "PO鍗旾D",
+ "type": "鍗曟嵁绫诲瀷",
+ "wkType": "涓氬姟绫诲瀷",
+ "anfme": "閫佽揣鏁伴噺",
+ "qty": "宸叉敹鏁伴噺",
+ "logisNo": "鐗╂祦鍗曞彿",
+ "arrTime": "棰勮鍒拌揪鏃堕棿",
+ "rleStatus": "閲婃斁鐘舵��",
+ "exceStatus": "鎵ц鐘舵��"
+ }
+ },
+ "asnOrderItemLog": {
+ "reportTitle": "鏀惰揣鍘嗗彶鏄庣粏鎶ヨ〃",
+ "table": {
+ "asnCode": "ASN鍗曞彿",
+ "platItemId": "骞冲彴琛屽彿",
+ "poDetlId": "PO鍗曟槑缁咺D",
+ "poCode": "PO鍗曞彿",
+ "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "maktx": "鐗╂枡鍚嶇О",
+ "anfme": "閫佽揣鏁伴噺",
+ "stockUnit": "搴撳瓨鍗曚綅",
+ "purQty": "閲囪喘鏁伴噺",
+ "purUnit": "閲囪喘鍗曚綅",
+ "qty": "宸叉敹鏁伴噺",
+ "splrCode": "渚涘簲鍟嗙紪鐮�",
+ "splrBatch": "渚涘簲鍟嗘壒娆�",
+ "splrName": "渚涘簲鍟嗗悕绉�",
+ "qrcode": "浜岀淮鐮�",
+ "trackCode": "璺熻釜鐮�",
+ "barcode": "鏉″舰鐮�",
+ "packName": "鍖呰鍚嶇О",
+ "ntyStatus": "涓婃姤鐘舵��"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏SN鍗曞彿/PO鍗曞彿/鐗╂枡缂栫爜",
+ "logId": "鏃ュ織ID",
+ "logIdPlaceholder": "璇疯緭鍏ユ棩蹇桰D",
+ "asnCodePlaceholder": "璇疯緭鍏SN鍗曞彿",
+ "poCodePlaceholder": "璇疯緭鍏O鍗曞彿",
+ "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+ "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+ "splrBatchPlaceholder": "璇疯緭鍏ヤ緵搴斿晢鎵规"
+ },
+ "status": {
+ "notReported": "鏈笂鎶�",
+ "reported": "宸蹭笂鎶�",
+ "partialReported": "閮ㄥ垎涓婃姤"
+ }
+ },
+ "outStock": {
+ "reportTitle": "鍑哄簱鍗曟姤琛�",
+ "entity": "鍑哄簱鍗�",
+ "type": {
+ "out": "鍑哄簱鍗�"
+ },
+ "businessType": {
+ "salesOut": "閿�鍞嚭搴撳崟",
+ "transferOut": "璋冩嫧鍑哄簱鍗�",
+ "stockOut": "搴撳瓨鍑哄簱鍗�",
+ "preOut": "澶囪揣鍑哄簱鍗�"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ュ嚭搴撳崟鍙�/PO鍗曞彿/瀹㈡埛",
+ "code": "鍑哄簱鍗曞彿",
+ "codePlaceholder": "璇疯緭鍏ュ嚭搴撳崟鍙�",
+ "poCode": "PO鍗曞彿",
+ "poCodePlaceholder": "璇疯緭鍏O鍗曞彿",
+ "wkType": "涓氬姟绫诲瀷",
+ "wkTypePlaceholder": "璇烽�夋嫨涓氬姟绫诲瀷",
+ "exceStatus": "鍗曟嵁鐘舵��",
+ "exceStatusPlaceholder": "璇烽�夋嫨鍗曟嵁鐘舵��",
+ "rleStatus": "閲婃斁鐘舵��",
+ "rleStatusPlaceholder": "璇烽�夋嫨閲婃斁鐘舵��",
+ "logisNo": "鐗╂祦鍗曞彿",
+ "logisNoPlaceholder": "璇疯緭鍏ョ墿娴佸崟鍙�",
+ "customerName": "瀹㈡埛鍚嶇О",
+ "customerNamePlaceholder": "璇疯緭鍏ュ鎴峰悕绉�",
+ "saleOrgName": "閿�鍞粍缁�",
+ "saleOrgNamePlaceholder": "璇疯緭鍏ラ攢鍞粍缁�",
+ "memo": "澶囨敞",
+ "memoPlaceholder": "璇疯緭鍏ュ娉�"
+ },
+ "status": {
+ "initialized": "鍒濆鍖�",
+ "pending": "寰呭鐞�",
+ "generated": "鐢熸垚宸ヤ綔妗�",
+ "running": "浣滀笟涓�",
+ "completed": "宸插畬鎴�",
+ "cancelled": "鍙栨秷",
+ "released": "宸查噴鏀�"
+ },
+ "actions": {
+ "view": "鏌ョ湅璇︽儏",
+ "items": "鏄庣粏",
+ "print": "鎵撳嵃",
+ "complete": "瀹屾垚",
+ "cancel": "鍙栨秷",
+ "delete": "鍒犻櫎"
+ },
+ "table": {
+ "code": "鍑哄簱鍗曞彿",
+ "poCode": "PO鍗曞彿",
+ "type": "鍑哄簱绫诲瀷",
+ "wkType": "涓氬姟绫诲瀷",
+ "customerName": "瀹㈡埛",
+ "saleOrgName": "閿�鍞粍缁�",
+ "anfme": "搴斿嚭鏁伴噺",
+ "workQty": "鎵ц鏁伴噺",
+ "qty": "宸插嚭鏁伴噺",
+ "logisNo": "鐗╂祦鍗曞彿",
+ "rleStatus": "閲婃斁鐘舵��",
+ "exceStatus": "鍗曟嵁鐘舵��",
+ "updateTime": "鏇存柊鏃堕棿"
+ },
+ "detail": {
+ "title": "鍑哄簱鍗曡鎯�",
+ "baseInfo": "鍩虹淇℃伅",
+ "auditInfo": "瀹¤淇℃伅",
+ "items": "鍗曟嵁鏄庣粏",
+ "count": "鍏� {count} 鏉�",
+ "code": "鍑哄簱鍗曞彿",
+ "poCode": "PO鍗曞彿",
+ "type": "鍗曟嵁绫诲瀷",
+ "wkType": "涓氬姟绫诲瀷",
+ "exceStatus": "鍗曟嵁鐘舵��",
+ "rleStatus": "閲婃斁鐘舵��",
+ "logisNo": "鐗╂祦鍗曞彿",
+ "businessTime": "涓氬姟鏃堕棿",
+ "saleOrgName": "閿�鍞粍缁�",
+ "saleUserName": "閿�鍞憳",
+ "customerId": "瀹㈡埛缂栫爜",
+ "customerName": "瀹㈡埛鍚嶇О",
+ "stockOrgName": "浠撳簱缁勭粐",
+ "anfme": "搴斿嚭鏁伴噺",
+ "workQty": "鎵ц鏁伴噺",
+ "qty": "宸插嚭鏁伴噺",
+ "memo": "澶囨敞",
+ "createBy": "鍒涘缓浜�",
+ "createTime": "鍒涘缓鏃堕棿",
+ "updateBy": "淇敼浜�",
+ "updateTime": "淇敼鏃堕棿"
+ },
+ "messages": {
+ "detailTimeout": "鍑哄簱鍗曡鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+ "itemsTimeout": "鍑哄簱鍗曟槑缁嗗姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+ "detailLoadFailed": "鑾峰彇鍑哄簱鍗曡鎯呭け璐�",
+ "completeTitle": "瀹屾垚纭",
+ "completeConfirm": "纭畾瀹屾垚鍑哄簱鍗� {code} 鍚楋紵",
+ "completeSuccess": "瀹屾垚鎴愬姛",
+ "cancelTitle": "鍙栨秷纭",
+ "cancelConfirm": "纭畾鍙栨秷鍑哄簱鍗� {code} 鍚楋紵",
+ "cancelSuccess": "鍙栨秷鎴愬姛",
+ "actionFailed": "鍑哄簱鍗曟搷浣滃け璐�"
+ }
+ },
+ "outStockItem": {
+ "title": "鍑哄簱鍗曟槑缁�",
+ "reportTitle": "鍑哄簱鍗曟槑缁嗘姤琛�",
+ "sourceSummary": {
+ "title": "褰撳墠鏉ユ簮",
+ "orderId": "鍑哄簱鍗旾D锛歿id}"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ュ嚭搴撳崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О",
+ "orderCode": "鍑哄簱鍗曞彿",
+ "orderCodePlaceholder": "璇疯緭鍏ュ嚭搴撳崟鍙�",
+ "poCode": "PO鍗曞彿",
+ "poCodePlaceholder": "璇疯緭鍏O鍗曞彿",
+ "platItemId": "骞冲彴琛屽彿",
+ "platItemIdPlaceholder": "璇疯緭鍏ュ钩鍙拌鍙�",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+ "maktx": "鐗╂枡鍚嶇О",
+ "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+ "batch": "鎵规",
+ "batchPlaceholder": "璇疯緭鍏ユ壒娆�",
+ "splrBatch": "渚涘簲鍟嗘壒娆�",
+ "splrBatchPlaceholder": "璇疯緭鍏ヤ緵搴斿晢鎵规",
+ "barcode": "鏉″舰鐮�",
+ "barcodePlaceholder": "璇疯緭鍏ユ潯褰㈢爜",
+ "fieldsIndex": "瀛楁绱㈠紩",
+ "fieldsIndexPlaceholder": "璇疯緭鍏ュ瓧娈电储寮�",
+ "status": "鐘舵��",
+ "statusPlaceholder": "璇烽�夋嫨鐘舵��"
+ },
+ "detail": {
+ "title": "鍑哄簱鍗曟槑缁嗚鎯�",
+ "orderCode": "鍑哄簱鍗曞彿",
+ "poCode": "PO鍗曞彿",
+ "platItemId": "骞冲彴琛屽彿",
+ "platOrderCode": "骞冲彴璁㈠崟鍙�",
+ "platWorkCode": "骞冲彴宸ュ崟鍙�",
+ "projectCode": "椤圭洰鍙�",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "maktx": "鐗╂枡鍚嶇О",
+ "spec": "瑙勬牸",
+ "model": "鍨嬪彿",
+ "batch": "鎵规",
+ "splrBatch": "渚涘簲鍟嗘壒娆�",
+ "stockUnit": "搴撳瓨鍗曚綅",
+ "purUnit": "閲囪喘鍗曚綅",
+ "baseUnit": "鍩烘湰鍗曚綅",
+ "fieldsIndex": "瀛楁绱㈠紩",
+ "barcode": "鏉″舰鐮�",
+ "qrcode": "浜岀淮鐮�",
+ "packName": "鍖呰鍚嶇О",
+ "status": "鐘舵��",
+ "anfme": "鏁伴噺",
+ "workQty": "鎵ц鏁伴噺",
+ "qty": "宸插嚭鏁伴噺",
+ "purQty": "閲囪喘鏁伴噺",
+ "demandQty": "闇�姹傛暟閲�",
+ "splrCode": "渚涘簲鍟嗙紪鐮�",
+ "splrName": "渚涘簲鍟嗗悕绉�",
+ "sourceWarehouseId": "鏉ユ簮浠撳簱",
+ "targetWarehouseId": "鐩爣浠撳簱",
+ "ownerName": "璐т富",
+ "keeperName": "淇濈鑰�",
+ "memo": "澶囨敞",
+ "createBy": "鍒涘缓浜�",
+ "createTime": "鍒涘缓鏃堕棿",
+ "updateBy": "淇敼浜�",
+ "updateTime": "淇敼鏃堕棿"
+ },
+ "table": {
+ "orderCode": "鍑哄簱鍗曞彿",
+ "poCode": "PO鍗曞彿",
+ "platItemId": "骞冲彴琛屽彿",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "maktx": "鐗╂枡鍚嶇О",
+ "batch": "鎵规",
+ "splrBatch": "渚涘簲鍟嗘壒娆�",
+ "stockUnit": "搴撳瓨鍗曚綅",
+ "anfme": "鏁伴噺",
+ "workQty": "鎵ц鏁伴噺",
+ "qty": "宸插嚭鏁伴噺",
+ "fieldsIndex": "瀛楁绱㈠紩",
+ "status": "鐘舵��",
+ "updateTime": "鏇存柊鏃堕棿"
+ },
+ "messages": {
+ "detailTimeout": "鍑哄簱鍗曟槑缁嗚鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+ "detailFailed": "鑾峰彇鍑哄簱鍗曟槑缁嗚鎯呭け璐�"
+ }
+ },
"delivery": {
"reportTitle": "DO鍗曟姤琛�",
"detailReportTitle": "DO鍗曟槑缁嗘姤琛�",
@@ -924,6 +1671,56 @@
"itemsTimeout": "DO鍗曟槑缁嗗姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
"detailTimeout": "DO鍗曡鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
"detailLoadFailed": "DO鍗曡鎯呭姞杞藉け璐�"
+ }
+ },
+ "deliveryItem": {
+ "reportTitle": "DO鍗曟槑缁嗘姤琛�",
+ "sourceTitle": "褰撳墠鏉ユ簮",
+ "sourceLabel": "DO鍗旾D锛歿id}",
+ "search": {
+ "conditionPlaceholder": "璇疯緭鍏O鍗曞彿/鐗╂枡缂栫爜/鐗╂枡鍚嶇О/渚涘簲鍟�",
+ "deliveryCode": "DO鍗曞彿",
+ "deliveryCodePlaceholder": "璇疯緭鍏O鍗曞彿",
+ "platItemId": "骞冲彴琛屽彿",
+ "platItemIdPlaceholder": "璇疯緭鍏ュ钩鍙拌鍙�",
+ "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+ "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+ "supplierName": "渚涘簲鍟嗗悕绉�",
+ "supplierNamePlaceholder": "璇疯緭鍏ヤ緵搴斿晢鍚嶇О",
+ "supplierBatchPlaceholder": "璇疯緭鍏ヤ緵搴斿晢鎵规"
+ },
+ "table": {
+ "deliveryId": "DO鍗旾D",
+ "deliveryCode": "DO鍗曞彿",
+ "platItemId": "骞冲彴琛屽彿",
+ "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+ "workQty": "鎵ц鏁伴噺",
+ "qty": "宸插嚭鏁伴噺",
+ "nromQty": "鏍囧噯鍖呰",
+ "printQty": "鎵撳嵃鏁伴噺",
+ "supplierCode": "渚涘簲鍟嗙紪鐮�",
+ "supplierName": "渚涘簲鍟嗗悕绉�"
+ },
+ "detail": {
+ "title": "DO鍗曟槑缁嗚鎯�",
+ "baseInfo": "鍩虹淇℃伅",
+ "auditInfo": "瀹¤淇℃伅",
+ "deliveryId": "DO鍗旾D",
+ "deliveryCode": "DO鍗曞彿",
+ "platItemId": "骞冲彴琛屽彿",
+ "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+ "workQty": "鎵ц鏁伴噺",
+ "qty": "宸插嚭鏁伴噺",
+ "nromQty": "鏍囧噯鍖呰",
+ "printQty": "鎵撳嵃鏁伴噺",
+ "supplierCode": "渚涘簲鍟嗙紪鐮�",
+ "supplierName": "渚涘簲鍟嗗悕绉�",
+ "packName": "鍖呰鍚嶇О",
+ "prodTime": "鐢熶骇鏃ユ湡"
+ },
+ "messages": {
+ "detailTimeout": "DO鍗曟槑缁嗚鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+ "detailFailed": "鑾峰彇DO鍗曟槑缁嗚鎯呭け璐�"
}
},
"transfer": {
@@ -1040,6 +1837,267 @@
"publishFailed": "涓嬪彂鎵ц澶辫触",
"typeOptionsTimeout": "璋冩嫧绫诲瀷閫夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
"areaOptionsTimeout": "搴撳尯閫夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
+ }
+ },
+ "transferItem": {
+ "reportTitle": "璋冩嫧鏄庣粏鎶ヨ〃",
+ "sourceTitle": "褰撳墠鏉ユ簮",
+ "sourceLabel": "璋冩嫧鍗旾D锛歿id}",
+ "search": {
+ "conditionPlaceholder": "璇疯緭鍏ヨ皟鎷ㄥ崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О",
+ "transferId": "璋冩嫧鍗旾D",
+ "transferIdPlaceholder": "璇疯緭鍏ヨ皟鎷ㄥ崟ID",
+ "transferCode": "璋冩嫧鍗曞彿",
+ "transferCodePlaceholder": "璇疯緭鍏ヨ皟鎷ㄥ崟鍙�",
+ "platItemId": "骞冲彴琛屽彿",
+ "platItemIdPlaceholder": "璇疯緭鍏ュ钩鍙拌鍙�",
+ "matnrId": "鐗╂枡ID",
+ "matnrIdPlaceholder": "璇疯緭鍏ョ墿鏂橧D",
+ "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+ "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+ "spec": "瑙勬牸",
+ "specPlaceholder": "璇疯緭鍏ヨ鏍�",
+ "model": "鍨嬪彿",
+ "modelPlaceholder": "璇疯緭鍏ュ瀷鍙�",
+ "batchPlaceholder": "璇疯緭鍏ユ壒娆�",
+ "unitPlaceholder": "璇疯緭鍏ュ崟浣�",
+ "workQty": "鎵ц鏁伴噺",
+ "workQtyPlaceholder": "璇疯緭鍏ユ墽琛屾暟閲�",
+ "qty": "瀹屾垚鏁伴噺",
+ "qtyPlaceholder": "璇疯緭鍏ュ畬鎴愭暟閲�",
+ "anfmePlaceholder": "璇疯緭鍏ヨ鍒掓暟閲�",
+ "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+ "fieldsIndexPlaceholder": "璇疯緭鍏ュ姩鎬佸瓧娈电储寮�",
+ "platOrderCode": "骞冲彴鍗曞彿",
+ "platOrderCodePlaceholder": "璇疯緭鍏ュ钩鍙板崟鍙�",
+ "platWorkCode": "骞冲彴宸ュ崟鍙�",
+ "platWorkCodePlaceholder": "璇疯緭鍏ュ钩鍙板伐鍗曞彿",
+ "projectCode": "椤圭洰缂栫爜",
+ "projectCodePlaceholder": "璇疯緭鍏ラ」鐩紪鐮�",
+ "splrId": "渚涘簲鍟咺D",
+ "splrIdPlaceholder": "璇疯緭鍏ヤ緵搴斿晢ID",
+ "memoPlaceholder": "璇疯緭鍏ュ娉�",
+ "timeStart": "寮�濮嬫椂闂�",
+ "timeStartPlaceholder": "璇烽�夋嫨寮�濮嬫椂闂�",
+ "timeEnd": "缁撴潫鏃堕棿",
+ "timeEndPlaceholder": "璇烽�夋嫨缁撴潫鏃堕棿"
+ },
+ "table": {
+ "transferId": "璋冩嫧鍗旾D",
+ "transferCode": "璋冩嫧鍗曞彿",
+ "platItemId": "骞冲彴琛屽彿",
+ "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+ "spec": "瑙勬牸",
+ "model": "鍨嬪彿",
+ "workQty": "鎵ц鏁伴噺",
+ "qty": "瀹屾垚鏁伴噺",
+ "platOrderCode": "骞冲彴鍗曞彿",
+ "platWorkCode": "骞冲彴宸ュ崟鍙�",
+ "projectCode": "椤圭洰缂栫爜",
+ "supplierCode": "渚涘簲鍟嗙紪鐮�",
+ "supplierName": "渚涘簲鍟嗗悕绉�"
+ },
+ "detail": {
+ "title": "璋冩嫧鏄庣粏璇︽儏",
+ "baseInfo": "鍩虹淇℃伅",
+ "materialInfo": "鐗╂枡淇℃伅",
+ "platformInfo": "骞冲彴淇℃伅",
+ "auditInfo": "瀹¤淇℃伅",
+ "transferId": "璋冩嫧鍗旾D",
+ "transferCode": "璋冩嫧鍗曞彿",
+ "platItemId": "骞冲彴琛屽彿",
+ "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+ "matnrId": "鐗╂枡ID",
+ "spec": "瑙勬牸",
+ "model": "鍨嬪彿",
+ "workQty": "鎵ц鏁伴噺",
+ "qty": "瀹屾垚鏁伴噺",
+ "platOrderCode": "骞冲彴鍗曞彿",
+ "platWorkCode": "骞冲彴宸ュ崟鍙�",
+ "projectCode": "椤圭洰缂栫爜",
+ "splrId": "渚涘簲鍟咺D",
+ "supplierCode": "渚涘簲鍟嗙紪鐮�",
+ "supplierName": "渚涘簲鍟嗗悕绉�"
+ },
+ "messages": {
+ "detailTimeout": "璋冩嫧鏄庣粏璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "detailFailed": "鑾峰彇璋冩嫧鏄庣粏璇︽儏澶辫触"
+ }
+ },
+ "wave": {
+ "reportTitle": "娉㈡鍗曟姤琛�",
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ユ尝娆″崟鍙�/澶囨敞",
+ "code": "娉㈡鍗曞彿",
+ "codePlaceholder": "璇疯緭鍏ユ尝娆″崟鍙�",
+ "type": "娉㈡绫诲瀷",
+ "exceStatus": "娉㈡鐘舵��",
+ "status": "鐘舵��",
+ "memo": "澶囨敞",
+ "memoPlaceholder": "璇疯緭鍏ュ娉�",
+ "timeStart": "寮�濮嬫椂闂�",
+ "timeEnd": "缁撴潫鏃堕棿"
+ },
+ "status": {
+ "type": {
+ "0": "鎵嬪姩",
+ "1": "鑷姩"
+ },
+ "exceStatus": {
+ "0": "绛夊緟鎵ц",
+ "1": "姝e湪鎵ц",
+ "2": "鏆傚仠鎵ц",
+ "3": "鎵ц瀹屾垚"
+ }
+ },
+ "actions": {
+ "view": "鏌ョ湅璇︽儏",
+ "publicTask": "涓嬪彂浠诲姟",
+ "pause": "鏆傚仠",
+ "continue": "缁х画",
+ "stop": "缁堟",
+ "print": "鎵撳嵃"
+ },
+ "table": {
+ "code": "娉㈡鍗曞彿",
+ "type": "娉㈡绫诲瀷",
+ "exceStatus": "娉㈡鐘舵��",
+ "anfme": "搴旂洏鏁伴噺",
+ "workQty": "鎵ц鏁伴噺",
+ "qty": "宸茬洏鏁伴噺",
+ "orderNum": "鍗曟嵁鏁伴噺",
+ "progress": "杩涘害",
+ "createTime": "鍒涘缓鏃堕棿",
+ "updateTime": "鏇存柊鏃堕棿",
+ "status": "鐘舵��"
+ },
+ "preview": {
+ "waveCode": "娉㈡鍙�",
+ "orderCode": "鍗曟嵁缂栫爜",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "maktx": "鐗╂枡鍚嶇О",
+ "batch": "鎵规",
+ "unit": "鍗曚綅",
+ "anfme": "搴旈厤鏁伴噺",
+ "workQty": "宸查厤鏁伴噺",
+ "stockQty": "搴撳瓨鏁伴噺",
+ "splrBatch": "渚涘簲鍟嗘壒娆�",
+ "stockLocs": "搴撲綅"
+ },
+ "detail": {
+ "title": "娉㈡鍗曡鎯�",
+ "code": "娉㈡鍗曞彿",
+ "type": "娉㈡绫诲瀷",
+ "exceStatus": "娉㈡鐘舵��",
+ "status": "鐘舵��",
+ "anfme": "搴旂洏鏁伴噺",
+ "workQty": "鎵ц鏁伴噺",
+ "qty": "宸茬洏鏁伴噺",
+ "orderNum": "鍗曟嵁鏁伴噺",
+ "groupQty": "鍝佺被鏁伴噺",
+ "targSite": "鐩爣浣嶇疆",
+ "stationId": "鎸囧畾绔欑偣",
+ "locCode": "鎸囧畾搴撲綅",
+ "createBy": "鍒涘缓浜�",
+ "createTime": "鍒涘缓鏃堕棿",
+ "updateBy": "鏇存柊浜�",
+ "updateTime": "鏇存柊鏃堕棿",
+ "memo": "澶囨敞",
+ "previewTitle": "娉㈡棰勮鏄庣粏 - 鐗╂枡缂栫爜"
+ },
+ "publicTask": {
+ "title": "娉㈡涓嬪彂浠诲姟",
+ "code": "娉㈡鍗曞彿",
+ "type": "娉㈡绫诲瀷",
+ "exceStatus": "娉㈡鐘舵��",
+ "workQty": "鎵ц鏁伴噺"
+ },
+ "messages": {
+ "pauseSuccess": "娉㈡宸叉殏鍋�",
+ "continueSuccess": "娉㈡宸茬户缁�",
+ "stopConfirm": "纭畾缁堟娉㈡鍗� {code} 鍚楋紵",
+ "stopTitle": "缁堟纭",
+ "stopSuccess": "娉㈡宸茬粓姝�",
+ "actionFailed": "娉㈡鎿嶄綔澶辫触",
+ "detailTimeout": "娉㈡鍗曡鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+ "previewTimeout": "娉㈡棰勮鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "publicTaskTimeout": "娉㈡涓嬪彂棰勮鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "publicTaskSuccess": "娉㈡宸蹭笅鍙�",
+ "publicTaskFailed": "娉㈡涓嬪彂澶辫触",
+ "publicTaskWarning": "娉㈡棰勮鏁版嵁涓嶅彲鐢紝璇峰厛妫�鏌ュ簱浣嶉厤缃�"
+ }
+ },
+ "waveItem": {
+ "reportTitle": "娉㈡鏄庣粏鎶ヨ〃",
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ユ尝娆″崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О",
+ "waveCode": "娉㈡鍗曞彿",
+ "waveCodePlaceholder": "璇疯緭鍏ユ尝娆″崟鍙�",
+ "orderCode": "鍗曟嵁缂栫爜",
+ "orderCodePlaceholder": "璇疯緭鍏ュ崟鎹紪鐮�",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+ "maktx": "鐗╂枡鍚嶇О",
+ "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+ "batch": "鎵规",
+ "batchPlaceholder": "璇疯緭鍏ユ壒娆�",
+ "splrBatch": "渚涘簲鍟嗘壒娆�",
+ "splrBatchPlaceholder": "璇疯緭鍏ヤ緵搴斿晢鎵规",
+ "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+ "fieldsIndexPlaceholder": "璇疯緭鍏ュ姩鎬佸瓧娈电储寮�",
+ "timeStart": "寮�濮嬫椂闂�",
+ "timeEnd": "缁撴潫鏃堕棿"
+ },
+ "status": {
+ "exceStatus": {
+ "0": "鏈墽琛�",
+ "1": "鎵ц涓�",
+ "2": "鏆傚仠",
+ "3": "宸蹭笅鍙�",
+ "4": "浠诲姟瀹屾垚"
+ }
+ },
+ "actions": {
+ "view": "鏌ョ湅璇︽儏"
+ },
+ "table": {
+ "waveCode": "娉㈡鍗曞彿",
+ "orderCode": "鍗曟嵁缂栫爜",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "maktx": "鐗╂枡鍚嶇О",
+ "batch": "鎵规",
+ "splrBatch": "渚涘簲鍟嗘壒娆�",
+ "unit": "鍗曚綅",
+ "anfme": "搴旈厤鏁伴噺",
+ "workQty": "宸查厤鏁伴噺",
+ "stockQty": "搴撳瓨鏁伴噺",
+ "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+ "exceStatus": "鎵ц鐘舵��",
+ "updateTime": "鏇存柊鏃堕棿",
+ "stockLocs": "搴撲綅"
+ },
+ "detail": {
+ "title": "娉㈡鏄庣粏璇︽儏",
+ "waveCode": "娉㈡鍗曞彿",
+ "orderCode": "鍗曟嵁缂栫爜",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "maktx": "鐗╂枡鍚嶇О",
+ "batch": "鎵规",
+ "splrBatch": "渚涘簲鍟嗘壒娆�",
+ "unit": "鍗曚綅",
+ "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+ "anfme": "搴旈厤鏁伴噺",
+ "workQty": "宸查厤鏁伴噺",
+ "stockQty": "搴撳瓨鏁伴噺",
+ "exceStatus": "鎵ц鐘舵��",
+ "createTime": "鍒涘缓鏃堕棿",
+ "updateTime": "鏇存柊鏃堕棿",
+ "stockLocs": "搴撲綅"
+ },
+ "messages": {
+ "detailTimeout": "娉㈡鏄庣粏璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
}
}
},
@@ -1274,9 +2332,1325 @@
"containerTypeTimeout": "瀹瑰櫒绫诲瀷閫夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
"useStatusTimeout": "浣跨敤鐘舵�侀�夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
}
+ },
+ "basContainer": {
+ "table": {
+ "containerType": "瀹瑰櫒绫诲瀷",
+ "code": "鍞竴缂栫爜",
+ "codeType": "鏉$爜绫诲瀷",
+ "areas": "鍙叆搴撳尯"
+ }
+ },
+ "companys": {
+ "title": "寰�鏉ヤ紒涓�",
+ "entity": "寰�鏉ヤ紒涓�",
+ "reportTitle": "寰�鏉ヤ紒涓氭姤琛�",
+ "buttons": {
+ "add": "鏂板浼佷笟"
+ },
+ "table": {
+ "code": "浼佷笟缂栫爜",
+ "name": "浼佷笟鍚嶇О",
+ "nameEn": "鑻辨枃鍒悕",
+ "briefCode": "鍔╄鐮�",
+ "type": "浼佷笟绫诲瀷",
+ "contact": "鑱旂郴浜�",
+ "tel": "鑱旂郴鐢佃瘽",
+ "email": "閭",
+ "postCode": "閭紪",
+ "province": "鐪佷唤",
+ "city": "鍩庡競",
+ "address": "鍦板潃"
+ },
+ "search": {
+ "conditionPlaceholder": "璇疯緭鍏ヤ紒涓氬悕绉�/缂栫爜/鑱旂郴浜�/鐢佃瘽",
+ "codePlaceholder": "璇疯緭鍏ヤ紒涓氱紪鐮�",
+ "namePlaceholder": "璇疯緭鍏ヤ紒涓氬悕绉�",
+ "nameEnPlaceholder": "璇疯緭鍏ヨ嫳鏂囧埆鍚�",
+ "briefCodePlaceholder": "璇疯緭鍏ュ姪璁扮爜",
+ "contactPlaceholder": "璇疯緭鍏ヨ仈绯讳汉",
+ "telPlaceholder": "璇疯緭鍏ヨ仈绯荤數璇�",
+ "emailPlaceholder": "璇疯緭鍏ラ偖绠�",
+ "postCodePlaceholder": "璇疯緭鍏ラ偖缂�",
+ "provincePlaceholder": "璇疯緭鍏ョ渷浠�",
+ "cityPlaceholder": "璇疯緭鍏ュ煄甯�",
+ "addressPlaceholder": "璇疯緭鍏ュ湴鍧�",
+ "memoPlaceholder": "璇疯緭鍏ュ娉�"
+ },
+ "placeholders": {
+ "code": "鐣欑┖灏嗚嚜鍔ㄧ敓鎴�",
+ "name": "璇疯緭鍏ヤ紒涓氬悕绉�",
+ "nameEn": "璇疯緭鍏ヨ嫳鏂囧埆鍚�",
+ "briefCode": "璇疯緭鍏ュ姪璁扮爜",
+ "type": "璇烽�夋嫨浼佷笟绫诲瀷",
+ "contact": "璇疯緭鍏ヨ仈绯讳汉",
+ "tel": "璇疯緭鍏ヨ仈绯荤數璇�",
+ "email": "璇疯緭鍏ラ偖绠�",
+ "postCode": "璇疯緭鍏ラ偖缂�",
+ "province": "璇疯緭鍏ョ渷浠�",
+ "city": "璇疯緭鍏ュ煄甯�",
+ "address": "璇疯緭鍏ュ湴鍧�",
+ "status": "璇烽�夋嫨鐘舵��",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "name": "璇疯緭鍏ヤ紒涓氬悕绉�",
+ "briefCode": "璇疯緭鍏ュ姪璁扮爜",
+ "type": "璇烽�夋嫨浼佷笟绫诲瀷"
+ },
+ "dialog": {
+ "titleCreate": "鏂板寰�鏉ヤ紒涓�",
+ "titleEdit": "缂栬緫寰�鏉ヤ紒涓�",
+ "titleDetail": "寰�鏉ヤ紒涓氳鎯�"
+ },
+ "detail": {
+ "sections": {
+ "basic": "鍩虹淇℃伅",
+ "audit": "瀹¤淇℃伅"
+ }
+ },
+ "messages": {
+ "detailTimeout": "寰�鏉ヤ紒涓氳鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+ "detailFailed": "鑾峰彇寰�鏉ヤ紒涓氳鎯呭け璐�",
+ "typeOptionsTimeout": "浼佷笟绫诲瀷鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
+ }
+ },
+ "contract": {
+ "table": {
+ "code": "鍚堝悓缂栫爜",
+ "name": "鍚堝悓鍚嶇О",
+ "projectName": "椤圭洰鍚嶇О"
+ }
+ },
+ "whMat": {
+ "title": "鐗╂枡",
+ "labels": {
+ "allMaterials": "鍏ㄩ儴鐗╂枡"
+ },
+ "search": {
+ "groupKeywordPlaceholder": "鎼滅储鐗╂枡鍒嗙粍",
+ "keyword": "鍏抽敭瀛�",
+ "keywordPlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�/鐗╂枡鍚嶇О",
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�/鐗╂枡鍚嶇О",
+ "code": "鐗╂枡缂栫爜",
+ "codePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+ "name": "鐗╂枡鍚嶇О",
+ "namePlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+ "spec": "瑙勬牸",
+ "specPlaceholder": "璇疯緭鍏ヨ鏍�",
+ "barcode": "鏉$爜",
+ "barcodePlaceholder": "璇疯緭鍏ユ潯鐮�"
+ },
+ "messages": {
+ "emptyGroups": "鏆傛棤鐗╂枡鍒嗙粍",
+ "groupTimeout": "鐗╂枡鍒嗙粍鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "groupLoadFailed": "鑾峰彇鐗╂枡鍒嗙粍澶辫触",
+ "listTimeout": "鐗╂枡鍒楄〃鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "listLoadFailed": "鑾峰彇鐗╂枡鍒楄〃澶辫触",
+ "detailTimeout": "鐗╂枡璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "detailLoadFailed": "鑾峰彇鐗╂枡璇︽儏澶辫触"
+ },
+ "table": {
+ "code": "鐗╂枡缂栫爜",
+ "name": "鐗╂枡鍚嶇О",
+ "groupName": "鐗╂枡鍒嗙粍",
+ "group": "鐗╂枡鍒嗙粍",
+ "barcode": "鏉$爜",
+ "spec": "瑙勬牸",
+ "model": "鍨嬪彿"
+ },
+ "detail": {
+ "title": "鐗╂枡璇︽儏",
+ "sections": {
+ "basic": "鍩虹淇℃伅",
+ "stock": "搴撳瓨淇℃伅",
+ "audit": "瀹¤淇℃伅",
+ "extend": "鎵╁睍淇℃伅"
+ },
+ "code": "鐗╂枡缂栫爜",
+ "name": "鐗╂枡鍚嶇О",
+ "groupName": "鐗╂枡鍒嗙粍",
+ "shipperName": "璐т富",
+ "shipper": "璐т富",
+ "barcode": "鏉$爜",
+ "spec": "瑙勬牸",
+ "model": "鍨嬪彿",
+ "color": "棰滆壊",
+ "size": "灏哄",
+ "description": "鎻忚堪",
+ "unit": "鍗曚綅",
+ "purUnit": "閲囪喘鍗曚綅",
+ "purchaseUnit": "閲囪喘鍗曚綅",
+ "stockUnit": "搴撳瓨鍗曚綅",
+ "stockLevel": "搴撳瓨绾у埆",
+ "flagLabelManage": "鏍囩绠$悊",
+ "flagCheck": "澶嶆牳绠$悊",
+ "safeQty": "瀹夊叏搴撳瓨",
+ "minQty": "鏈�灏忓簱瀛�",
+ "maxQty": "鏈�澶у簱瀛�",
+ "stagn": "鍛嗘粸澶╂暟",
+ "valid": "鏄惁鏈夋晥",
+ "validWarn": "鏈夋晥鏈熼璀�",
+ "baseUnit": "鍩虹鍗曚綅",
+ "useOrgName": "浣跨敤缁勭粐",
+ "erpClsId": "ERP鍒嗙被"
+ }
+ },
+ "warehouse": {
+ "table": {
+ "name": "浠撳簱鍚嶇О",
+ "code": "浠撳簱缂栫爜",
+ "factory": "鎵�灞炲伐鍘�",
+ "address": "浠撳簱鍦板潃"
+ }
+ },
+ "warehouseAreas": {
+ "title": "搴撳尯",
+ "entity": "搴撳尯",
+ "reportTitle": "搴撳尯鎶ヨ〃",
+ "search": {
+ "conditionPlaceholder": "璇疯緭鍏ュ簱鍖哄悕绉�/缂栫爜/澶囨敞",
+ "codePlaceholder": "璇疯緭鍏ュ簱鍖虹紪鐮�",
+ "namePlaceholder": "璇疯緭鍏ュ簱鍖哄悕绉�"
+ },
+ "placeholders": {
+ "warehouse": "璇烽�夋嫨浠撳簱",
+ "code": "璇疯緭鍏ュ簱鍖虹紪鐮�",
+ "name": "璇疯緭鍏ュ簱鍖哄悕绉�",
+ "type": "璇烽�夋嫨涓氬姟绫诲瀷",
+ "shipper": "璇烽�夋嫨璐т富",
+ "supplier": "璇烽�夋嫨渚涘簲鍟�",
+ "flagMinus": "璇烽�夋嫨鍏佽璐熷簱瀛�",
+ "flagLabelManage": "璇烽�夋嫨鏍囩绠$悊",
+ "flagMix": "璇烽�夋嫨鏀寔娣锋斁",
+ "status": "璇烽�夋嫨鐘舵��",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "warehouse": "璇烽�夋嫨浠撳簱",
+ "code": "璇疯緭鍏ュ簱鍖虹紪鐮�",
+ "name": "璇疯緭鍏ュ簱鍖哄悕绉�",
+ "type": "璇烽�夋嫨涓氬姟绫诲瀷",
+ "flagMinus": "璇烽�夋嫨鍏佽璐熷簱瀛�",
+ "flagMix": "璇烽�夋嫨鏀寔娣锋斁"
+ },
+ "dialog": {
+ "titleCreate": "鏂板搴撳尯",
+ "titleEdit": "缂栬緫搴撳尯"
+ },
+ "detail": {
+ "title": "搴撳尯璇︽儏",
+ "sections": {
+ "basic": "鍩虹淇℃伅",
+ "audit": "瀹¤淇℃伅"
+ }
+ },
+ "messages": {
+ "detailTimeout": "搴撳尯璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "detailFailed": "鑾峰彇搴撳尯璇︽儏澶辫触",
+ "companyOptionsTimeout": "寰�鏉ヤ紒涓氶�夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "warehouseOptionsTimeout": "浠撳簱閫夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "typeOptionsTimeout": "涓氬姟绫诲瀷鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
+ },
+ "table": {
+ "warehouseName": "浠撳簱",
+ "code": "搴撳尯缂栫爜",
+ "name": "搴撳尯鍚嶇О",
+ "type": "涓氬姟绫诲瀷",
+ "shipperName": "璐т富",
+ "supplierName": "渚涘簲鍟�",
+ "flagMix": "鏀寔娣锋斁",
+ "flagMinus": "鍏佽璐熷簱瀛�",
+ "flagLabelManage": "鏍囩绠$悊",
+ "sort": "鎺掑簭"
+ }
+ },
+ "deviceSite": {
+ "table": {
+ "type": "绔欑偣绫诲瀷",
+ "site": "浣滀笟绔欑偣",
+ "name": "鍚嶇О",
+ "target": "鐩爣绔欑偣",
+ "label": "绔欑偣鏍囩",
+ "deviceType": "璁惧绫诲瀷",
+ "deviceCode": "璁惧缂栧彿",
+ "deviceSite": "璁惧绔欑偣",
+ "channel": "宸烽亾",
+ "areaStart": "婧愬簱鍖�",
+ "areaEnd": "鐩爣搴撳尯"
+ }
+ },
+ "basStation": {
+ "table": {
+ "stationCode": "绔欑偣缂栫爜",
+ "stationName": "绔欑偣鍚嶇О",
+ "type": "绔欑偣绫诲瀷",
+ "useStatus": "浣跨敤鐘舵��",
+ "area": "鎵�灞炲簱鍖�",
+ "crossZoneArea": "鍙法鍖哄簱鍖�",
+ "containerTypes": "鍙叆瀹瑰櫒绫诲瀷",
+ "barcode": "鏉$爜",
+ "inAble": "鍙叆",
+ "outAble": "鍙嚭",
+ "isCrossZone": "鏄惁璺ㄥ尯",
+ "isWcs": "鏄惁WCS",
+ "autoTransfer": "鑷姩璋冩嫧"
+ }
+ },
+ "loc": {
+ "table": {
+ "code": "搴撲綅鍙�",
+ "warehouseName": "浠撳簱",
+ "areaName": "搴撳尯",
+ "typeIds": "搴撲綅绫诲瀷",
+ "row": "鎺�",
+ "col": "鍒�",
+ "lev": "灞�",
+ "channel": "宸烽亾",
+ "useStatus": "浣跨敤鐘舵��",
+ "flagLogic": "铏氭嫙搴撲綅",
+ "flagLabelManage": "鏍囩绠$悊",
+ "barcode": "瀹瑰櫒缂栫爜"
+ }
+ },
+ "taskPathTemplate": {
+ "actions": {
+ "flow": "娴佺▼鍥�"
+ },
+ "table": {
+ "templateCode": "妯℃澘缂栫爜",
+ "templateName": "妯℃澘鍚嶇О",
+ "sourceType": "璧风偣绫诲瀷",
+ "targetType": "缁堢偣绫诲瀷",
+ "conditionDesc": "鏉′欢鎻忚堪",
+ "version": "鐗堟湰鍙�",
+ "isCurrent": "褰撳墠鐗堟湰",
+ "effectiveTime": "鐢熸晥鏃堕棿",
+ "expireTime": "澶辨晥鏃堕棿",
+ "priority": "浼樺厛绾�",
+ "timeoutMinutes": "瓒呮椂(鍒�)",
+ "stepSize": "姝ュ簭闀垮害",
+ "maxRetryTimes": "鏈�澶ч噸璇�",
+ "retryIntervalSeconds": "閲嶈瘯闂撮殧(绉�)"
+ }
+ },
+ "taskPathTemplateNode": {
+ "table": {
+ "templateId": "妯℃澘ID",
+ "templateCode": "妯℃澘缂栫爜",
+ "nodeOrder": "鑺傜偣椤哄簭",
+ "nodeCode": "鑺傜偣缂栫爜",
+ "nodeName": "鑺傜偣鍚嶇О",
+ "nodeType": "鑺傜偣绫诲瀷",
+ "systemCode": "绯荤粺缂栫爜",
+ "systemName": "绯荤粺鍚嶇О",
+ "mandatory": "蹇呴』鑺傜偣",
+ "parallelExecutable": "鍙苟琛�",
+ "timeoutMinutes": "瓒呮椂(鍒�)"
+ }
+ },
+ "taskPathTemplateMerge": {
+ "table": {
+ "templateCode": "妯℃澘缂栫爜",
+ "templateName": "妯℃澘鍚嶇О",
+ "sourceType": "璧风偣绫诲瀷",
+ "targetType": "缁堢偣绫诲瀷",
+ "conditionExpression": "鏉′欢琛ㄨ揪寮�",
+ "conditionDesc": "鏉′欢鎻忚堪",
+ "version": "鐗堟湰鍙�",
+ "isCurrent": "褰撳墠鐗堟湰",
+ "effectiveTime": "鐢熸晥鏃堕棿",
+ "expireTime": "澶辨晥鏃堕棿",
+ "priority": "浼樺厛绾�",
+ "timeoutMinutes": "瓒呮椂(鍒�)",
+ "maxRetryTimes": "鏈�澶ч噸璇�",
+ "retryIntervalSeconds": "閲嶈瘯闂撮殧(绉�)",
+ "stepSize": "姝ュ簭闀垮害"
+ }
+ },
+ "locArea": {
+ "table": {
+ "area": "搴撳尯"
+ }
+ },
+ "locAreaMat": {
+ "table": {
+ "code": "閫昏緫缂栧彿",
+ "warehouseName": "浠撳簱",
+ "areaName": "搴撳尯",
+ "depict": "閫昏緫鎻忚堪"
+ }
+ },
+ "locAreaRela": {
+ "table": {
+ "locAreaId": "鍒嗗尯ID",
+ "locId": "搴撲綅ID"
+ }
+ },
+ "locAreaMatRela": {
+ "table": {
+ "areaMatId": "涓诲崟",
+ "areaId": "搴撳尯",
+ "code": "缂栧彿",
+ "matnrId": "鐗╂枡",
+ "groupId": "鐗╂枡鍒嗙粍",
+ "locTypeId": "搴撲綅绫诲瀷",
+ "locId": "搴撲綅",
+ "relationType": "鍏崇郴绫诲瀷"
+ }
+ },
+ "locType": {
+ "table": {
+ "uuid": "鏍囪瘑",
+ "regex": "鏉$爜瑙勫垯"
+ }
+ },
+ "matnrGroup": {
+ "table": {
+ "code": "鍒嗙粍缂栫爜",
+ "parentCode": "涓婄骇缂栫爜",
+ "name": "鍒嗙粍鍚嶇О"
+ }
+ },
+ "deviceBind": {
+ "table": {
+ "currentRow": "褰撳墠鎺掑彿",
+ "startRow": "璧峰鎺掑彿",
+ "endRow": "缁堟鎺掑彿",
+ "deviceQty": "璁惧鏁伴噺",
+ "startDeviceNo": "璧峰璁惧鍙�",
+ "endDeviceNo": "缁堟璁惧鍙�",
+ "staList": "绔欑偣鍒楄〃",
+ "typeId": "搴撳尯绫诲瀷",
+ "beSimilar": "鐗╂枡鐩镐技",
+ "emptySimilar": "绌烘澘闈犺繎"
+ }
+ },
+ "manager": {
+ "menuPda": {
+ "actions": {
+ "add": "娣诲姞PDA鑿滃崟"
+ },
+ "search": {
+ "name": "鑿滃崟鍚嶇О",
+ "namePlaceholder": "璇疯緭鍏ヨ彍鍗曞悕绉�",
+ "route": "璺敱鍦板潃",
+ "routePlaceholder": "璇疯緭鍏ヨ矾鐢卞湴鍧�"
+ },
+ "table": {
+ "name": "鑿滃崟鍚嶇О",
+ "iconPreview": "鍥炬爣棰勮",
+ "menuType": "鑿滃崟绫诲瀷"
+ },
+ "tree": {
+ "topLevel": "椤剁骇鑿滃崟"
+ },
+ "type": {
+ "menu": "鑿滃崟",
+ "button": "鎸夐挳",
+ "directory": "鐩綍"
+ },
+ "dialog": {
+ "titleAddMenu": "鏂板缓鑿滃崟",
+ "titleEditMenu": "缂栬緫鑿滃崟",
+ "titleAddButton": "鏂板缓鎸夐挳",
+ "titleEditButton": "缂栬緫鎸夐挳",
+ "menuType": "鑿滃崟绫诲瀷",
+ "parentMenu": "涓婄骇鑿滃崟",
+ "menuName": "鑿滃崟鍚嶇О",
+ "permissionName": "鏉冮檺鍚嶇О",
+ "route": "璺敱鍦板潃",
+ "component": "缁勪欢鏍囪瘑",
+ "authority": "鏉冮檺鏍囪瘑",
+ "icon": "鍥炬爣",
+ "sort": "鎺掑簭",
+ "status": "鐘舵��",
+ "placeholder": {
+ "parentMenu": "璇烽�夋嫨涓婄骇鑿滃崟",
+ "menuName": "璇疯緭鍏ヨ彍鍗曞悕绉�",
+ "permissionName": "璇疯緭鍏ユ潈闄愬悕绉�",
+ "route": "璇疯緭鍏ヨ矾鐢卞湴鍧�",
+ "component": "璇疯緭鍏ョ粍浠舵爣璇�",
+ "authority": "璇疯緭鍏ユ潈闄愭爣璇�",
+ "icon": "璇疯緭鍏ュ浘鏍囧悕绉�",
+ "status": "璇烽�夋嫨鐘舵��",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "menuName": "璇疯緭鍏ヨ彍鍗曞悕绉�",
+ "permissionName": "璇疯緭鍏ユ潈闄愬悕绉�",
+ "route": "璇疯緭鍏ヨ矾鐢卞湴鍧�",
+ "authority": "璇疯緭鍏ユ潈闄愭爣璇�"
+ }
+ },
+ "messages": {
+ "listTimeout": "PDA鑿滃崟鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "loadFailed": "鑾峰彇PDA鑿滃崟澶辫触",
+ "parentSelf": "涓婄骇鑿滃崟涓嶈兘閫夋嫨褰撳墠鑿滃崟",
+ "deleteConfirm": "纭畾瑕佸垹闄DA鑿滃崟銆寋title}銆嶅悧锛熷垹闄ゅ悗鏃犳硶鎭㈠"
+ }
+ }
+ }
+ },
+ "manager": {
+ "menuPda": {
+ "actions": {
+ "add": "娣诲姞PDA鑿滃崟"
+ },
+ "search": {
+ "name": "鑿滃崟鍚嶇О",
+ "namePlaceholder": "璇疯緭鍏ヨ彍鍗曞悕绉�",
+ "route": "璺敱鍦板潃",
+ "routePlaceholder": "璇疯緭鍏ヨ矾鐢卞湴鍧�"
+ },
+ "table": {
+ "name": "鑿滃崟鍚嶇О",
+ "iconPreview": "鍥炬爣棰勮",
+ "menuType": "鑿滃崟绫诲瀷"
+ },
+ "tree": {
+ "topLevel": "椤剁骇鑿滃崟"
+ },
+ "type": {
+ "menu": "鑿滃崟",
+ "button": "鎸夐挳",
+ "directory": "鐩綍"
+ },
+ "dialog": {
+ "titleAddMenu": "鏂板缓鑿滃崟",
+ "titleEditMenu": "缂栬緫鑿滃崟",
+ "titleAddButton": "鏂板缓鎸夐挳",
+ "titleEditButton": "缂栬緫鎸夐挳",
+ "menuType": "鑿滃崟绫诲瀷",
+ "parentMenu": "涓婄骇鑿滃崟",
+ "menuName": "鑿滃崟鍚嶇О",
+ "permissionName": "鏉冮檺鍚嶇О",
+ "route": "璺敱鍦板潃",
+ "component": "缁勪欢鏍囪瘑",
+ "authority": "鏉冮檺鏍囪瘑",
+ "icon": "鍥炬爣",
+ "sort": "鎺掑簭",
+ "status": "鐘舵��",
+ "placeholder": {
+ "parentMenu": "璇烽�夋嫨涓婄骇鑿滃崟",
+ "menuName": "璇疯緭鍏ヨ彍鍗曞悕绉�",
+ "permissionName": "璇疯緭鍏ユ潈闄愬悕绉�",
+ "route": "璇疯緭鍏ヨ矾鐢卞湴鍧�",
+ "component": "璇疯緭鍏ョ粍浠舵爣璇�",
+ "authority": "璇疯緭鍏ユ潈闄愭爣璇�",
+ "icon": "璇疯緭鍏ュ浘鏍囧悕绉�",
+ "status": "璇烽�夋嫨鐘舵��",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "menuName": "璇疯緭鍏ヨ彍鍗曞悕绉�",
+ "permissionName": "璇疯緭鍏ユ潈闄愬悕绉�",
+ "route": "璇疯緭鍏ヨ矾鐢卞湴鍧�",
+ "authority": "璇疯緭鍏ユ潈闄愭爣璇�"
+ }
+ },
+ "messages": {
+ "listTimeout": "PDA鑿滃崟鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "loadFailed": "鑾峰彇PDA鑿滃崟澶辫触",
+ "parentSelf": "涓婄骇鑿滃崟涓嶈兘閫夋嫨褰撳墠鑿滃崟",
+ "deleteConfirm": "纭畾瑕佸垹闄DA鑿滃崟銆寋title}銆嶅悧锛熷垹闄ゅ悗鏃犳硶鎭㈠"
+ }
+ },
+ "waveRule": {
+ "entity": "娉㈡绛栫暐",
+ "reportTitle": "娉㈡绛栫暐鎶ヨ〃",
+ "actions": {
+ "add": "鏂板娉㈡绛栫暐"
+ },
+ "table": {
+ "type": "绫诲瀷"
+ },
+ "search": {
+ "conditionPlaceholder": "璇疯緭鍏ョ紪鍙锋垨鍚嶇О",
+ "codePlaceholder": "璇疯緭鍏ョ紪鍙�",
+ "namePlaceholder": "璇疯緭鍏ョ瓥鐣ュ悕绉�"
+ },
+ "dialog": {
+ "titleCreate": "鏂板娉㈡绛栫暐",
+ "titleEdit": "缂栬緫娉㈡绛栫暐",
+ "validation": {
+ "type": "璇烽�夋嫨绛栫暐绫诲瀷",
+ "name": "璇疯緭鍏ョ瓥鐣ュ悕绉�"
+ },
+ "placeholder": {
+ "code": "鏂板鍚庤嚜鍔ㄧ敓鎴�",
+ "type": "璇烽�夋嫨绛栫暐绫诲瀷",
+ "name": "璇疯緭鍏ョ瓥鐣ュ悕绉�",
+ "status": "璇烽�夋嫨鐘舵��",
+ "memo": "璇疯緭鍏ュ娉�"
+ }
+ },
+ "detail": {
+ "title": "娉㈡绛栫暐璇︽儏"
+ },
+ "messages": {
+ "typeTimeout": "娉㈡绛栫暐绫诲瀷鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "detailFailed": "鑾峰彇娉㈡绛栫暐璇︽儏澶辫触"
+ }
+ },
+ "taskLog": {
+ "reportTitle": "浠诲姟鍘嗗彶妗f姤琛�",
+ "table": {
+ "taskCode": "浠诲姟鍙�",
+ "taskStatus": "浠诲姟鐘舵��",
+ "taskType": "浠诲姟绫诲瀷",
+ "orgLoc": "婧愬簱浣�",
+ "orgSite": "婧愮珯鐐�",
+ "targLoc": "鐩爣搴撲綅",
+ "targSite": "鐩爣绔欑偣",
+ "barcode": "鎵樼洏鐮�",
+ "robotCode": "鏈哄櫒浜虹紪鐮�",
+ "startTime": "寮�濮嬫椂闂�",
+ "endTime": "缁撴潫鏃堕棿"
+ },
+ "search": {
+ "conditionPlaceholder": "璇疯緭鍏ヤ换鍔″彿/鎵樼洏鐮�/鏈哄櫒浜虹紪鐮�",
+ "taskCodePlaceholder": "璇疯緭鍏ヤ换鍔″彿",
+ "orgLocPlaceholder": "璇疯緭鍏ユ簮搴撲綅",
+ "targLocPlaceholder": "璇疯緭鍏ョ洰鏍囧簱浣�",
+ "barcodePlaceholder": "璇疯緭鍏ユ墭鐩樼爜",
+ "robotCodePlaceholder": "璇疯緭鍏ユ満鍣ㄤ汉缂栫爜",
+ "timeStart": "寮�濮嬫棩鏈�",
+ "timeEnd": "缁撴潫鏃ユ湡"
+ },
+ "detail": {
+ "title": "浠诲姟鍘嗗彶妗h鎯�",
+ "taskId": "浠诲姟ID",
+ "exceStatus": "鎵ц鐘舵��",
+ "sort": "浼樺厛绾�",
+ "expDesc": "寮傚父鎻忚堪",
+ "expCode": "寮傚父缂栫爜"
+ }
+ },
+ "inStatisticItem": {
+ "title": "鍏ュ簱缁熻鏄庣粏",
+ "table": {
+ "dayTime": "缁熻鏃ユ湡",
+ "locCode": "搴撲綅",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "maktx": "鐗╂枡鍚嶇О",
+ "anfme": "鏁伴噺",
+ "batch": "鎵规",
+ "barcode": "鎵樼洏鐮�"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�/缂栫爜/鎵规",
+ "dayTime": "缁熻鏃ユ湡",
+ "maktx": "鐗╂枡鍚嶇О",
+ "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+ "batch": "鎵规",
+ "batchPlaceholder": "璇疯緭鍏ユ壒娆�"
+ },
+ "detail": {
+ "title": "{title}璇︽儏",
+ "taskType": "浠诲姟绫诲瀷",
+ "taskStatus": "浠诲姟鐘舵��",
+ "fieldsIndex": "绱㈠紩"
+ }
+ },
+ "freeze": {
+ "table": {
+ "locCode": "搴撲綅缂栫爜",
+ "wareArea": "搴撳尯",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "maktx": "鐗╂枡鍚嶇О",
+ "batch": "鎵规",
+ "trackCode": "杩借釜鐮�",
+ "anfme": "鍙敤鏁伴噺",
+ "qty": "搴撳瓨鏁伴噺",
+ "workQty": "鎵ц涓暟閲�"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ュ簱浣嶇紪鐮�/鐗╂枡缂栫爜",
+ "locCode": "搴撲綅缂栫爜",
+ "locCodePlaceholder": "璇疯緭鍏ュ簱浣嶇紪鐮�",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+ "maktx": "鐗╂枡鍚嶇О",
+ "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+ "batch": "鎵规",
+ "batchPlaceholder": "璇疯緭鍏ユ壒娆�",
+ "trackCode": "杩借釜鐮�",
+ "trackCodePlaceholder": "璇疯緭鍏ヨ拷韪爜",
+ "dynamicPlaceholder": "璇疯緭鍏label}"
+ },
+ "detail": {
+ "title": "鍐荤粨搴撳瓨璇︽儏"
+ },
+ "messages": {
+ "fieldsTimeout": "鎵╁睍瀛楁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "pageTimeout": "鍐荤粨搴撳瓨鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "detailTimeout": "鍐荤粨搴撳瓨璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
+ }
+ },
+ "locItem": {
+ "table": {
+ "locId": "搴撲綅ID",
+ "wareArea": "搴撳尯",
+ "locCode": "搴撲綅缂栫爜",
+ "type": "涓氬姟绫诲瀷",
+ "wkType": "宸ヤ綅绫诲瀷",
+ "orderId": "鍗曟嵁ID",
+ "orderItemId": "鍗曟嵁鏄庣粏ID",
+ "matnrId": "鐗╂枡ID",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "maktx": "鐗╂枡鍚嶇О",
+ "spec": "瑙勬牸",
+ "model": "鍨嬪彿",
+ "batch": "鎵规",
+ "trackCode": "杩借釜鐮�",
+ "anfme": "鍙敤鏁伴噺",
+ "qty": "搴撳瓨鏁伴噺",
+ "workQty": "鎵ц涓暟閲�"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ュ簱浣嶇紪鐮�/鐗╂枡缂栫爜/杩借釜鐮�",
+ "timeStart": "寮�濮嬫棩鏈�",
+ "timeEnd": "缁撴潫鏃ユ湡",
+ "locId": "搴撲綅ID",
+ "locIdPlaceholder": "璇疯緭鍏ュ簱浣岻D",
+ "orderId": "鍗曟嵁ID",
+ "orderIdPlaceholder": "璇疯緭鍏ュ崟鎹甀D",
+ "type": "涓氬姟绫诲瀷",
+ "typePlaceholder": "璇疯緭鍏ヤ笟鍔$被鍨�",
+ "wkType": "宸ヤ綅绫诲瀷",
+ "wkTypePlaceholder": "璇疯緭鍏ュ伐浣嶇被鍨�",
+ "matnrCode": "鐗╂枡缂栫爜",
+ "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+ "maktx": "鐗╂枡鍚嶇О",
+ "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+ "trackCode": "杩借釜鐮�",
+ "trackCodePlaceholder": "璇疯緭鍏ヨ拷韪爜",
+ "batch": "鎵规",
+ "batchPlaceholder": "璇疯緭鍏ユ壒娆�",
+ "splrBatch": "渚涘簲鍟嗘壒娆�",
+ "splrBatchPlaceholder": "璇疯緭鍏ヤ緵搴斿晢鎵规"
+ },
+ "detail": {
+ "title": "搴撳瓨鏄庣粏璇︽儏",
+ "extendFields": "鎵╁睍瀛楁",
+ "emptyExtendFields": "鏆傛棤鎵╁睍瀛楁"
+ },
+ "messages": {
+ "pageTimeout": "搴撳瓨鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "detailFailed": "鑾峰彇搴撳瓨鏄庣粏璇︽儏澶辫触",
+ "fieldsTimeout": "鎵╁睍瀛楁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
+ }
+ },
+ "locPreview": {
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ュ簱浣嶇紪鐮�/鏉$爜",
+ "code": "搴撲綅缂栫爜",
+ "codePlaceholder": "璇疯緭鍏ュ簱浣嶇紪鐮�",
+ "barcode": "鏉$爜",
+ "barcodePlaceholder": "璇疯緭鍏ユ潯鐮�"
+ },
+ "table": {
+ "locCode": "搴撲綅缂栫爜",
+ "warehouseLabel": "浠撳簱",
+ "areaLabel": "搴撳尯",
+ "typeLabel": "搴撲綅绫诲瀷",
+ "barcode": "鏉$爜",
+ "useStatusLabel": "浣跨敤鐘舵��",
+ "row": "鎺�",
+ "col": "鍒�",
+ "lev": "灞�",
+ "channel": "宸烽亾"
+ },
+ "detail": {
+ "title": "搴撲綅璇︽儏",
+ "stockItems": "搴撳瓨鏄庣粏"
+ },
+ "messages": {
+ "fieldsTimeout": "鎵╁睍瀛楁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "pageTimeout": "搴撲綅鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "detailTimeout": "搴撲綅璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "itemPageTimeout": "搴撲綅搴撳瓨鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
+ }
}
},
"system": {
+ "config": {
+ "title": "閰嶇疆绠$悊",
+ "entity": "閰嶇疆",
+ "buttons": {
+ "add": "鏂板閰嶇疆"
+ },
+ "table": {
+ "flag": "鏍囪瘑",
+ "type": "绫诲瀷",
+ "value": "鍊�",
+ "content": "鏂囨湰"
+ },
+ "search": {
+ "conditionPlaceholder": "璇疯緭鍏ラ厤缃悕绉�",
+ "flagPlaceholder": "璇疯緭鍏ラ厤缃爣璇�"
+ },
+ "types": {
+ "boolean": "甯冨皵鍊�",
+ "number": "鏁板瓧",
+ "string": "瀛楃涓�",
+ "json": "JSON",
+ "date": "鏃ユ湡"
+ },
+ "placeholders": {
+ "uuid": "鏂板鍚庤嚜鍔ㄧ敓鎴�",
+ "name": "璇疯緭鍏ラ厤缃悕绉�",
+ "flag": "璇疯緭鍏ラ厤缃爣璇�",
+ "type": "璇烽�夋嫨绫诲瀷",
+ "value": "璇疯緭鍏ラ厤缃��",
+ "content": "璇疯緭鍏ラ厤缃枃鏈�",
+ "status": "璇烽�夋嫨鐘舵��",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "name": "璇疯緭鍏ラ厤缃悕绉�",
+ "flag": "璇疯緭鍏ラ厤缃爣璇�"
+ },
+ "dialog": {
+ "titleCreate": "鏂板閰嶇疆",
+ "titleEdit": "缂栬緫閰嶇疆",
+ "titleDetail": "閰嶇疆璇︽儏"
+ },
+ "messages": {
+ "detailFailed": "鑾峰彇閰嶇疆璇︽儏澶辫触"
+ }
+ },
+ "dictType": {
+ "title": "鏁版嵁瀛楀吀",
+ "entity": "鏁版嵁瀛楀吀",
+ "buttons": {
+ "add": "鏂板鏁版嵁瀛楀吀"
+ },
+ "search": {
+ "conditionPlaceholder": "璇疯緭鍏ョ紪鐮佹垨鍚嶇О",
+ "codePlaceholder": "璇疯緭鍏ュ瓧鍏哥紪鐮�",
+ "namePlaceholder": "璇疯緭鍏ュ瓧鍏稿悕绉�"
+ },
+ "table": {
+ "description": "鎻忚堪"
+ },
+ "placeholders": {
+ "code": "璇疯緭鍏ュ瓧鍏哥紪鐮�",
+ "name": "璇疯緭鍏ュ瓧鍏稿悕绉�",
+ "status": "璇烽�夋嫨鐘舵��",
+ "description": "璇疯緭鍏ュ瓧鍏告弿杩�",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "code": "璇疯緭鍏ュ瓧鍏哥紪鐮�",
+ "name": "璇疯緭鍏ュ瓧鍏稿悕绉�"
+ },
+ "dialog": {
+ "titleCreate": "鏂板鏁版嵁瀛楀吀",
+ "titleEdit": "缂栬緫鏁版嵁瀛楀吀",
+ "titleDetail": "鏁版嵁瀛楀吀璇︽儏"
+ },
+ "messages": {
+ "detailFailed": "鑾峰彇鏁版嵁瀛楀吀璇︽儏澶辫触"
+ }
+ },
+ "dept": {
+ "title": "閮ㄩ棬绠$悊",
+ "entity": "閮ㄩ棬",
+ "buttons": {
+ "add": "鏂板閮ㄩ棬"
+ },
+ "table": {
+ "parent": "涓婄骇閮ㄩ棬",
+ "name": "閮ㄩ棬鍚嶇О",
+ "fullName": "閮ㄩ棬鍏ㄧО",
+ "leader": "璐熻矗浜�"
+ },
+ "search": {
+ "conditionPlaceholder": "璇疯緭鍏ラ儴闂ㄥ悕绉�"
+ },
+ "placeholders": {
+ "parentId": "璇烽�夋嫨涓婄骇閮ㄩ棬",
+ "name": "璇疯緭鍏ラ儴闂ㄥ悕绉�",
+ "fullName": "璇疯緭鍏ラ儴闂ㄥ叏绉�",
+ "leader": "璇疯緭鍏ヨ礋璐d汉",
+ "status": "璇烽�夋嫨鐘舵��",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "name": "璇疯緭鍏ラ儴闂ㄥ悕绉�"
+ },
+ "dialog": {
+ "titleCreate": "鏂板閮ㄩ棬",
+ "titleEdit": "缂栬緫閮ㄩ棬"
+ },
+ "messages": {
+ "pageTimeout": "閮ㄩ棬鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "detailFailed": "鑾峰彇閮ㄩ棬璇︽儏澶辫触",
+ "parentSelfInvalid": "涓婄骇閮ㄩ棬涓嶈兘閫夋嫨褰撳墠閮ㄩ棬"
+ }
+ },
+ "userLogin": {
+ "title": "鐧诲綍鏃ュ織",
+ "search": {
+ "token": "Token",
+ "tokenPlaceholder": "璇疯緭鍏� token",
+ "ip": "IP",
+ "ipPlaceholder": "璇疯緭鍏� IP",
+ "system": "绯荤粺",
+ "systemPlaceholder": "璇疯緭鍏ョ郴缁熸爣璇�",
+ "type": "绫诲瀷",
+ "typePlaceholder": "璇烽�夋嫨绫诲瀷"
+ },
+ "table": {
+ "user": "鐢ㄦ埛",
+ "token": "Token",
+ "ip": "IP",
+ "system": "绯荤粺"
+ },
+ "types": {
+ "loginSuccess": "鐧诲綍鎴愬姛",
+ "loginFailed": "鐧诲綍澶辫触",
+ "logout": "閫�鍑虹櫥褰�",
+ "tokenRenew": "token 缁"
+ }
+ },
+ "operationRecord": {
+ "title": "鎿嶄綔鏃ュ織",
+ "entity": "鎿嶄綔鏃ュ織",
+ "reportTitle": "鎿嶄綔鏃ュ織鎶ヨ〃",
+ "search": {
+ "conditionPlaceholder": "璇疯緭鍏ュ悕绉扮┖闂�",
+ "urlPlaceholder": "璇疯緭鍏ユ帴鍙e湴鍧�",
+ "clientIpPlaceholder": "璇疯緭鍏ュ鎴风IP",
+ "timeStart": "寮�濮嬫棩鏈�",
+ "timeEnd": "缁撴潫鏃ユ湡"
+ },
+ "table": {
+ "namespace": "鍚嶇О绌洪棿",
+ "url": "鎺ュ彛鍦板潃",
+ "user": "鎿嶄綔鐢ㄦ埛",
+ "clientIp": "瀹㈡埛绔疘P",
+ "spendTime": "鑰楁椂(ms)",
+ "result": "缁撴灉",
+ "timestamp": "鎿嶄綔鏃堕棿"
+ },
+ "result": {
+ "success": "鎴愬姛",
+ "failed": "澶辫触"
+ },
+ "detail": {
+ "appkey": "骞冲彴瀵嗛挜",
+ "error": "寮傚父淇℃伅",
+ "request": "璇锋眰鍐呭",
+ "response": "鍝嶅簲鍐呭"
+ },
+ "dialog": {
+ "titleDetail": "鎿嶄綔鏃ュ織璇︽儏"
+ },
+ "messages": {
+ "detailFailed": "鑾峰彇鎿嶄綔鏃ュ織璇︽儏澶辫触"
+ }
+ },
+ "aiParam": {
+ "title": "AI 鍙傛暟",
+ "subtitle": "鎸夊崱鐗囩鐞嗗綋鍓嶇敤鎴风殑妯″瀷鎺ュ叆鍙傛暟涓庨粯璁ら厤缃��",
+ "entity": "AI 鍙傛暟",
+ "reportTitle": "AI 鍙傛暟鎶ヨ〃",
+ "empty": "鏆傛棤 AI 鍙傛暟",
+ "buttons": {
+ "add": "鏂板缓鍙傛暟"
+ },
+ "actions": {
+ "setDefault": "璁句负榛樿"
+ },
+ "fields": {
+ "baseUrl": "鍩虹鍦板潃",
+ "lastValidateTime": "鏈�杩戞牎楠�",
+ "timeoutMs": "瓒呮椂鏃堕棿",
+ "streamingEnabled": "娴佸紡鍝嶅簲",
+ "maxTokens": "鏈�澶� Token"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ュ弬鏁板悕绉�",
+ "providerType": "鎻愪緵鏂�",
+ "providerTypePlaceholder": "璇疯緭鍏ユ彁渚涙柟绫诲瀷",
+ "model": "妯″瀷",
+ "modelPlaceholder": "璇疯緭鍏ユā鍨嬪悕绉�",
+ "status": "榛樿鐘舵��"
+ },
+ "status": {
+ "default": "榛樿",
+ "candidate": "鍊欓��"
+ },
+ "validation": {
+ "valid": "宸叉牎楠�",
+ "invalid": "寮傚父",
+ "notTested": "鏈牎楠�"
+ },
+ "streaming": {
+ "enabled": "娴佸紡鍝嶅簲",
+ "disabled": "闈炴祦寮�"
+ },
+ "table": {
+ "name": "鍙傛暟鍚嶇О",
+ "providerType": "鎻愪緵鏂圭被鍨�",
+ "model": "妯″瀷鍚嶇О",
+ "status": "榛樿鐘舵��",
+ "validateStatus": "鏍¢獙鐘舵��",
+ "timeoutMs": "瓒呮椂鏃堕棿"
+ },
+ "summary": {
+ "title": "杩愯鏃舵憳瑕�",
+ "subtitle": "褰撳墠鐢熸晥鐨勬ā鍨嬨�丳rompt 涓� MCP 鎸傝浇姒傚喌",
+ "refresh": "鍒锋柊鎽樿",
+ "activeModel": "褰撳墠妯″瀷",
+ "activePrompt": "褰撳墠 Prompt",
+ "lastPromptUpdate": "鏈�杩戞洿鏂版椂闂� {value}",
+ "enabledMcp": "宸插惎鐢� MCP",
+ "enabledMcpCount": "{count} 涓�",
+ "noMcp": "鏆傛棤鎸傝浇"
+ },
+ "dialog": {
+ "titleCreate": "鏂板缓 AI 鍙傛暟",
+ "titleEdit": "缂栬緫 AI 鍙傛暟",
+ "titleDetail": "AI 鍙傛暟璇︽儏",
+ "runtimeTitle": "杩愯鏃剁姸鎬�",
+ "runtimeDescription": "淇濆瓨鍓嶅彲鍏堟墽琛岃崏绋挎牎楠岋紝杩愯鏃剁姸鎬佺敱鍚庣鐪熷疄杩斿洖銆�",
+ "validateDraft": "鑽夌鏍¢獙",
+ "labels": {
+ "validateStatus": "鏍¢獙鐘舵��",
+ "lastValidateElapsedMs": "鏈�杩戞牎楠岃�楁椂",
+ "lastValidateTime": "鏈�杩戞牎楠屾椂闂�",
+ "updateBy": "鏈�杩戞洿鏂颁汉",
+ "updateTime": "鏈�杩戞洿鏂版椂闂�",
+ "lastValidateMessage": "鏈�杩戞牎楠屼俊鎭�",
+ "name": "鍙傛暟鍚嶇О",
+ "providerType": "鎻愪緵鏂圭被鍨�",
+ "baseUrl": "鍩虹鍦板潃",
+ "apiKey": "API Key",
+ "model": "妯″瀷鍚嶇О",
+ "temperature": "Temperature",
+ "topP": "Top P",
+ "maxTokens": "鏈�澶� Token",
+ "timeoutMs": "瓒呮椂鏃堕棿(ms)",
+ "streamingEnabled": "娴佸紡鍝嶅簲",
+ "status": "榛樿鐘舵��",
+ "memo": "澶囨敞"
+ },
+ "placeholders": {
+ "name": "璇疯緭鍏ュ弬鏁板悕绉�",
+ "providerType": "璇烽�夋嫨鎻愪緵鏂圭被鍨�",
+ "baseUrl": "璇疯緭鍏ュ吋瀹� OpenAI 鐨勫熀纭�鍦板潃",
+ "apiKey": "璇疯緭鍏� API Key",
+ "model": "璇疯緭鍏ユā鍨嬪悕绉�",
+ "temperature": "璇疯緭鍏� temperature",
+ "topP": "璇疯緭鍏� topP",
+ "maxTokens": "璇疯緭鍏ユ渶澶� token",
+ "timeoutMs": "璇疯緭鍏ヨ秴鏃舵椂闂�",
+ "status": "璇烽�夋嫨榛樿鐘舵��",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "name": "璇疯緭鍏ュ弬鏁板悕绉�",
+ "providerType": "璇烽�夋嫨鎻愪緵鏂圭被鍨�",
+ "baseUrl": "璇疯緭鍏ュ熀纭�鍦板潃",
+ "apiKey": "璇疯緭鍏� API Key",
+ "model": "璇疯緭鍏ユā鍨嬪悕绉�"
+ }
+ },
+ "messages": {
+ "setDefaultSuccess": "榛樿鍙傛暟宸叉洿鏂�",
+ "summaryTimeout": "杩愯鏃舵憳瑕佸姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+ "summaryUnavailable": "杩愯鏃舵憳瑕佹殏涓嶅彲鐢�"
+ }
+ },
+ "aiPrompt": {
+ "title": "Prompt 绠$悊",
+ "subtitle": "鎸夊崱鐗囩淮鎶ょ郴缁熸彁绀鸿瘝妯℃澘涓庡満鏅寲鐢ㄦ埛鎻愮ず璇嶃��",
+ "entity": "Prompt",
+ "reportTitle": "Prompt 绠$悊鎶ヨ〃",
+ "empty": "鏆傛棤 Prompt",
+ "buttons": {
+ "add": "鏂板缓 Prompt"
+ },
+ "fields": {
+ "sceneTag": "鍦烘櫙 {value}",
+ "systemPrompt": "绯荤粺鎻愮ず璇�",
+ "userPromptTemplate": "鐢ㄦ埛鎻愮ず璇嶆ā鏉�"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏� Prompt 鍚嶇О",
+ "code": "Prompt 缂栫爜",
+ "codePlaceholder": "璇疯緭鍏� Prompt 缂栫爜",
+ "scene": "鍦烘櫙鏍囪瘑",
+ "scenePlaceholder": "璇疯緭鍏ュ満鏅爣璇�",
+ "status": "鐘舵��"
+ },
+ "table": {
+ "name": "Prompt 鍚嶇О",
+ "code": "Prompt 缂栫爜",
+ "scene": "鍦烘櫙鏍囪瘑",
+ "status": "鐘舵��",
+ "systemPrompt": "绯荤粺鎻愮ず璇�",
+ "userPromptTemplate": "鐢ㄦ埛鎻愮ず璇嶆ā鏉�"
+ },
+ "dialog": {
+ "titleCreate": "鏂板缓 Prompt",
+ "titleEdit": "缂栬緫 Prompt",
+ "titleDetail": "Prompt 璇︽儏",
+ "defaultPreviewInput": "璇锋牴鎹綋鍓嶈緭鍏ョ粰鍑烘憳瑕�",
+ "previewTitle": "娓叉煋棰勮",
+ "previewDescription": "杈撳叆绀轰緥鍐呭鍜� metadata锛岀洿鎺ラ瑙堟渶缁堟覆鏌撶粨鏋溿��",
+ "previewAction": "娓叉煋棰勮",
+ "previewResolvedVariables": "宸茶В鏋愬彉閲忥細{value}",
+ "previewNoVariables": "鏃�",
+ "runtimeTitle": "杩愯鏃剁姸鎬�",
+ "labels": {
+ "updateBy": "鏈�杩戞洿鏂颁汉",
+ "updateTime": "鏈�杩戞洿鏂版椂闂�",
+ "name": "Prompt 鍚嶇О",
+ "code": "Prompt 缂栫爜",
+ "scene": "鍦烘櫙鏍囪瘑",
+ "systemPrompt": "绯荤粺鎻愮ず璇�",
+ "userPromptTemplate": "鐢ㄦ埛鎻愮ず璇嶆ā鏉�",
+ "status": "鐘舵��",
+ "memo": "澶囨敞"
+ },
+ "placeholders": {
+ "previewInput": "璇疯緭鍏ョず渚嬭緭鍏ュ唴瀹�",
+ "metadata": "璇疯緭鍏� JSON metadata锛屼緥濡� {\"path\":\"/system/aiPrompt\"}",
+ "renderedSystemPrompt": "绯荤粺鎻愮ず璇嶆覆鏌撶粨鏋�",
+ "renderedUserPrompt": "鐢ㄦ埛鎻愮ず璇嶆覆鏌撶粨鏋�",
+ "name": "璇疯緭鍏� Prompt 鍚嶇О",
+ "code": "璇疯緭鍏� Prompt 缂栫爜",
+ "scene": "璇疯緭鍏ュ満鏅爣璇�",
+ "systemPrompt": "璇疯緭鍏ョ郴缁熸彁绀鸿瘝",
+ "userPromptTemplate": "璇疯緭鍏ョ敤鎴锋彁绀鸿瘝妯℃澘",
+ "status": "璇烽�夋嫨鐘舵��",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "name": "璇疯緭鍏� Prompt 鍚嶇О",
+ "code": "璇疯緭鍏� Prompt 缂栫爜",
+ "scene": "璇疯緭鍏ュ満鏅爣璇�",
+ "systemPrompt": "璇疯緭鍏ョ郴缁熸彁绀鸿瘝",
+ "userPromptTemplate": "璇疯緭鍏ョ敤鎴锋彁绀鸿瘝妯℃澘"
+ }
+ },
+ "messages": {
+ "previewFailed": "娓叉煋棰勮澶辫触"
+ }
+ },
+ "aiMcpMount": {
+ "title": "MCP 鎸傝浇",
+ "subtitle": "缁存姢褰撳墠鐜鐨� MCP 鏈嶅姟鎸傝浇涓庡仴搴风姸鎬併��",
+ "entity": "MCP 鎸傝浇",
+ "empty": "鏆傛棤 MCP 鎸傝浇",
+ "buttons": {
+ "add": "鏂板鎸傝浇"
+ },
+ "fields": {
+ "target": "鐩爣",
+ "lastTestTime": "鏈�杩戞祴璇曟椂闂�",
+ "timeoutMs": "璇锋眰瓒呮椂",
+ "lastInitElapsedMs": "鏈�杩戝垵濮嬪寲鑰楁椂"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ユ寕杞藉悕绉�",
+ "transportType": "浼犺緭绫诲瀷",
+ "status": "鐘舵��"
+ },
+ "actions": {
+ "connectivityTest": "杩為�氭�ф祴璇�",
+ "toolsPreview": "宸ュ叿棰勮"
+ },
+ "health": {
+ "healthy": "鍋ュ悍",
+ "unhealthy": "寮傚父",
+ "notTested": "鏈祴璇�"
+ },
+ "groups": {
+ "builtin": {
+ "title": "鍐呯疆鎸傝浇",
+ "description": "骞冲彴鍐呯疆鐨� MCP 鑳藉姏闆嗗悎銆�"
+ },
+ "sse": {
+ "title": "SSE / HTTP 鎸傝浇",
+ "description": "閫氳繃 HTTP/SSE 鍗忚鎺ュ叆鐨勮繙绋� MCP 鏈嶅姟銆�"
+ },
+ "stdio": {
+ "title": "STDIO 鎸傝浇",
+ "description": "閫氳繃鍛戒护琛岃繘绋嬪惎鍔ㄥ苟閫氫俊鐨� MCP 鏈嶅姟銆�"
+ }
+ },
+ "dialog": {
+ "titleCreate": "鏂板 MCP 鎸傝浇",
+ "titleEdit": "缂栬緫 MCP 鎸傝浇",
+ "titleDetail": "MCP 鎸傝浇璇︽儏",
+ "runtimeTitle": "杩愯鏃剁姸鎬�",
+ "draftTestTitle": "鑽夌杩為�氭�ф祴璇�",
+ "draftTestDescription": "淇濆瓨鍓嶅彲鍏堢敤褰撳墠琛ㄥ崟閰嶇疆鍋氳崏绋胯繛閫氭�ф祴璇曘��",
+ "draftTestAction": "娴嬭瘯褰撳墠閰嶇疆",
+ "runtimeLabels": {
+ "healthStatus": "鍋ュ悍鐘舵��",
+ "lastTestTime": "鏈�杩戞祴璇曟椂闂�",
+ "lastTestMessage": "鏈�杩戞祴璇曚俊鎭�",
+ "lastInitElapsedMs": "鏈�杩戝垵濮嬪寲鑰楁椂",
+ "updateTime": "鏈�杩戞洿鏂版椂闂�"
+ },
+ "labels": {
+ "name": "鎸傝浇鍚嶇О",
+ "transportType": "浼犺緭绫诲瀷",
+ "status": "鐘舵��",
+ "serverUrl": "鏈嶅姟鍦板潃",
+ "endpoint": "SSE/HTTP 璺緞",
+ "command": "鍚姩鍛戒护",
+ "argsJson": "鍛戒护鍙傛暟(JSON)",
+ "envJson": "鐜鍙橀噺(JSON)",
+ "headersJson": "璇锋眰澶�(JSON)",
+ "builtinCode": "鍐呯疆鑳藉姏缂栫爜",
+ "requestTimeoutMs": "璇锋眰瓒呮椂(ms)",
+ "sort": "鎺掑簭",
+ "memo": "澶囨敞"
+ },
+ "placeholders": {
+ "name": "璇疯緭鍏ユ寕杞藉悕绉�",
+ "transportType": "璇烽�夋嫨浼犺緭绫诲瀷",
+ "status": "璇烽�夋嫨鐘舵��",
+ "serverUrl": "璇疯緭鍏ユ湇鍔″湴鍧�",
+ "endpoint": "璇疯緭鍏ユ帴鍙h矾寰�",
+ "command": "璇疯緭鍏ュ惎鍔ㄥ懡浠�",
+ "argsJson": "璇疯緭鍏� JSON 鏁扮粍锛屼緥濡� [\"server.js\"]",
+ "envJson": "璇疯緭鍏� JSON 瀵硅薄锛屼緥濡� {\"NODE_ENV\":\"production\"}",
+ "headersJson": "璇疯緭鍏� JSON 瀵硅薄锛屼緥濡� {\"Authorization\":\"Bearer ...\"}",
+ "builtinCode": "璇疯緭鍏ュ唴缃兘鍔涚紪鐮�",
+ "requestTimeoutMs": "璇疯緭鍏ヨ姹傝秴鏃�",
+ "sort": "璇疯緭鍏ユ帓搴忓��",
+ "memo": "璇疯緭鍏ュ娉�"
+ },
+ "validation": {
+ "name": "璇疯緭鍏ユ寕杞藉悕绉�",
+ "transportType": "璇烽�夋嫨浼犺緭绫诲瀷"
+ }
+ },
+ "toolsDrawer": {
+ "title": "MCP 宸ュ叿棰勮",
+ "currentMount": "褰撳墠鎸傝浇",
+ "description": "棰勮褰撳墠鎸傝浇鏆撮湶鐨勫伐鍏凤紝骞舵敮鎸佸湪绾挎祴璇曘��",
+ "refreshTools": "鍒锋柊宸ュ叿",
+ "connectivityTest": "杩為�氭�ф祴璇�",
+ "empty": "褰撳墠鎸傝浇娌℃湁鍙敤宸ュ叿",
+ "toolTest": "娴嬭瘯宸ュ叿",
+ "toolInputRequired": "璇疯緭鍏ュ伐鍏峰弬鏁� JSON",
+ "toolTestSuccess": "宸ュ叿璋冪敤鎴愬姛",
+ "toolTestFailed": "宸ュ叿璋冪敤澶辫触",
+ "toolsLoadFailed": "宸ュ叿鍔犺浇澶辫触",
+ "toolsTimeout": "宸ュ叿鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "toolTestTimeout": "宸ュ叿璋冪敤瓒呮椂锛屽凡鍋滄绛夊緟",
+ "inputSchema": "杈撳叆 Schema",
+ "inputJson": "杈撳叆鍙傛暟(JSON)",
+ "inputJsonPlaceholder": "璇疯緭鍏� JSON 鍙傛暟锛屼緥濡� {\"keyword\":\"task\"}",
+ "output": "杈撳嚭缁撴灉",
+ "outputPlaceholder": "鏆傛棤杈撳嚭缁撴灉"
+ },
+ "messages": {
+ "connectivitySuccess": "杩為�氭�ф祴璇曟垚鍔�",
+ "connectivityFailed": "杩為�氭�ф祴璇曞け璐�",
+ "connectivityTimeout": "杩為�氭�ф祴璇曡秴鏃讹紝宸插仠姝㈢瓑寰�",
+ "draftConnectivitySuccess": "鑽夌杩為�氭�ф祴璇曟垚鍔�",
+ "draftConnectivityFailed": "鑽夌杩為�氭�ф祴璇曞け璐�",
+ "toolsTimeout": "宸ュ叿鍒楄〃鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "toolTestTimeout": "宸ュ叿璋冪敤瓒呮椂锛屽凡鍋滄绛夊緟",
+ "initElapsedMs": "鍒濆鍖栬�楁椂 {value} ms"
+ }
+ },
+ "aiObserve": {
+ "title": "AI 瑙傛祴",
+ "summaryTitle": "AI 瑙傛祴鎽樿",
+ "summaryDescription": "瑙傚療 AI 璋冪敤鐘舵�併�佽�楁椂銆乀okens 涓� MCP 宸ュ叿鎵ц鎯呭喌銆�",
+ "reportTitle": "AI 瑙傛祴鎶ヨ〃",
+ "stats": {
+ "callCount": "璋冪敤娆℃暟",
+ "avgElapsed": "骞冲潎鑰楁椂",
+ "totalTokens": "鎬� Tokens",
+ "toolSuccessRate": "宸ュ叿鎴愬姛鐜�",
+ "successFailure": "鎴愬姛 {success} / 澶辫触 {failure}",
+ "firstTokenLatency": "棣栧寘 {value} ms",
+ "avgTokens": "骞冲潎 {value} Tokens",
+ "toolCallFailure": "璋冪敤 {callCount} / 澶辫触 {failureCount}"
+ },
+ "search": {
+ "condition": "鍏抽敭瀛�",
+ "conditionPlaceholder": "璇疯緭鍏ヨ姹侷D鎴� Prompt",
+ "requestId": "璇锋眰ID",
+ "requestIdPlaceholder": "璇疯緭鍏ヨ姹侷D",
+ "promptCode": "Prompt 缂栫爜",
+ "promptCodePlaceholder": "璇疯緭鍏� Prompt 缂栫爜",
+ "user": "鐢ㄦ埛",
+ "userPlaceholder": "璇疯緭鍏ョ敤鎴稩D",
+ "status": "鐘舵��",
+ "statusPlaceholder": "璇烽�夋嫨鐘舵��"
+ },
+ "status": {
+ "running": "鎵ц涓�",
+ "completed": "宸插畬鎴�",
+ "failed": "澶辫触",
+ "aborted": "宸蹭腑姝�"
+ },
+ "detail": {
+ "title": "AI 瑙傛祴璇︽儏",
+ "requestId": "璇锋眰ID",
+ "sessionId": "浼氳瘽ID",
+ "prompt": "Prompt",
+ "model": "妯″瀷",
+ "user": "鐢ㄦ埛",
+ "status": "鐘舵��",
+ "mountedMcp": "鎸傝浇 MCP",
+ "configuredMcpCount": "閰嶇疆 MCP 鏁�",
+ "toolCallCount": "宸ュ叿璋冪敤",
+ "toolSuccessFailure": "鎴愬姛/澶辫触",
+ "elapsed": "鎬昏�楁椂",
+ "firstTokenLatency": "棣栧寘鑰楁椂",
+ "createTime": "鍒涘缓鏃堕棿",
+ "updateTime": "鏇存柊鏃堕棿",
+ "errorCategory": "閿欒鍒嗙被",
+ "errorStage": "閿欒闃舵",
+ "errorMessage": "閿欒淇℃伅",
+ "mcpLogs": "MCP 璋冪敤鏃ュ織",
+ "inputSummary": "杈撳叆鎽樿",
+ "outputSummary": "杈撳嚭鎽樿",
+ "emptyMcpLogs": "鏆傛棤 MCP 璋冪敤鏃ュ織"
+ },
+ "table": {
+ "requestId": "璇锋眰ID",
+ "prompt": "Prompt",
+ "model": "妯″瀷",
+ "user": "鐢ㄦ埛",
+ "status": "鐘舵��",
+ "elapsed": "鎬昏�楁椂",
+ "totalTokens": "鎬� Tokens",
+ "createTime": "鍒涘缓鏃堕棿"
+ },
+ "messages": {
+ "detailTimeout": "AI 瑙傛祴璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "mcpLogsTimeout": "MCP 璋冪敤鏃ュ織鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "detailFailed": "鑾峰彇 AI 瑙傛祴璇︽儏澶辫触",
+ "statsTimeout": "AI 瑙傛祴鎽樿鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+ "statsFailed": "鑾峰彇 AI 瑙傛祴鎽樿澶辫触"
+ }
+ },
"role": {
"entity": "瑙掕壊",
"reportTitle": "瑙掕壊绠$悊鎶ヨ〃",
diff --git a/rsf-design/src/utils/sys/upgrade.js b/rsf-design/src/utils/sys/upgrade.js
index 6bc6974..be8a5e4 100644
--- a/rsf-design/src/utils/sys/upgrade.js
+++ b/rsf-design/src/utils/sys/upgrade.js
@@ -1,5 +1,6 @@
import { upgradeLogList } from '@/mock/upgrade/changeLog'
import { ElNotification } from 'element-plus'
+import { $t } from '@/locales'
import { useUserStore } from '@/store/modules/user'
import { StorageConfig } from '@/utils/storage/storage-config'
class VersionManager {
@@ -78,13 +79,13 @@
const { title: content } = upgradeLogList.value[0]
const messageParts = [
`<p style="color: var(--art-gray-800) !important; padding-bottom: 5px;">`,
- `绯荤粺宸插崌绾у埌 ${StorageConfig.CURRENT_VERSION} 鐗堟湰锛屾娆℃洿鏂板甫鏉ヤ簡浠ヤ笅鏀硅繘锛歚,
+ $t('message.systemUpgradeIntro', { version: StorageConfig.CURRENT_VERSION }),
`</p>`,
content
]
if (requireReLogin) {
messageParts.push(
- `<p style="color: var(--theme-color); padding-top: 5px;">鍗囩骇瀹屾垚锛岃閲嶆柊鐧诲綍鍚庣户缁娇鐢ㄣ��</p>`
+ `<p style="color: var(--theme-color); padding-top: 5px;">${$t('message.systemUpgradeRelogin')}</p>`
)
}
return messageParts.join('')
@@ -94,7 +95,7 @@
*/
showUpgradeNotification(message) {
ElNotification({
- title: '绯荤粺鍗囩骇鍏憡',
+ title: $t('message.systemUpgradeTitle'),
message,
duration: 0,
type: 'success',
diff --git a/rsf-design/src/views/basic-info/bas-container/basContainerTable.columns.js b/rsf-design/src/views/basic-info/bas-container/basContainerTable.columns.js
index 36c2dee..7fb05d0 100644
--- a/rsf-design/src/views/basic-info/bas-container/basContainerTable.columns.js
+++ b/rsf-design/src/views/basic-info/bas-container/basContainerTable.columns.js
@@ -1,6 +1,7 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
import { getBasContainerStatusMeta } from './basContainerPage.helpers'
@@ -12,14 +13,14 @@
canEdit = true,
canDelete = true
}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
@@ -30,34 +31,34 @@
},
{
type: 'globalIndex',
- label: '搴忓彿',
+ label: $t('table.index'),
width: 72,
align: 'center'
},
{
prop: 'containerTypeText',
- label: '瀹瑰櫒绫诲瀷',
+ label: $t('pages.basicInfo.basContainer.table.containerType'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.containerTypeText || row.containerType$ || '--'
},
{
prop: 'code',
- label: '鍞竴缂栫爜',
+ label: $t('pages.basicInfo.basContainer.table.code'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.code || '--'
},
{
prop: 'codeType',
- label: '鏉$爜绫诲瀷',
+ label: $t('pages.basicInfo.basContainer.table.codeType'),
minWidth: 130,
showOverflowTooltip: true,
formatter: (row) => row.codeType || '--'
},
{
prop: 'areasText',
- label: '鍙叆搴撳尯',
+ label: $t('pages.basicInfo.basContainer.table.areas'),
minWidth: 220,
showOverflowTooltip: true,
formatter: (row) => {
@@ -74,7 +75,7 @@
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100,
align: 'center',
formatter: (row) => {
@@ -84,42 +85,42 @@
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || row.updateBy$ || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
},
{
prop: 'createByText',
- label: '鍒涘缓浜�',
+ label: $t('table.createBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.createByText || row.createBy$ || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || row.createTime$ || '--'
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.remark'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/bas-station-area/basStationAreaPage.helpers.js b/rsf-design/src/views/basic-info/bas-station-area/basStationAreaPage.helpers.js
index d6b337f..b3046db 100644
--- a/rsf-design/src/views/basic-info/bas-station-area/basStationAreaPage.helpers.js
+++ b/rsf-design/src/views/basic-info/bas-station-area/basStationAreaPage.helpers.js
@@ -1,32 +1,21 @@
import { $t } from '@/locales'
-const STATUS_META = {
- 1: { text: $t('common.status.normal'), type: 'success', bool: true },
- 0: { text: $t('common.status.frozen'), type: 'danger', bool: false }
-}
-
-const TYPE_OPTIONS = [
- { label: $t('pages.basicInfo.basStationArea.type.smart'), value: 0 },
- { label: $t('pages.basicInfo.basStationArea.type.normal'), value: 1 }
-]
-
-const BINARY_OPTIONS = [
- { label: $t('common.status.no'), value: 0 },
- { label: $t('common.status.yes'), value: 1 }
-]
-
-const STATUS_OPTIONS = [
- { label: $t('common.status.normal'), value: 1 },
- { label: $t('common.status.frozen'), value: 0 }
-]
-
-export const BAS_STATION_AREA_REPORT_TITLE = $t('pages.basicInfo.basStationArea.reportTitle')
export const BAS_STATION_AREA_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
orientation: 'portrait',
density: 'compact',
showSequence: true
+}
+
+function getStatusMeta(status, t = $t) {
+ if (status === true || Number(status) === 1) {
+ return { text: t('common.status.normal'), type: 'success', bool: true }
+ }
+ if (status === false || Number(status) === 0) {
+ return { text: t('common.status.frozen'), type: 'danger', bool: false }
+ }
+ return { text: t('common.status.unknown'), type: 'info', bool: false }
}
function normalizeText(value) {
@@ -41,14 +30,14 @@
return Number.isNaN(parsed) ? fallback : parsed
}
-function normalizeBooleanText(value) {
- if (value === 1 || value === '1' || value === true || value === $t('common.status.yes')) {
- return $t('common.status.yes')
+function normalizeBooleanText(value, t = $t) {
+ if (value === 1 || value === '1' || value === true || value === t('common.status.yes')) {
+ return t('common.status.yes')
}
- if (value === 0 || value === '0' || value === false || value === $t('common.status.no')) {
- return $t('common.status.no')
+ if (value === 0 || value === '0' || value === false || value === t('common.status.no')) {
+ return t('common.status.no')
}
- return normalizeText(value) || $t('common.placeholder.empty')
+ return normalizeText(value) || t('common.placeholder.empty')
}
function normalizeIdArray(values = []) {
@@ -94,16 +83,6 @@
.filter(Boolean)
return labels.length ? labels.join($t('common.listSeparator')) : $t('common.placeholder.empty')
-}
-
-function getStatusMeta(status) {
- if (status === true || Number(status) === 1) {
- return STATUS_META[1]
- }
- if (status === false || Number(status) === 0) {
- return STATUS_META[0]
- }
- return { text: $t('common.status.unknown'), type: 'info', bool: false }
}
export function createBasStationAreaSearchState() {
@@ -161,16 +140,29 @@
}
}
-export function getBasStationAreaTypeOptions() {
- return TYPE_OPTIONS
+export function getBasStationAreaReportTitle(t = $t) {
+ return t('pages.basicInfo.basStationArea.reportTitle')
}
-export function getBasStationAreaBinaryOptions() {
- return BINARY_OPTIONS
+export function getBasStationAreaTypeOptions(t = $t) {
+ return [
+ { label: t('pages.basicInfo.basStationArea.type.smart'), value: 0 },
+ { label: t('pages.basicInfo.basStationArea.type.normal'), value: 1 }
+ ]
}
-export function getBasStationAreaStatusOptions() {
- return STATUS_OPTIONS
+export function getBasStationAreaBinaryOptions(t = $t) {
+ return [
+ { label: t('common.status.no'), value: 0 },
+ { label: t('common.status.yes'), value: 1 }
+ ]
+}
+
+export function getBasStationAreaStatusOptions(t = $t) {
+ return [
+ { label: t('common.status.normal'), value: 1 },
+ { label: t('common.status.frozen'), value: 0 }
+ ]
}
export function resolveBasStationAreaWarehouseAreaOptions(records = []) {
@@ -417,7 +409,8 @@
}
export function normalizeBasStationAreaDetailRecord(record = {}, resolvers = {}) {
- const statusMeta = getStatusMeta(record.statusBool ?? record.status)
+ const t = resolvers.t || $t
+ const statusMeta = getStatusMeta(record.statusBool ?? record.status, t)
const typeValue = record.type$ ?? record.type
const areaId = record.area ?? record.areaId ?? record.area$
const crossZoneAreaIds = normalizeIdArray(record.crossZoneArea)
@@ -428,54 +421,54 @@
return {
...record,
id: normalizeIdValue(record.id),
- stationAreaName: normalizeText(record.stationAreaName) || $t('common.placeholder.empty'),
- stationAreaId: normalizeText(record.stationAreaId) || $t('common.placeholder.empty'),
+ stationAreaName: normalizeText(record.stationAreaName) || t('common.placeholder.empty'),
+ stationAreaId: normalizeText(record.stationAreaId) || t('common.placeholder.empty'),
type: normalizeIdValue(record.type),
typeText: normalizeText(
record.type$ || record.typeText || resolvers.resolveTypeLabel?.(typeValue) || typeValue
- ) || $t('common.placeholder.empty'),
+ ) || t('common.placeholder.empty'),
inAble: normalizeIdValue(record.inAble),
- inAbleText: normalizeBooleanText(record.inAble),
+ inAbleText: normalizeBooleanText(record.inAble, t),
outAble: normalizeIdValue(record.outAble),
- outAbleText: normalizeBooleanText(record.outAble),
+ outAbleText: normalizeBooleanText(record.outAble, t),
useStatus: normalizeText(record.useStatus),
useStatusText:
normalizeText(record.useStatus$ || record.useStatusText || resolvers.resolveUseStatusLabel?.(record.useStatus) || record.useStatus) ||
- $t('common.placeholder.empty'),
+ t('common.placeholder.empty'),
area: normalizeIdValue(areaId),
- areaText: normalizeText(record.area$ || record.areaText || resolvers.resolveAreaLabel?.(areaId) || '') || $t('common.placeholder.empty'),
+ areaText: normalizeText(record.area$ || record.areaText || resolvers.resolveAreaLabel?.(areaId) || '') || t('common.placeholder.empty'),
isCrossZone: normalizeIdValue(record.isCrossZone),
- isCrossZoneText: normalizeBooleanText(record.isCrossZone),
+ isCrossZoneText: normalizeBooleanText(record.isCrossZone, t),
crossZoneArea: crossZoneAreaIds,
crossZoneAreaText:
resolveOptionText(crossZoneAreaIds, resolvers.resolveCrossZoneAreaLabel, record.crossZoneAreaText || []) ||
- $t('common.placeholder.empty'),
+ t('common.placeholder.empty'),
isWcs: normalizeIdValue(record.isWcs),
- isWcsText: normalizeBooleanText(record.isWcs),
- wcsData: normalizeText(record.wcsData) || $t('common.placeholder.empty'),
+ isWcsText: normalizeBooleanText(record.isWcs, t),
+ wcsData: normalizeText(record.wcsData) || t('common.placeholder.empty'),
containerType: containerTypeIds,
containerTypeText:
resolveOptionText(containerTypeIds, resolvers.resolveContainerTypeLabel, record.containerTypesText || []) ||
- $t('common.placeholder.empty'),
- barcode: normalizeText(record.barcode) || $t('common.placeholder.empty'),
+ t('common.placeholder.empty'),
+ barcode: normalizeText(record.barcode) || t('common.placeholder.empty'),
autoTransfer: normalizeIdValue(record.autoTransfer),
- autoTransferText: normalizeBooleanText(record.autoTransfer),
+ autoTransferText: normalizeBooleanText(record.autoTransfer, t),
stationAlias: stationAliasIds,
stationAliasText:
resolveOptionText(
stationAliasIds,
resolvers.resolveStationAliasLabel,
stationAliasNames.length ? stationAliasNames : record.stationAliasText || []
- ) || $t('common.placeholder.empty'),
+ ) || t('common.placeholder.empty'),
status: normalizeIdValue(record.status),
statusText: statusMeta.text,
statusType: statusMeta.type,
statusBool: record.statusBool !== void 0 ? Boolean(record.statusBool) : statusMeta.bool,
- memo: normalizeText(record.memo) || $t('common.placeholder.empty'),
- createByText: normalizeText(record.createBy$ || record.createByText || '') || $t('common.placeholder.empty'),
- createTimeText: normalizeText(record.createTime$ || record.createTime || '') || $t('common.placeholder.empty'),
- updateByText: normalizeText(record.updateBy$ || record.updateByText || '') || $t('common.placeholder.empty'),
- updateTimeText: normalizeText(record.updateTime$ || record.updateTime || '') || $t('common.placeholder.empty')
+ memo: normalizeText(record.memo) || t('common.placeholder.empty'),
+ createByText: normalizeText(record.createBy$ || record.createByText || '') || t('common.placeholder.empty'),
+ createTimeText: normalizeText(record.createTime$ || record.createTime || '') || t('common.placeholder.empty'),
+ updateByText: normalizeText(record.updateBy$ || record.updateByText || '') || t('common.placeholder.empty'),
+ updateTimeText: normalizeText(record.updateTime$ || record.updateTime || '') || t('common.placeholder.empty')
}
}
@@ -493,10 +486,11 @@
export function buildBasStationAreaReportMeta({
previewMeta = {},
count = 0,
- orientation = BAS_STATION_AREA_REPORT_STYLE.orientation
+ orientation = BAS_STATION_AREA_REPORT_STYLE.orientation,
+ t = $t
} = {}) {
return {
- reportTitle: BAS_STATION_AREA_REPORT_TITLE,
+ reportTitle: getBasStationAreaReportTitle(t),
reportDate: previewMeta.reportDate,
printedAt: previewMeta.printedAt,
operator: previewMeta.operator,
diff --git a/rsf-design/src/views/basic-info/bas-station-area/basStationAreaTable.columns.js b/rsf-design/src/views/basic-info/bas-station-area/basStationAreaTable.columns.js
index 761091b..476dfae 100644
--- a/rsf-design/src/views/basic-info/bas-station-area/basStationAreaTable.columns.js
+++ b/rsf-design/src/views/basic-info/bas-station-area/basStationAreaTable.columns.js
@@ -9,16 +9,17 @@
handleEdit,
handleDelete,
canEdit = true,
- canDelete = true
+ canDelete = true,
+ t = $t
} = {}) {
- const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
@@ -29,115 +30,115 @@
},
{
type: 'globalIndex',
- label: $t('table.index'),
+ label: t('table.index'),
width: 72,
align: 'center'
},
{
prop: 'stationAreaId',
- label: $t('pages.basicInfo.basStationArea.search.stationAreaId'),
+ label: t('pages.basicInfo.basStationArea.search.stationAreaId'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.stationAreaId || '--'
},
{
prop: 'stationAreaName',
- label: $t('pages.basicInfo.basStationArea.search.stationAreaName'),
+ label: t('pages.basicInfo.basStationArea.search.stationAreaName'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.stationAreaName || '--'
},
{
prop: 'typeText',
- label: $t('pages.basicInfo.basStationArea.search.type'),
+ label: t('pages.basicInfo.basStationArea.search.type'),
width: 120,
align: 'center',
formatter: (row) => row.typeText || '--'
},
{
prop: 'areaText',
- label: $t('pages.basicInfo.basStationArea.search.area'),
+ label: t('pages.basicInfo.basStationArea.search.area'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.areaText || '--'
},
{
prop: 'crossZoneAreaText',
- label: $t('pages.basicInfo.basStationArea.table.crossZoneArea'),
+ label: t('pages.basicInfo.basStationArea.table.crossZoneArea'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.crossZoneAreaText || '--'
},
{
prop: 'containerTypeText',
- label: $t('pages.basicInfo.basStationArea.search.containerType'),
+ label: t('pages.basicInfo.basStationArea.search.containerType'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.containerTypeText || '--'
},
{
prop: 'stationAliasText',
- label: $t('pages.basicInfo.basStationArea.search.stationAlias'),
+ label: t('pages.basicInfo.basStationArea.search.stationAlias'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.stationAliasText || '--'
},
{
prop: 'inAbleText',
- label: $t('pages.basicInfo.basStationArea.table.inAble'),
+ label: t('pages.basicInfo.basStationArea.table.inAble'),
width: 84,
align: 'center',
formatter: (row) => row.inAbleText || '--'
},
{
prop: 'outAbleText',
- label: $t('pages.basicInfo.basStationArea.table.outAble'),
+ label: t('pages.basicInfo.basStationArea.table.outAble'),
width: 84,
align: 'center',
formatter: (row) => row.outAbleText || '--'
},
{
prop: 'isCrossZoneText',
- label: $t('pages.basicInfo.basStationArea.table.isCrossZone'),
+ label: t('pages.basicInfo.basStationArea.table.isCrossZone'),
width: 84,
align: 'center',
formatter: (row) => row.isCrossZoneText || '--'
},
{
prop: 'isWcsText',
- label: $t('table.wcs'),
+ label: t('table.wcs'),
width: 84,
align: 'center',
formatter: (row) => row.isWcsText || '--'
},
{
prop: 'autoTransferText',
- label: $t('pages.basicInfo.basStationArea.search.autoTransfer'),
+ label: t('pages.basicInfo.basStationArea.search.autoTransfer'),
width: 100,
align: 'center',
formatter: (row) => row.autoTransferText || '--'
},
{
prop: 'useStatusText',
- label: $t('pages.basicInfo.basStationArea.search.useStatus'),
+ label: t('pages.basicInfo.basStationArea.search.useStatus'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.useStatusText || '--'
},
{
prop: 'barcode',
- label: $t('pages.basicInfo.basStationArea.search.barcode'),
+ label: t('pages.basicInfo.basStationArea.search.barcode'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.barcode || '--'
},
{
prop: 'status',
- label: $t('pages.basicInfo.basStationArea.search.status'),
+ label: t('pages.basicInfo.basStationArea.search.status'),
width: 96,
align: 'center',
formatter: (row) => {
- const status = getBasStationAreaStatusOptions().find((item) => Number(item.value) === Number(row.status))
+ const status = getBasStationAreaStatusOptions(t).find((item) => Number(item.value) === Number(row.status))
const text = status?.label || row.statusText || '--'
const type = Number(row.status) === 1 ? 'success' : Number(row.status) === 0 ? 'danger' : 'info'
return h(ElTag, { type, effect: 'light' }, () => text)
@@ -145,21 +146,21 @@
},
{
prop: 'updateTimeText',
- label: $t('table.updateTime'),
+ label: t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'memo',
- label: $t('pages.basicInfo.basStationArea.search.memo'),
+ label: t('pages.basicInfo.basStationArea.search.memo'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'operation',
- label: $t('table.operation'),
+ label: t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/bas-station-area/index.vue b/rsf-design/src/views/basic-info/bas-station-area/index.vue
index a3d8b83..562414f 100644
--- a/rsf-design/src/views/basic-info/bas-station-area/index.vue
+++ b/rsf-design/src/views/basic-info/bas-station-area/index.vue
@@ -103,7 +103,6 @@
import { createBasStationAreaTableColumns } from './basStationAreaTable.columns'
import {
BAS_STATION_AREA_REPORT_STYLE,
- BAS_STATION_AREA_REPORT_TITLE,
buildBasStationAreaDialogModel,
buildBasStationAreaPageQueryParams,
buildBasStationAreaPrintRows,
@@ -113,6 +112,7 @@
createBasStationAreaSearchState,
getBasStationAreaBinaryOptions,
getBasStationAreaPaginationKey,
+ getBasStationAreaReportTitle,
getBasStationAreaStatusOptions,
getBasStationAreaTypeOptions,
normalizeBasStationAreaDetailRecord,
@@ -161,7 +161,7 @@
const typeLabelMap = computed(
() =>
new Map(
- getBasStationAreaTypeOptions()
+ getBasStationAreaTypeOptions(t)
.map((item) => [String(item.value), item.label])
.filter(([value, label]) => value && label)
)
@@ -189,7 +189,7 @@
const resolveTypeLabel = (value) => typeLabelMap.value.get(String(value)) || ''
const resolveStationAliasLabel = (id) => stationLabelMap.value.get(String(id)) || ''
const resolveUseStatusLabel = (value) => useStatusLabelMap.value.get(String(value)) || ''
- const reportTitle = BAS_STATION_AREA_REPORT_TITLE
+ const reportTitle = computed(() => getBasStationAreaReportTitle(t))
const reportQueryParams = computed(() => buildBasStationAreaSearchParams(searchForm.value))
const searchItems = computed(() => [
@@ -248,7 +248,7 @@
type: 'select',
props: {
clearable: true,
- options: getBasStationAreaTypeOptions()
+ options: getBasStationAreaTypeOptions(t)
}
},
{
@@ -367,7 +367,7 @@
type: 'select',
props: {
clearable: true,
- options: getBasStationAreaStatusOptions()
+ options: getBasStationAreaStatusOptions(t)
}
},
{
@@ -393,6 +393,7 @@
}
)
detailData.value = normalizeBasStationAreaDetailRecord(detail, {
+ t,
resolveAreaLabel,
resolveCrossZoneAreaLabel,
resolveContainerTypeLabel,
@@ -490,6 +491,7 @@
paginationKey: getBasStationAreaPaginationKey(),
columnsFactory: () =>
createBasStationAreaTableColumns({
+ t,
handleView: openDetail,
handleEdit: hasAuth('update') ? openEditDialog : null,
handleDelete: hasAuth('delete') ? (row) => handleDeleteAction?.(row) : null,
@@ -504,6 +506,7 @@
}
return records.map((item) =>
normalizeBasStationAreaListRow(item, {
+ t,
resolveAreaLabel,
resolveCrossZoneAreaLabel,
resolveContainerTypeLabel,
@@ -577,6 +580,7 @@
resolvePrintRecords,
buildPreviewRows: (records) =>
buildBasStationAreaPrintRows(records, {
+ t,
resolveAreaLabel,
resolveCrossZoneAreaLabel,
resolveContainerTypeLabel,
@@ -591,7 +595,8 @@
buildBasStationAreaReportMeta({
previewMeta: previewMeta.value,
count: previewRows.value.length,
- orientation: previewMeta.value?.reportStyle?.orientation || BAS_STATION_AREA_REPORT_STYLE.orientation
+ orientation: previewMeta.value?.reportStyle?.orientation || BAS_STATION_AREA_REPORT_STYLE.orientation,
+ t
})
)
diff --git a/rsf-design/src/views/basic-info/bas-station-area/modules/bas-station-area-dialog.vue b/rsf-design/src/views/basic-info/bas-station-area/modules/bas-station-area-dialog.vue
index 03f889c..32e068a 100644
--- a/rsf-design/src/views/basic-info/bas-station-area/modules/bas-station-area-dialog.vue
+++ b/rsf-design/src/views/basic-info/bas-station-area/modules/bas-station-area-dialog.vue
@@ -96,7 +96,7 @@
props: {
placeholder: t('pages.basicInfo.basStationArea.search.type'),
clearable: true,
- options: getBasStationAreaTypeOptions()
+ options: getBasStationAreaTypeOptions(t)
}
},
{
@@ -159,7 +159,7 @@
props: {
placeholder: t('pages.basicInfo.basStationArea.search.inAble'),
clearable: true,
- options: getBasStationAreaBinaryOptions()
+ options: getBasStationAreaBinaryOptions(t)
}
},
{
@@ -169,7 +169,7 @@
props: {
placeholder: t('pages.basicInfo.basStationArea.search.outAble'),
clearable: true,
- options: getBasStationAreaBinaryOptions()
+ options: getBasStationAreaBinaryOptions(t)
}
},
{
@@ -179,7 +179,7 @@
props: {
placeholder: t('pages.basicInfo.basStationArea.search.isCrossZone'),
clearable: true,
- options: getBasStationAreaBinaryOptions()
+ options: getBasStationAreaBinaryOptions(t)
}
},
{
@@ -189,7 +189,7 @@
props: {
placeholder: t('pages.basicInfo.basStationArea.search.isWcs'),
clearable: true,
- options: getBasStationAreaBinaryOptions()
+ options: getBasStationAreaBinaryOptions(t)
}
},
{
@@ -199,7 +199,7 @@
props: {
placeholder: t('pages.basicInfo.basStationArea.search.autoTransfer'),
clearable: true,
- options: getBasStationAreaBinaryOptions()
+ options: getBasStationAreaBinaryOptions(t)
}
},
{
@@ -241,7 +241,7 @@
props: {
placeholder: t('pages.basicInfo.basStationArea.search.status'),
clearable: true,
- options: getBasStationAreaStatusOptions()
+ options: getBasStationAreaStatusOptions(t)
}
},
{
diff --git a/rsf-design/src/views/basic-info/bas-station/basStationTable.columns.js b/rsf-design/src/views/basic-info/bas-station/basStationTable.columns.js
index 6dc12ad..6a6c46f 100644
--- a/rsf-design/src/views/basic-info/bas-station/basStationTable.columns.js
+++ b/rsf-design/src/views/basic-info/bas-station/basStationTable.columns.js
@@ -1,6 +1,7 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
import {
getBasStationUseStatusMeta,
getBasStationStatusMeta,
@@ -14,36 +15,36 @@
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
{
prop: 'stationName',
- label: '绔欑偣缂栫爜',
+ label: $t('pages.basicInfo.basStation.table.stationCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.stationName || '--'
},
{
prop: 'stationId',
- label: '绔欑偣鍚嶇О',
+ label: $t('pages.basicInfo.basStation.table.stationName'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.stationId || '--'
},
{
prop: 'typeText',
- label: '绔欑偣绫诲瀷',
+ label: $t('pages.basicInfo.basStation.table.type'),
width: 110,
align: 'center',
formatter: (row) => {
@@ -53,7 +54,7 @@
},
{
prop: 'useStatusText',
- label: '浣跨敤鐘舵��',
+ label: $t('pages.basicInfo.basStation.table.useStatus'),
width: 110,
align: 'center',
formatter: (row) => {
@@ -63,70 +64,70 @@
},
{
prop: 'areaText',
- label: '鎵�灞炲簱鍖�',
+ label: $t('pages.basicInfo.basStation.table.area'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.areaText || row.area$ || '--'
},
{
prop: 'crossZoneAreaText',
- label: '鍙法鍖哄簱鍖�',
+ label: $t('pages.basicInfo.basStation.table.crossZoneArea'),
minWidth: 220,
showOverflowTooltip: true,
formatter: (row) => row.crossZoneAreaText || '--'
},
{
prop: 'containerTypesText',
- label: '鍙叆瀹瑰櫒绫诲瀷',
+ label: $t('pages.basicInfo.basStation.table.containerTypes'),
minWidth: 200,
showOverflowTooltip: true,
formatter: (row) => row.containerTypesText || '--'
},
{
prop: 'barcode',
- label: '鏉$爜',
+ label: $t('pages.basicInfo.basStation.table.barcode'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.barcode || '--'
},
{
prop: 'inAbleText',
- label: '鍙叆',
+ label: $t('pages.basicInfo.basStation.table.inAble'),
width: 90,
align: 'center',
formatter: (row) => row.inAbleText || '--'
},
{
prop: 'outAbleText',
- label: '鍙嚭',
+ label: $t('pages.basicInfo.basStation.table.outAble'),
width: 90,
align: 'center',
formatter: (row) => row.outAbleText || '--'
},
{
prop: 'isCrossZoneText',
- label: '鏄惁璺ㄥ尯',
+ label: $t('pages.basicInfo.basStation.table.isCrossZone'),
width: 100,
align: 'center',
formatter: (row) => row.isCrossZoneText || '--'
},
{
prop: 'isWcsText',
- label: '鏄惁WCS',
+ label: $t('pages.basicInfo.basStation.table.isWcs'),
width: 100,
align: 'center',
formatter: (row) => row.isWcsText || '--'
},
{
prop: 'autoTransferText',
- label: '鑷姩璋冩嫧',
+ label: $t('pages.basicInfo.basStation.table.autoTransfer'),
width: 100,
align: 'center',
formatter: (row) => row.autoTransferText || '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100,
align: 'center',
formatter: (row) => {
@@ -136,28 +137,28 @@
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || row.updateBy$ || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.remark'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/companys/companysPage.helpers.js b/rsf-design/src/views/basic-info/companys/companysPage.helpers.js
index e375f44..63502f4 100644
--- a/rsf-design/src/views/basic-info/companys/companysPage.helpers.js
+++ b/rsf-design/src/views/basic-info/companys/companysPage.helpers.js
@@ -1,9 +1,11 @@
const STATUS_META = {
- 1: { text: '姝e父', type: 'success', bool: true },
- 0: { text: '鍐荤粨', type: 'danger', bool: false }
+ 1: { textKey: 'common.status.normal', fallback: 'Normal', type: 'success', bool: true },
+ 0: { textKey: 'common.status.frozen', fallback: 'Frozen', type: 'danger', bool: false }
}
-export const COMPANYS_REPORT_TITLE = '寰�鏉ヤ紒涓氭姤琛�'
+export function getCompanysReportTitle(t) {
+ return typeof t === 'function' ? t('pages.basicInfo.companys.reportTitle') : 'Company Report'
+}
export const COMPANYS_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
@@ -61,10 +63,10 @@
}
}
-export function getCompanysStatusOptions() {
+export function getCompanysStatusOptions(t) {
return [
- { label: '姝e父', value: 1 },
- { label: '鍐荤粨', value: 0 }
+ { label: typeof t === 'function' ? t('common.status.normal') : 'Normal', value: 1 },
+ { label: typeof t === 'function' ? t('common.status.frozen') : 'Frozen', value: 0 }
]
}
@@ -82,7 +84,7 @@
if (status === false || Number(status) === 0) {
return STATUS_META[0]
}
- return { text: '鏈煡', type: 'info', bool: false }
+ return { textKey: 'common.status.unknown', fallback: 'Unknown', type: 'info', bool: false }
}
export function buildCompanysTypeOptions(records = []) {
@@ -212,7 +214,8 @@
city: normalizeText(record.city || ''),
address: normalizeText(record.address || ''),
memo: normalizeText(record.memo || ''),
- statusText: statusMeta.text,
+ statusTextKey: statusMeta.textKey,
+ statusText: statusMeta.fallback,
statusType: statusMeta.type,
statusBool: record.statusBool !== void 0 ? Boolean(record.statusBool) : statusMeta.bool,
createByText: normalizeText(record.createBy$ || record.createByText || ''),
@@ -239,7 +242,7 @@
orientation = COMPANYS_REPORT_STYLE.orientation
} = {}) {
return {
- reportTitle: COMPANYS_REPORT_TITLE,
+ reportTitle: previewMeta.reportTitle,
reportDate: previewMeta.reportDate,
printedAt: previewMeta.printedAt,
operator: previewMeta.operator,
diff --git a/rsf-design/src/views/basic-info/companys/companysTable.columns.js b/rsf-design/src/views/basic-info/companys/companysTable.columns.js
index 01935b6..510373b 100644
--- a/rsf-design/src/views/basic-info/companys/companysTable.columns.js
+++ b/rsf-design/src/views/basic-info/companys/companysTable.columns.js
@@ -1,9 +1,11 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
import { getCompanysStatusMeta } from './companysPage.helpers'
export function createCompanysTableColumns({
+ t = $t,
handleView,
handleEdit,
handleDelete,
@@ -11,80 +13,82 @@
canDelete = true,
resolveTypeLabel
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
- { prop: 'code', label: '浼佷笟缂栫爜', minWidth: 140, showOverflowTooltip: true, formatter: (row) => row.code || '--' },
- { prop: 'name', label: '浼佷笟鍚嶇О', minWidth: 170, showOverflowTooltip: true, formatter: (row) => row.name || '--' },
- { prop: 'nameEn', label: '鑻辨枃鍒悕', minWidth: 160, showOverflowTooltip: true, formatter: (row) => row.nameEn || '--' },
- { prop: 'breifCode', label: '鍔╄鐮�', minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.breifCode || '--' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
+ { prop: 'code', label: $t('pages.basicInfo.companys.table.code'), minWidth: 140, showOverflowTooltip: true, formatter: (row) => row.code || '--' },
+ { prop: 'name', label: $t('pages.basicInfo.companys.table.name'), minWidth: 170, showOverflowTooltip: true, formatter: (row) => row.name || '--' },
+ { prop: 'nameEn', label: $t('pages.basicInfo.companys.table.nameEn'), minWidth: 160, showOverflowTooltip: true, formatter: (row) => row.nameEn || '--' },
+ { prop: 'breifCode', label: $t('pages.basicInfo.companys.table.briefCode'), minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.breifCode || '--' },
{
prop: 'typeText',
- label: '浼佷笟绫诲瀷',
+ label: $t('pages.basicInfo.companys.table.type'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) =>
row.typeText || (typeof resolveTypeLabel === 'function' ? resolveTypeLabel(row.type) : '') || '--'
},
- { prop: 'contact', label: '鑱旂郴浜�', minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.contact || '--' },
- { prop: 'tel', label: '鑱旂郴鐢佃瘽', minWidth: 140, showOverflowTooltip: true, formatter: (row) => row.tel || '--' },
- { prop: 'email', label: '閭', minWidth: 180, showOverflowTooltip: true, formatter: (row) => row.email || '--' },
- { prop: 'pcode', label: '閭紪', minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.pcode || '--' },
- { prop: 'province', label: '鐪佷唤', minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.province || '--' },
- { prop: 'city', label: '鍩庡競', minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.city || '--' },
- { prop: 'address', label: '鍦板潃', minWidth: 220, showOverflowTooltip: true, formatter: (row) => row.address || '--' },
+ { prop: 'contact', label: $t('pages.basicInfo.companys.table.contact'), minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.contact || '--' },
+ { prop: 'tel', label: $t('pages.basicInfo.companys.table.tel'), minWidth: 140, showOverflowTooltip: true, formatter: (row) => row.tel || '--' },
+ { prop: 'email', label: $t('pages.basicInfo.companys.table.email'), minWidth: 180, showOverflowTooltip: true, formatter: (row) => row.email || '--' },
+ { prop: 'pcode', label: $t('pages.basicInfo.companys.table.postCode'), minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.pcode || '--' },
+ { prop: 'province', label: $t('pages.basicInfo.companys.table.province'), minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.province || '--' },
+ { prop: 'city', label: $t('pages.basicInfo.companys.table.city'), minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.city || '--' },
+ { prop: 'address', label: $t('pages.basicInfo.companys.table.address'), minWidth: 220, showOverflowTooltip: true, formatter: (row) => row.address || '--' },
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100,
align: 'center',
formatter: (row) => {
const statusMeta = getCompanysStatusMeta(row.statusBool ?? row.status)
- return h(ElTag, { type: statusMeta.type, effect: 'light' }, () => statusMeta.text)
+ return h(ElTag, { type: statusMeta.type, effect: 'light' }, () =>
+ statusMeta.textKey ? t(statusMeta.textKey) : statusMeta.fallback
+ )
}
},
- { prop: 'memo', label: '澶囨敞', minWidth: 180, showOverflowTooltip: true, formatter: (row) => row.memo || '--' },
+ { prop: 'memo', label: $t('table.remark'), minWidth: 180, showOverflowTooltip: true, formatter: (row) => row.memo || '--' },
{
prop: 'createByText',
- label: '鍒涘缓浜�',
+ label: $t('table.createBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.createByText || row.createBy$ || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || row.createTime$ || '--'
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || row.updateBy$ || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/companys/index.vue b/rsf-design/src/views/basic-info/companys/index.vue
index abc0bf2..7629628 100644
--- a/rsf-design/src/views/basic-info/companys/index.vue
+++ b/rsf-design/src/views/basic-info/companys/index.vue
@@ -12,7 +12,7 @@
<ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
<template #left>
<ElSpace wrap>
- <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>鏂板浼佷笟</ElButton>
+ <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>{{ t('pages.basicInfo.companys.buttons.add') }}</ElButton>
<ElButton
v-auth="'delete'"
type="danger"
@@ -20,7 +20,7 @@
@click="handleBatchDelete"
v-ripple
>
- 鎵归噺鍒犻櫎
+ {{ t('common.actions.batchDelete') }}
</ElButton>
<ListExportPrint
class="inline-flex"
@@ -70,6 +70,7 @@
<script setup>
import { computed, onMounted, ref } from 'vue'
+ import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/store/modules/user'
import { useAuth } from '@/hooks/core/useAuth'
@@ -94,7 +95,6 @@
import { createCompanysTableColumns } from './companysTable.columns'
import {
COMPANYS_REPORT_STYLE,
- COMPANYS_REPORT_TITLE,
buildCompanysDialogModel,
buildCompanysPageQueryParams,
buildCompanysSavePayload,
@@ -104,11 +104,13 @@
buildCompanysTypeOptions,
createCompanysSearchState,
getCompanysPaginationKey,
+ getCompanysReportTitle,
normalizeCompanysListRow
} from './companysPage.helpers'
defineOptions({ name: 'Companys' })
+ const { t } = useI18n()
const { hasAuth } = useAuth()
const userStore = useUserStore()
@@ -119,7 +121,7 @@
const detailData = ref({})
let handleDeleteAction = null
- const reportTitle = COMPANYS_REPORT_TITLE
+ const reportTitle = computed(() => getCompanysReportTitle(t))
const reportQueryParams = computed(() => buildCompanysSearchParams(searchForm.value))
const typeLabelMap = computed(
() =>
@@ -136,20 +138,20 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('table.keyword'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヤ紒涓氬悕绉�/缂栫爜/鑱旂郴浜�/鐢佃瘽'
+ placeholder: t('pages.basicInfo.companys.search.conditionPlaceholder')
}
},
- { label: '浼佷笟缂栫爜', key: 'code', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ヤ紒涓氱紪鐮�' } },
- { label: '浼佷笟鍚嶇О', key: 'name', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ヤ紒涓氬悕绉�' } },
- { label: '鑻辨枃鍒悕', key: 'nameEn', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ヨ嫳鏂囧埆鍚�' } },
- { label: '鍔╄鐮�', key: 'breifCode', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ姪璁扮爜' } },
+ { label: t('pages.basicInfo.companys.table.code'), key: 'code', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.codePlaceholder') } },
+ { label: t('pages.basicInfo.companys.table.name'), key: 'name', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.namePlaceholder') } },
+ { label: t('pages.basicInfo.companys.table.nameEn'), key: 'nameEn', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.nameEnPlaceholder') } },
+ { label: t('pages.basicInfo.companys.table.briefCode'), key: 'breifCode', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.briefCodePlaceholder') } },
{
- label: '浼佷笟绫诲瀷',
+ label: t('pages.basicInfo.companys.table.type'),
key: 'type',
type: 'select',
props: {
@@ -158,26 +160,26 @@
options: typeOptions.value
}
},
- { label: '鑱旂郴浜�', key: 'contact', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ヨ仈绯讳汉' } },
- { label: '鑱旂郴鐢佃瘽', key: 'tel', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ヨ仈绯荤數璇�' } },
- { label: '閭', key: 'email', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ラ偖绠�' } },
- { label: '閭紪', key: 'pcode', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ラ偖缂�' } },
- { label: '鐪佷唤', key: 'province', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ョ渷浠�' } },
- { label: '鍩庡競', key: 'city', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ煄甯�' } },
- { label: '鍦板潃', key: 'address', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ湴鍧�' } },
+ { label: t('pages.basicInfo.companys.table.contact'), key: 'contact', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.contactPlaceholder') } },
+ { label: t('pages.basicInfo.companys.table.tel'), key: 'tel', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.telPlaceholder') } },
+ { label: t('pages.basicInfo.companys.table.email'), key: 'email', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.emailPlaceholder') } },
+ { label: t('pages.basicInfo.companys.table.postCode'), key: 'pcode', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.postCodePlaceholder') } },
+ { label: t('pages.basicInfo.companys.table.province'), key: 'province', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.provincePlaceholder') } },
+ { label: t('pages.basicInfo.companys.table.city'), key: 'city', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.cityPlaceholder') } },
+ { label: t('pages.basicInfo.companys.table.address'), key: 'address', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.addressPlaceholder') } },
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: {
clearable: true,
options: [
- { label: '姝e父', value: 1 },
- { label: '鍐荤粨', value: 0 }
+ { label: t('common.status.normal'), value: 1 },
+ { label: t('common.status.frozen'), value: 0 }
]
}
},
- { label: '澶囨敞', key: 'memo', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ娉�' } }
+ { label: t('table.remark'), key: 'memo', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.memoPlaceholder') } }
])
async function openDetail(row) {
@@ -185,13 +187,13 @@
detailLoading.value = true
try {
const detail = await guardRequestWithMessage(fetchGetCompanysDetail(row.id), {}, {
- timeoutMessage: '寰�鏉ヤ紒涓氳鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�'
+ timeoutMessage: t('pages.basicInfo.companys.messages.detailTimeout')
})
detailData.value = normalizeCompanysListRow(detail, resolveTypeLabel)
} catch (error) {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇寰�鏉ヤ紒涓氳鎯呭け璐�')
+ ElMessage.error(error?.message || t('pages.basicInfo.companys.messages.detailFailed'))
} finally {
detailLoading.value = false
}
@@ -200,11 +202,11 @@
async function openEditDialog(row) {
try {
const detail = await guardRequestWithMessage(fetchGetCompanysDetail(row.id), {}, {
- timeoutMessage: '寰�鏉ヤ紒涓氳鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�'
+ timeoutMessage: t('pages.basicInfo.companys.messages.detailTimeout')
})
showDialog('edit', detail)
} catch (error) {
- ElMessage.error(error?.message || '鑾峰彇寰�鏉ヤ紒涓氳鎯呭け璐�')
+ ElMessage.error(error?.message || t('pages.basicInfo.companys.messages.detailFailed'))
}
}
@@ -230,6 +232,7 @@
paginationKey: getCompanysPaginationKey(),
columnsFactory: () =>
createCompanysTableColumns({
+ t,
handleView: openDetail,
handleEdit: hasAuth('update') ? openEditDialog : null,
handleDelete: hasAuth('delete') ? (row) => handleDeleteAction?.(row) : null,
@@ -265,7 +268,7 @@
saveRequest: fetchSaveCompanys,
updateRequest: fetchUpdateCompanys,
deleteRequest: fetchDeleteCompanys,
- entityName: '寰�鏉ヤ紒涓�',
+ entityName: t('pages.basicInfo.companys.entity'),
resolveRecordLabel: (record) => record?.name || record?.code || record?.id,
refreshCreate,
refreshUpdate,
@@ -276,6 +279,7 @@
const buildPreviewMeta = (rows) => {
const now = new Date()
return {
+ reportTitle: reportTitle.value,
reportDate: now.toLocaleDateString('zh-CN'),
printedAt: now.toLocaleString('zh-CN', { hour12: false }),
operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -344,7 +348,7 @@
status: 1
}),
{ records: [] },
- { timeoutMessage: '浼佷笟绫诲瀷鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+ { timeoutMessage: t('pages.basicInfo.companys.messages.typeOptionsTimeout') }
)
typeOptions.value = buildCompanysTypeOptions(defaultResponseAdapter(response).records)
}
diff --git a/rsf-design/src/views/basic-info/companys/modules/companys-detail-drawer.vue b/rsf-design/src/views/basic-info/companys/modules/companys-detail-drawer.vue
index 3c6bb18..eaa8412 100644
--- a/rsf-design/src/views/basic-info/companys/modules/companys-detail-drawer.vue
+++ b/rsf-design/src/views/basic-info/companys/modules/companys-detail-drawer.vue
@@ -1,7 +1,7 @@
<template>
<ElDrawer
:model-value="visible"
- title="寰�鏉ヤ紒涓氳鎯�"
+ :title="t('pages.basicInfo.companys.dialog.titleDetail')"
size="960px"
destroy-on-close
@update:model-value="handleVisibleChange"
@@ -11,32 +11,32 @@
<ElSkeleton :rows="12" animated />
</div>
<div v-else class="space-y-4">
- <ElDescriptions title="鍩虹淇℃伅" :column="2" border>
- <ElDescriptionsItem label="浼佷笟缂栫爜">{{ detail.code || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浼佷笟鍚嶇О">{{ detail.name || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鑻辨枃鍒悕">{{ detail.nameEn || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍔╄鐮�">{{ detail.breifCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浼佷笟绫诲瀷">{{ detail.typeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鑱旂郴浜�">{{ detail.contact || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鑱旂郴鐢佃瘽">{{ detail.tel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閭">{{ detail.email || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閭紪">{{ detail.pcode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐪佷唤">{{ detail.province || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍩庡競">{{ detail.city || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍦板潃" :span="2">{{ detail.address || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">
+ <ElDescriptions :title="t('pages.basicInfo.companys.detail.sections.basic')" :column="2" border>
+ <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.code')">{{ detail.code || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.name')">{{ detail.name || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.nameEn')">{{ detail.nameEn || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.briefCode')">{{ detail.breifCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.type')">{{ detail.typeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.contact')">{{ detail.contact || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.tel')">{{ detail.tel || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.email')">{{ detail.email || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.postCode')">{{ detail.pcode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.province')">{{ detail.province || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.city')">{{ detail.city || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.address')" :span="2">{{ detail.address || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.status')">
<ElTag :type="detail.statusType || 'info'" effect="light">
- {{ detail.statusText || '--' }}
+ {{ detail.statusTextKey ? t(detail.statusTextKey) : detail.statusText || '--' }}
</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.remark')" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
</ElDescriptions>
- <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptions :title="t('pages.basicInfo.companys.detail.sections.audit')" :column="2" border>
+ <ElDescriptionsItem :label="t('table.createBy')">{{ detail.createByText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateBy')">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
</ElDescriptions>
</div>
</ElScrollbar>
@@ -45,6 +45,7 @@
<script setup>
import { computed } from 'vue'
+ import { useI18n } from 'vue-i18n'
const props = defineProps({
visible: { type: Boolean, default: false },
@@ -53,6 +54,7 @@
})
const emit = defineEmits(['update:visible'])
+ const { t } = useI18n()
const visible = computed({
get: () => props.visible,
diff --git a/rsf-design/src/views/basic-info/companys/modules/companys-dialog.vue b/rsf-design/src/views/basic-info/companys/modules/companys-dialog.vue
index 02459c0..37ea9aa 100644
--- a/rsf-design/src/views/basic-info/companys/modules/companys-dialog.vue
+++ b/rsf-design/src/views/basic-info/companys/modules/companys-dialog.vue
@@ -22,8 +22,8 @@
<template #footer>
<span class="dialog-footer">
- <ElButton @click="handleCancel">鍙栨秷</ElButton>
- <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+ <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+ <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
</span>
</template>
</ElDialog>
@@ -31,6 +31,7 @@
<script setup>
import { computed, nextTick, reactive, ref, watch } from 'vue'
+ import { useI18n } from 'vue-i18n'
import ArtForm from '@/components/core/forms/art-form/index.vue'
import {
buildCompanysDialogModel,
@@ -48,148 +49,151 @@
const emit = defineEmits(['update:visible', 'submit'])
const formRef = ref()
const form = reactive(createCompanysFormState())
+ const { t } = useI18n()
const isEdit = computed(() => props.dialogType === 'edit')
- const dialogTitle = computed(() => (isEdit.value ? '缂栬緫寰�鏉ヤ紒涓�' : '鏂板寰�鏉ヤ紒涓�'))
+ const dialogTitle = computed(() =>
+ isEdit.value ? t('pages.basicInfo.companys.dialog.titleEdit') : t('pages.basicInfo.companys.dialog.titleCreate')
+ )
const rules = computed(() => ({
- name: [{ required: true, message: '璇疯緭鍏ヤ紒涓氬悕绉�', trigger: 'blur' }],
- breifCode: [{ required: true, message: '璇疯緭鍏ュ姪璁扮爜', trigger: 'blur' }],
- type: [{ required: true, message: '璇烽�夋嫨浼佷笟绫诲瀷', trigger: 'change' }]
+ name: [{ required: true, message: t('pages.basicInfo.companys.validation.name'), trigger: 'blur' }],
+ breifCode: [{ required: true, message: t('pages.basicInfo.companys.validation.briefCode'), trigger: 'blur' }],
+ type: [{ required: true, message: t('pages.basicInfo.companys.validation.type'), trigger: 'change' }]
}))
const formItems = computed(() => [
{
- label: '浼佷笟缂栫爜',
+ label: t('pages.basicInfo.companys.table.code'),
key: 'code',
type: 'input',
props: {
- placeholder: '鐣欑┖灏嗚嚜鍔ㄧ敓鎴�',
+ placeholder: t('pages.basicInfo.companys.placeholders.code'),
clearable: true,
disabled: isEdit.value
}
},
{
- label: '浼佷笟鍚嶇О',
+ label: t('pages.basicInfo.companys.table.name'),
key: 'name',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ヤ紒涓氬悕绉�',
+ placeholder: t('pages.basicInfo.companys.placeholders.name'),
clearable: true
}
},
{
- label: '鑻辨枃鍒悕',
+ label: t('pages.basicInfo.companys.table.nameEn'),
key: 'nameEn',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ヨ嫳鏂囧埆鍚�',
+ placeholder: t('pages.basicInfo.companys.placeholders.nameEn'),
clearable: true
}
},
{
- label: '鍔╄鐮�',
+ label: t('pages.basicInfo.companys.table.briefCode'),
key: 'breifCode',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ュ姪璁扮爜',
+ placeholder: t('pages.basicInfo.companys.placeholders.briefCode'),
clearable: true
}
},
{
- label: '浼佷笟绫诲瀷',
+ label: t('pages.basicInfo.companys.table.type'),
key: 'type',
type: 'select',
props: {
- placeholder: '璇烽�夋嫨浼佷笟绫诲瀷',
+ placeholder: t('pages.basicInfo.companys.placeholders.type'),
clearable: true,
filterable: true,
options: props.typeOptions
}
},
{
- label: '鑱旂郴浜�',
+ label: t('pages.basicInfo.companys.table.contact'),
key: 'contact',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ヨ仈绯讳汉',
+ placeholder: t('pages.basicInfo.companys.placeholders.contact'),
clearable: true
}
},
{
- label: '鑱旂郴鐢佃瘽',
+ label: t('pages.basicInfo.companys.table.tel'),
key: 'tel',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ヨ仈绯荤數璇�',
+ placeholder: t('pages.basicInfo.companys.placeholders.tel'),
clearable: true
}
},
{
- label: '閭',
+ label: t('pages.basicInfo.companys.table.email'),
key: 'email',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ラ偖绠�',
+ placeholder: t('pages.basicInfo.companys.placeholders.email'),
clearable: true
}
},
{
- label: '閭紪',
+ label: t('pages.basicInfo.companys.table.postCode'),
key: 'pcode',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ラ偖缂�',
+ placeholder: t('pages.basicInfo.companys.placeholders.postCode'),
clearable: true
}
},
{
- label: '鐪佷唤',
+ label: t('pages.basicInfo.companys.table.province'),
key: 'province',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ョ渷浠�',
+ placeholder: t('pages.basicInfo.companys.placeholders.province'),
clearable: true
}
},
{
- label: '鍩庡競',
+ label: t('pages.basicInfo.companys.table.city'),
key: 'city',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ュ煄甯�',
+ placeholder: t('pages.basicInfo.companys.placeholders.city'),
clearable: true
}
},
{
- label: '鍦板潃',
+ label: t('pages.basicInfo.companys.table.address'),
key: 'address',
type: 'input',
span: 24,
props: {
- placeholder: '璇疯緭鍏ュ湴鍧�',
+ placeholder: t('pages.basicInfo.companys.placeholders.address'),
clearable: true
}
},
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: {
- placeholder: '璇烽�夋嫨鐘舵��',
+ placeholder: t('pages.basicInfo.companys.placeholders.status'),
clearable: true,
- options: getCompanysStatusOptions()
+ options: getCompanysStatusOptions(t)
}
},
{
- label: '澶囨敞',
+ label: t('table.remark'),
key: 'memo',
type: 'input',
span: 24,
props: {
type: 'textarea',
rows: 3,
- placeholder: '璇疯緭鍏ュ娉�',
+ placeholder: t('pages.basicInfo.companys.placeholders.memo'),
clearable: true
}
}
diff --git a/rsf-design/src/views/basic-info/contract/contractTable.columns.js b/rsf-design/src/views/basic-info/contract/contractTable.columns.js
index df71411..ac165a6 100644
--- a/rsf-design/src/views/basic-info/contract/contractTable.columns.js
+++ b/rsf-design/src/views/basic-info/contract/contractTable.columns.js
@@ -1,16 +1,17 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
export function createContractTableColumns({ handleView, handleEdit, handleDelete, canEdit = true, canDelete = true }) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
@@ -21,68 +22,68 @@
},
{
type: 'globalIndex',
- label: '搴忓彿',
+ label: $t('table.index'),
width: 72,
align: 'center'
},
{
prop: 'code',
- label: '鍚堝悓缂栫爜',
+ label: $t('pages.basicInfo.contract.table.code'),
minWidth: 160,
showOverflowTooltip: true
},
{
prop: 'name',
- label: '鍚堝悓鍚嶇О',
+ label: $t('pages.basicInfo.contract.table.name'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'projectName',
- label: '椤圭洰鍚嶇О',
+ label: $t('pages.basicInfo.contract.table.projectName'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100,
align: 'center',
formatter: (row) => h(ElTag, { type: row.statusType || 'info', effect: 'light' }, () => row.statusText || '--')
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'createByText',
- label: '鍒涘缓浜�',
+ label: $t('table.createBy'),
minWidth: 120,
showOverflowTooltip: true
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.remark'),
minWidth: 200,
showOverflowTooltip: true
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/device-bind/deviceBindTable.columns.js b/rsf-design/src/views/basic-info/device-bind/deviceBindTable.columns.js
index 5ffea55..6c7a1f6 100644
--- a/rsf-design/src/views/basic-info/device-bind/deviceBindTable.columns.js
+++ b/rsf-design/src/views/basic-info/device-bind/deviceBindTable.columns.js
@@ -1,4 +1,5 @@
import { h } from 'vue'
+import { $t } from '@/locales'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
import { getDeviceBindFlagMeta } from './deviceBindPage.helpers'
@@ -11,71 +12,71 @@
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
{
prop: 'currentRow',
- label: '褰撳墠鎺掑彿',
+ label: $t('pages.basicInfo.deviceBind.table.currentRow'),
width: 100,
align: 'center',
formatter: (row) => row.currentRow ?? '--'
},
{
prop: 'startRow',
- label: '璧峰鎺掑彿',
+ label: $t('pages.basicInfo.deviceBind.table.startRow'),
width: 100,
align: 'center',
formatter: (row) => row.startRow ?? '--'
},
{
prop: 'endRow',
- label: '缁堟鎺掑彿',
+ label: $t('pages.basicInfo.deviceBind.table.endRow'),
width: 100,
align: 'center',
formatter: (row) => row.endRow ?? '--'
},
{
prop: 'deviceQty',
- label: '璁惧鏁伴噺',
+ label: $t('pages.basicInfo.deviceBind.table.deviceQty'),
width: 100,
align: 'center',
formatter: (row) => row.deviceQty ?? '--'
},
{
prop: 'startDeviceNo',
- label: '璧峰璁惧鍙�',
+ label: $t('pages.basicInfo.deviceBind.table.startDeviceNo'),
width: 110,
align: 'center',
formatter: (row) => row.startDeviceNo ?? '--'
},
{
prop: 'endDeviceNo',
- label: '缁堟璁惧鍙�',
+ label: $t('pages.basicInfo.deviceBind.table.endDeviceNo'),
width: 110,
align: 'center',
formatter: (row) => row.endDeviceNo ?? '--'
},
{
prop: 'staList',
- label: '绔欑偣鍒楄〃',
+ label: $t('pages.basicInfo.deviceBind.table.staList'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.staList || '--'
},
{
prop: 'typeIdText',
- label: '搴撳尯绫诲瀷',
+ label: $t('pages.basicInfo.deviceBind.table.typeId'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) =>
@@ -83,7 +84,7 @@
},
{
prop: 'beSimilar',
- label: '鐗╂枡鐩镐技',
+ label: $t('pages.basicInfo.deviceBind.table.beSimilar'),
width: 100,
align: 'center',
formatter: (row) => {
@@ -93,7 +94,7 @@
},
{
prop: 'emptySimilar',
- label: '绌烘澘闈犺繎',
+ label: $t('pages.basicInfo.deviceBind.table.emptySimilar'),
width: 100,
align: 'center',
formatter: (row) => {
@@ -103,28 +104,28 @@
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.memo'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/device-site/deviceSiteTable.columns.js b/rsf-design/src/views/basic-info/device-site/deviceSiteTable.columns.js
index 8e06c02..7597a25 100644
--- a/rsf-design/src/views/basic-info/device-site/deviceSiteTable.columns.js
+++ b/rsf-design/src/views/basic-info/device-site/deviceSiteTable.columns.js
@@ -1,6 +1,7 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
import { getDeviceSiteStatusMeta } from './deviceSitePage.helpers'
export function createDeviceSiteTableColumns({
@@ -11,103 +12,103 @@
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (handleInit) {
- operations.push({ key: 'init', label: '鍒濆鍖�', icon: 'ri:route-line' })
+ operations.push({ key: 'init', label: $t('common.actions.initialize'), icon: 'ri:route-line' })
}
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
{
prop: 'typeText',
- label: '绔欑偣绫诲瀷',
+ label: $t('pages.basicInfo.deviceSite.table.type'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.typeText || row.type$ || '--'
},
{
prop: 'site',
- label: '浣滀笟绔欑偣',
+ label: $t('pages.basicInfo.deviceSite.table.site'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.site || '--'
},
{
prop: 'name',
- label: '鍚嶇О',
+ label: $t('pages.basicInfo.deviceSite.table.name'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.name || '--'
},
{
prop: 'target',
- label: '鐩爣绔欑偣',
+ label: $t('pages.basicInfo.deviceSite.table.target'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.target || '--'
},
{
prop: 'label',
- label: '绔欑偣鏍囩',
+ label: $t('pages.basicInfo.deviceSite.table.label'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.label || '--'
},
{
prop: 'deviceText',
- label: '璁惧绫诲瀷',
+ label: $t('pages.basicInfo.deviceSite.table.deviceType'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.deviceText || row.device$ || row.device || '--'
},
{
prop: 'deviceCode',
- label: '璁惧缂栧彿',
+ label: $t('pages.basicInfo.deviceSite.table.deviceCode'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.deviceCode || '--'
},
{
prop: 'deviceSite',
- label: '璁惧绔欑偣',
+ label: $t('pages.basicInfo.deviceSite.table.deviceSite'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.deviceSite || '--'
},
{
prop: 'channel',
- label: '宸烽亾',
+ label: $t('pages.basicInfo.deviceSite.table.channel'),
width: 90,
align: 'center',
formatter: (row) => row.channel ?? '--'
},
{
prop: 'areaIdStart',
- label: '婧愬簱鍖�',
+ label: $t('pages.basicInfo.deviceSite.table.areaStart'),
width: 100,
align: 'center',
formatter: (row) => row.areaIdStart ?? '--'
},
{
prop: 'areaIdEnd',
- label: '鐩爣搴撳尯',
+ label: $t('pages.basicInfo.deviceSite.table.areaEnd'),
width: 100,
align: 'center',
formatter: (row) => row.areaIdEnd ?? '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100,
align: 'center',
formatter: (row) => {
@@ -117,21 +118,21 @@
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.remark'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/loc-area-mat-rela/locAreaMatRelaTable.columns.js b/rsf-design/src/views/basic-info/loc-area-mat-rela/locAreaMatRelaTable.columns.js
index 6929fc1..e9c6180 100644
--- a/rsf-design/src/views/basic-info/loc-area-mat-rela/locAreaMatRelaTable.columns.js
+++ b/rsf-design/src/views/basic-info/loc-area-mat-rela/locAreaMatRelaTable.columns.js
@@ -1,4 +1,5 @@
import { h } from 'vue'
+import { $t } from '@/locales'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
import { getLocAreaMatRelaStatusMeta } from './locAreaMatRelaPage.helpers'
@@ -10,14 +11,14 @@
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
@@ -28,69 +29,69 @@
},
{
type: 'globalIndex',
- label: '搴忓彿',
+ label: $t('table.index'),
width: 72,
align: 'center'
},
{
prop: 'areaMatIdText',
- label: '涓诲崟',
+ label: $t('pages.basicInfo.locAreaMatRela.table.areaMatId'),
minWidth: 200,
showOverflowTooltip: true,
formatter: (row) => row.areaMatIdText || row.areaMatId || '--'
},
{
prop: 'areaIdText',
- label: '搴撳尯',
+ label: $t('pages.basicInfo.locAreaMatRela.table.areaId'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.areaIdText || '--'
},
{
prop: 'code',
- label: '缂栧彿',
+ label: $t('pages.basicInfo.locAreaMatRela.table.code'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.code || '--'
},
{
prop: 'matnrIdText',
- label: '鐗╂枡',
+ label: $t('pages.basicInfo.locAreaMatRela.table.matnrId'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.matnrIdText || '--'
},
{
prop: 'groupIdText',
- label: '鐗╂枡鍒嗙粍',
+ label: $t('pages.basicInfo.locAreaMatRela.table.groupId'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.groupIdText || '--'
},
{
prop: 'locTypeIdText',
- label: '搴撲綅绫诲瀷',
+ label: $t('pages.basicInfo.locAreaMatRela.table.locTypeId'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.locTypeIdText || '--'
},
{
prop: 'locIdText',
- label: '搴撲綅',
+ label: $t('pages.basicInfo.locAreaMatRela.table.locId'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.locIdText || '--'
},
{
prop: 'relationTypeText',
- label: '鍏崇郴绫诲瀷',
+ label: $t('pages.basicInfo.locAreaMatRela.table.relationType'),
width: 110,
align: 'center',
formatter: (row) => row.relationTypeText || '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 96,
align: 'center',
formatter: (row) => {
@@ -100,28 +101,28 @@
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.memo'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/loc-area-mat/locAreaMatTable.columns.js b/rsf-design/src/views/basic-info/loc-area-mat/locAreaMatTable.columns.js
index 1a63162..9733761 100644
--- a/rsf-design/src/views/basic-info/loc-area-mat/locAreaMatTable.columns.js
+++ b/rsf-design/src/views/basic-info/loc-area-mat/locAreaMatTable.columns.js
@@ -1,4 +1,5 @@
import { h } from 'vue'
+import { $t } from '@/locales'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
import { getLocAreaMatStatusMeta } from './locAreaMatPage.helpers'
@@ -10,14 +11,14 @@
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
@@ -28,41 +29,41 @@
},
{
type: 'globalIndex',
- label: '搴忓彿',
+ label: $t('table.index'),
width: 72,
align: 'center'
},
{
prop: 'code',
- label: '閫昏緫缂栧彿',
+ label: $t('pages.basicInfo.locAreaMat.table.code'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.code || '--'
},
{
prop: 'warehouseName',
- label: '浠撳簱',
+ label: $t('pages.basicInfo.locAreaMat.table.warehouseName'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.warehouseName || row.warehouseIdText || '--'
},
{
prop: 'areaName',
- label: '搴撳尯',
+ label: $t('pages.basicInfo.locAreaMat.table.areaName'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.areaName || row.areaIdText || '--'
},
{
prop: 'depict',
- label: '閫昏緫鎻忚堪',
+ label: $t('pages.basicInfo.locAreaMat.table.depict'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.depict || '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 96,
align: 'center',
formatter: (row) => {
@@ -72,42 +73,42 @@
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.memo'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'createByText',
- label: '鍒涘缓浜�',
+ label: $t('table.createBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.createByText || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || '--'
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
@@ -123,4 +124,3 @@
}
]
}
-
diff --git a/rsf-design/src/views/basic-info/loc-area-rela/locAreaRelaTable.columns.js b/rsf-design/src/views/basic-info/loc-area-rela/locAreaRelaTable.columns.js
index e222e09..c2982e2 100644
--- a/rsf-design/src/views/basic-info/loc-area-rela/locAreaRelaTable.columns.js
+++ b/rsf-design/src/views/basic-info/loc-area-rela/locAreaRelaTable.columns.js
@@ -1,4 +1,5 @@
import { h } from 'vue'
+import { $t } from '@/locales'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
import { getLocAreaRelaStatusMeta } from './locAreaRelaPage.helpers'
@@ -10,16 +11,16 @@
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
operations.push({
key: 'delete',
- label: '鍒犻櫎',
+ label: $t('common.actions.delete'),
icon: 'ri:delete-bin-5-line',
color: 'var(--art-error)'
})
@@ -33,27 +34,27 @@
},
{
type: 'globalIndex',
- label: '搴忓彿',
+ label: $t('table.index'),
width: 72,
align: 'center'
},
{
prop: 'locAreaIdText',
- label: '鍒嗗尯ID',
+ label: $t('pages.basicInfo.locAreaRela.table.locAreaId'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.locAreaIdText || row.locAreaId || '--'
},
{
prop: 'locIdText',
- label: '搴撲綅ID',
+ label: $t('pages.basicInfo.locAreaRela.table.locId'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.locIdText || row.locId || '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 96,
align: 'center',
formatter: (row) => {
@@ -63,42 +64,42 @@
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.memo'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'createByText',
- label: '鍒涘缓浜�',
+ label: $t('table.createBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.createByText || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || '--'
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/loc-area/locAreaTable.columns.js b/rsf-design/src/views/basic-info/loc-area/locAreaTable.columns.js
index a6c02b3..6535b8f 100644
--- a/rsf-design/src/views/basic-info/loc-area/locAreaTable.columns.js
+++ b/rsf-design/src/views/basic-info/loc-area/locAreaTable.columns.js
@@ -1,4 +1,5 @@
import { h } from 'vue'
+import { $t } from '@/locales'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
import { getLocAreaStatusMeta } from './locAreaPage.helpers'
@@ -10,43 +11,43 @@
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
{
prop: 'areaName',
- label: '搴撳尯',
+ label: $t('pages.basicInfo.locArea.table.area'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.areaName || row.areaId$ || row.areaId || '--'
},
{
prop: 'name',
- label: '鍚嶇О',
+ label: $t('table.name'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.name || '--'
},
{
prop: 'code',
- label: '缂栫爜',
+ label: $t('table.code'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.code || '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100,
align: 'center',
formatter: (row) => {
@@ -56,42 +57,42 @@
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.memo'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'createByText',
- label: '鍒涘缓浜�',
+ label: $t('table.createBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.createByText || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/loc-type/locTypeTable.columns.js b/rsf-design/src/views/basic-info/loc-type/locTypeTable.columns.js
index 87e2758..3586833 100644
--- a/rsf-design/src/views/basic-info/loc-type/locTypeTable.columns.js
+++ b/rsf-design/src/views/basic-info/loc-type/locTypeTable.columns.js
@@ -1,4 +1,5 @@
import { h } from 'vue'
+import { $t } from '@/locales'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
import { getLocTypeStatusMeta } from './locTypePage.helpers'
@@ -10,50 +11,50 @@
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
{
prop: 'uuid',
- label: '鏍囪瘑',
+ label: $t('pages.basicInfo.locType.table.uuid'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.uuid || '--'
},
{
prop: 'code',
- label: '缂栫爜',
+ label: $t('table.code'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.code || '--'
},
{
prop: 'name',
- label: '鍚嶇О',
+ label: $t('table.name'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.name || '--'
},
{
prop: 'regex',
- label: '鏉$爜瑙勫垯',
+ label: $t('pages.basicInfo.locType.table.regex'),
minWidth: 220,
showOverflowTooltip: true,
formatter: (row) => row.regex || '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100,
align: 'center',
formatter: (row) => {
@@ -63,42 +64,42 @@
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.memo'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'createByText',
- label: '鍒涘缓浜�',
+ label: $t('table.createBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.createByText || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/loc/locTable.columns.js b/rsf-design/src/views/basic-info/loc/locTable.columns.js
index 2ea0bcb..537eda2 100644
--- a/rsf-design/src/views/basic-info/loc/locTable.columns.js
+++ b/rsf-design/src/views/basic-info/loc/locTable.columns.js
@@ -1,6 +1,7 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
import { getLocStatusMeta, getLocUseStatusMeta } from './locPage.helpers'
function createTextColumn(prop, label, minWidth, formatter) {
@@ -43,37 +44,37 @@
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
- createTextColumn('code', '搴撲綅鍙�', 160),
- createTextColumn('warehouseName', '浠撳簱', 150, (row) => row.warehouseName || row.warehouseId$ || '--'),
- createTextColumn('areaName', '搴撳尯', 150, (row) => row.areaName || row.areaId$ || '--'),
- createTextColumn('typeIdsText', '搴撲綅绫诲瀷', 180),
- createNumberColumn('row', '鎺�', 80),
- createNumberColumn('col', '鍒�', 80),
- createNumberColumn('lev', '灞�', 80),
- createNumberColumn('channel', '宸烽亾', 90),
- createTagColumn('useStatus', '浣跨敤鐘舵��', 110, (row) => getLocUseStatusMeta(row.useStatus)),
- createTextColumn('flagLogicText', '铏氭嫙搴撲綅', 110),
- createTextColumn('flagLabelMangeText', '鏍囩绠$悊', 110),
- createTextColumn('barcode', '瀹瑰櫒缂栫爜', 150),
- createTagColumn('status', '鐘舵��', 100, (row) => getLocStatusMeta(row.statusBool ?? row.status)),
- createTextColumn('updateTimeText', '鏇存柊鏃堕棿', 170, (row) => row.updateTimeText || row.updateTime$ || '--'),
- createTextColumn('memo', '澶囨敞', 180),
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
+ createTextColumn('code', $t('pages.basicInfo.loc.table.code'), 160),
+ createTextColumn('warehouseName', $t('pages.basicInfo.loc.table.warehouseName'), 150, (row) => row.warehouseName || row.warehouseId$ || '--'),
+ createTextColumn('areaName', $t('pages.basicInfo.loc.table.areaName'), 150, (row) => row.areaName || row.areaId$ || '--'),
+ createTextColumn('typeIdsText', $t('pages.basicInfo.loc.table.typeIds'), 180),
+ createNumberColumn('row', $t('pages.basicInfo.loc.table.row'), 80),
+ createNumberColumn('col', $t('pages.basicInfo.loc.table.col'), 80),
+ createNumberColumn('lev', $t('pages.basicInfo.loc.table.lev'), 80),
+ createNumberColumn('channel', $t('pages.basicInfo.loc.table.channel'), 90),
+ createTagColumn('useStatus', $t('pages.basicInfo.loc.table.useStatus'), 110, (row) => getLocUseStatusMeta(row.useStatus)),
+ createTextColumn('flagLogicText', $t('pages.basicInfo.loc.table.flagLogic'), 110),
+ createTextColumn('flagLabelMangeText', $t('pages.basicInfo.loc.table.flagLabelManage'), 110),
+ createTextColumn('barcode', $t('pages.basicInfo.loc.table.barcode'), 150),
+ createTagColumn('status', $t('table.status'), 100, (row) => getLocStatusMeta(row.statusBool ?? row.status)),
+ createTextColumn('updateTimeText', $t('table.updateTime'), 170, (row) => row.updateTimeText || row.updateTime$ || '--'),
+ createTextColumn('memo', $t('table.remark'), 180),
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/matnr-group/matnrGroupTable.columns.js b/rsf-design/src/views/basic-info/matnr-group/matnrGroupTable.columns.js
index 8720615..4e44086 100644
--- a/rsf-design/src/views/basic-info/matnr-group/matnrGroupTable.columns.js
+++ b/rsf-design/src/views/basic-info/matnr-group/matnrGroupTable.columns.js
@@ -1,4 +1,5 @@
import { h } from 'vue'
+import { $t } from '@/locales'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
export function createMatnrGroupTableColumns({
@@ -8,14 +9,14 @@
canEdit = true,
canDelete = true
}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
@@ -26,26 +27,26 @@
},
{
prop: 'code',
- label: '鍒嗙粍缂栫爜',
+ label: $t('pages.basicInfo.matnrGroup.table.code'),
minWidth: 160,
showOverflowTooltip: true
},
{
prop: 'parCode',
- label: '涓婄骇缂栫爜',
+ label: $t('pages.basicInfo.matnrGroup.table.parentCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.parCode || '--'
},
{
prop: 'name',
- label: '鍒嗙粍鍚嶇О',
+ label: $t('pages.basicInfo.matnrGroup.table.name'),
minWidth: 240,
showOverflowTooltip: true
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/task-path-template-merge/taskPathTemplateMergeTable.columns.js b/rsf-design/src/views/basic-info/task-path-template-merge/taskPathTemplateMergeTable.columns.js
index e381790..e9f978d 100644
--- a/rsf-design/src/views/basic-info/task-path-template-merge/taskPathTemplateMergeTable.columns.js
+++ b/rsf-design/src/views/basic-info/task-path-template-merge/taskPathTemplateMergeTable.columns.js
@@ -1,6 +1,7 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
import {
getTaskPathTemplateMergeCurrentMeta,
getTaskPathTemplateMergeStatusMeta
@@ -15,36 +16,36 @@
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
{
prop: 'templateCode',
- label: '妯℃澘缂栫爜',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.templateCode'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.templateCode || '--'
},
{
prop: 'templateName',
- label: '妯℃澘鍚嶇О',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.templateName'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.templateName || '--'
},
{
prop: 'sourceTypeText',
- label: '璧风偣绫诲瀷',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.sourceType'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) =>
@@ -52,7 +53,7 @@
},
{
prop: 'targetTypeText',
- label: '缁堢偣绫诲瀷',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.targetType'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) =>
@@ -60,7 +61,7 @@
},
{
prop: 'conditionExpressionText',
- label: '鏉′欢琛ㄨ揪寮�',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.conditionExpression'),
minWidth: 220,
showOverflowTooltip: true,
formatter: (row) =>
@@ -70,21 +71,21 @@
},
{
prop: 'conditionDesc',
- label: '鏉′欢鎻忚堪',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.conditionDesc'),
minWidth: 220,
showOverflowTooltip: true,
formatter: (row) => row.conditionDesc || '--'
},
{
prop: 'version',
- label: '鐗堟湰鍙�',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.version'),
width: 90,
align: 'center',
formatter: (row) => row.version ?? '--'
},
{
prop: 'isCurrent',
- label: '褰撳墠鐗堟湰',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.isCurrent'),
width: 110,
align: 'center',
formatter: (row) => {
@@ -94,56 +95,56 @@
},
{
prop: 'effectiveTimeText',
- label: '鐢熸晥鏃堕棿',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.effectiveTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.effectiveTimeText || '--'
},
{
prop: 'expireTimeText',
- label: '澶辨晥鏃堕棿',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.expireTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.expireTimeText || '--'
},
{
prop: 'priority',
- label: '浼樺厛绾�',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.priority'),
width: 90,
align: 'center',
formatter: (row) => row.priority ?? '--'
},
{
prop: 'timeoutMinutes',
- label: '瓒呮椂(鍒�)',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.timeoutMinutes'),
width: 100,
align: 'center',
formatter: (row) => row.timeoutMinutes ?? '--'
},
{
prop: 'maxRetryTimes',
- label: '鏈�澶ч噸璇�',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.maxRetryTimes'),
width: 100,
align: 'center',
formatter: (row) => row.maxRetryTimes ?? '--'
},
{
prop: 'retryIntervalSeconds',
- label: '閲嶈瘯闂撮殧(绉�)',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.retryIntervalSeconds'),
minWidth: 120,
align: 'center',
formatter: (row) => row.retryIntervalSeconds ?? '--'
},
{
prop: 'stepSize',
- label: '姝ュ簭闀垮害',
+ label: $t('pages.basicInfo.taskPathTemplateMerge.table.stepSize'),
width: 90,
align: 'center',
formatter: (row) => row.stepSize ?? '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100,
align: 'center',
formatter: (row) => {
@@ -153,35 +154,35 @@
},
{
prop: 'createByText',
- label: '鍒涘缓浜�',
+ label: $t('table.createBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.createByText || row.createBy$ || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || row.createTime$ || '--'
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || row.updateBy$ || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
@@ -197,4 +198,3 @@
}
]
}
-
diff --git a/rsf-design/src/views/basic-info/task-path-template-node/taskPathTemplateNodeTable.columns.js b/rsf-design/src/views/basic-info/task-path-template-node/taskPathTemplateNodeTable.columns.js
index 701ccbf..2604f03 100644
--- a/rsf-design/src/views/basic-info/task-path-template-node/taskPathTemplateNodeTable.columns.js
+++ b/rsf-design/src/views/basic-info/task-path-template-node/taskPathTemplateNodeTable.columns.js
@@ -1,6 +1,7 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
import {
getTaskPathTemplateNodeBooleanMeta,
getTaskPathTemplateNodeTypeMeta
@@ -13,57 +14,57 @@
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
{
prop: 'templateId',
- label: '妯℃澘ID',
+ label: $t('pages.basicInfo.taskPathTemplateNode.table.templateId'),
width: 110,
align: 'center',
formatter: (row) => row.templateId ?? '--'
},
{
prop: 'templateCode',
- label: '妯℃澘缂栫爜',
+ label: $t('pages.basicInfo.taskPathTemplateNode.table.templateCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.templateCode || '--'
},
{
prop: 'nodeOrder',
- label: '鑺傜偣椤哄簭',
+ label: $t('pages.basicInfo.taskPathTemplateNode.table.nodeOrder'),
width: 100,
align: 'center',
formatter: (row) => row.nodeOrder ?? '--'
},
{
prop: 'nodeCode',
- label: '鑺傜偣缂栫爜',
+ label: $t('pages.basicInfo.taskPathTemplateNode.table.nodeCode'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.nodeCode || '--'
},
{
prop: 'nodeName',
- label: '鑺傜偣鍚嶇О',
+ label: $t('pages.basicInfo.taskPathTemplateNode.table.nodeName'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.nodeName || '--'
},
{
prop: 'nodeTypeText',
- label: '鑺傜偣绫诲瀷',
+ label: $t('pages.basicInfo.taskPathTemplateNode.table.nodeType'),
width: 120,
align: 'center',
formatter: (row) => {
@@ -73,21 +74,21 @@
},
{
prop: 'systemCode',
- label: '绯荤粺缂栫爜',
+ label: $t('pages.basicInfo.taskPathTemplateNode.table.systemCode'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.systemCode || '--'
},
{
prop: 'systemName',
- label: '绯荤粺鍚嶇О',
+ label: $t('pages.basicInfo.taskPathTemplateNode.table.systemName'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.systemName || '--'
},
{
prop: 'mandatoryText',
- label: '蹇呴』鑺傜偣',
+ label: $t('pages.basicInfo.taskPathTemplateNode.table.mandatory'),
width: 100,
align: 'center',
formatter: (row) => {
@@ -97,7 +98,7 @@
},
{
prop: 'parallelExecutableText',
- label: '鍙苟琛�',
+ label: $t('pages.basicInfo.taskPathTemplateNode.table.parallelExecutable'),
width: 100,
align: 'center',
formatter: (row) => {
@@ -107,28 +108,28 @@
},
{
prop: 'timeoutMinutes',
- label: '瓒呮椂(鍒�)',
+ label: $t('pages.basicInfo.taskPathTemplateNode.table.timeoutMinutes'),
width: 110,
align: 'center',
formatter: (row) => row.timeoutMinutes ?? '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/task-path-template/taskPathTemplateTable.columns.js b/rsf-design/src/views/basic-info/task-path-template/taskPathTemplateTable.columns.js
index fcf2266..3c7e496 100644
--- a/rsf-design/src/views/basic-info/task-path-template/taskPathTemplateTable.columns.js
+++ b/rsf-design/src/views/basic-info/task-path-template/taskPathTemplateTable.columns.js
@@ -1,6 +1,7 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
import {
getTaskPathTemplateCurrentMeta,
getTaskPathTemplateStatusMeta
@@ -14,18 +15,18 @@
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (handleFlow) {
- operations.push({ key: 'flow', label: '娴佺▼鍥�', icon: 'ri:route-line' })
+ operations.push({ key: 'flow', label: $t('pages.basicInfo.taskPathTemplate.actions.flow'), icon: 'ri:route-line' })
}
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
@@ -36,55 +37,55 @@
},
{
type: 'globalIndex',
- label: '搴忓彿',
+ label: $t('table.index'),
width: 72,
align: 'center'
},
{
prop: 'templateCode',
- label: '妯℃澘缂栫爜',
+ label: $t('pages.basicInfo.taskPathTemplate.table.templateCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.templateCode || '--'
},
{
prop: 'templateName',
- label: '妯℃澘鍚嶇О',
+ label: $t('pages.basicInfo.taskPathTemplate.table.templateName'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.templateName || '--'
},
{
prop: 'sourceType',
- label: '璧风偣绫诲瀷',
+ label: $t('pages.basicInfo.taskPathTemplate.table.sourceType'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.sourceType || '--'
},
{
prop: 'targetType',
- label: '缁堢偣绫诲瀷',
+ label: $t('pages.basicInfo.taskPathTemplate.table.targetType'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.targetType || '--'
},
{
prop: 'conditionDesc',
- label: '鏉′欢鎻忚堪',
+ label: $t('pages.basicInfo.taskPathTemplate.table.conditionDesc'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.conditionDesc || '--'
},
{
prop: 'version',
- label: '鐗堟湰鍙�',
+ label: $t('pages.basicInfo.taskPathTemplate.table.version'),
width: 100,
align: 'center',
formatter: (row) => row.version ?? '--'
},
{
prop: 'isCurrent',
- label: '褰撳墠鐗堟湰',
+ label: $t('pages.basicInfo.taskPathTemplate.table.isCurrent'),
width: 110,
align: 'center',
formatter: (row) => {
@@ -94,56 +95,56 @@
},
{
prop: 'effectiveTimeText',
- label: '鐢熸晥鏃堕棿',
+ label: $t('pages.basicInfo.taskPathTemplate.table.effectiveTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.effectiveTimeText || row.effectiveTime$ || '--'
},
{
prop: 'expireTimeText',
- label: '澶辨晥鏃堕棿',
+ label: $t('pages.basicInfo.taskPathTemplate.table.expireTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.expireTimeText || row.expireTime$ || '--'
},
{
prop: 'priority',
- label: '浼樺厛绾�',
+ label: $t('pages.basicInfo.taskPathTemplate.table.priority'),
width: 90,
align: 'center',
formatter: (row) => row.priority ?? '--'
},
{
prop: 'timeoutMinutes',
- label: '瓒呮椂(鍒�)',
+ label: $t('pages.basicInfo.taskPathTemplate.table.timeoutMinutes'),
width: 110,
align: 'center',
formatter: (row) => row.timeoutMinutes ?? '--'
},
{
prop: 'stepSize',
- label: '姝ュ簭闀垮害',
+ label: $t('pages.basicInfo.taskPathTemplate.table.stepSize'),
width: 110,
align: 'center',
formatter: (row) => row.stepSize ?? '--'
},
{
prop: 'maxRetryTimes',
- label: '鏈�澶ч噸璇�',
+ label: $t('pages.basicInfo.taskPathTemplate.table.maxRetryTimes'),
width: 100,
align: 'center',
formatter: (row) => row.maxRetryTimes ?? '--'
},
{
prop: 'retryIntervalSeconds',
- label: '閲嶈瘯闂撮殧(绉�)',
+ label: $t('pages.basicInfo.taskPathTemplate.table.retryIntervalSeconds'),
width: 120,
align: 'center',
formatter: (row) => row.retryIntervalSeconds ?? '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 96,
align: 'center',
formatter: (row) => {
@@ -153,42 +154,42 @@
},
{
prop: 'remark',
- label: '澶囨敞',
+ label: $t('table.remark'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.remark || '--'
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || row.updateBy$ || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
},
{
prop: 'createByText',
- label: '鍒涘缓浜�',
+ label: $t('table.createBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.createByText || row.createBy$ || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || row.createTime$ || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/warehouse-areas/index.vue b/rsf-design/src/views/basic-info/warehouse-areas/index.vue
index e9ad55b..c6fd0de 100644
--- a/rsf-design/src/views/basic-info/warehouse-areas/index.vue
+++ b/rsf-design/src/views/basic-info/warehouse-areas/index.vue
@@ -12,7 +12,9 @@
<ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
<template #left>
<ElSpace wrap>
- <ElButton v-auth="'add'" @click="openWarehouseAreasDialog('add')" v-ripple>鏂板搴撳尯</ElButton>
+ <ElButton v-auth="'add'" @click="openWarehouseAreasDialog('add')" v-ripple>
+ {{ t('common.actions.add') + t('pages.basicInfo.warehouseAreas.entity') }}
+ </ElButton>
<ElButton
v-auth="'delete'"
type="danger"
@@ -20,7 +22,7 @@
@click="handleBatchDelete"
v-ripple
>
- 鎵归噺鍒犻櫎
+ {{ t('common.actions.batchDelete') }}
</ElButton>
<ListExportPrint
class="inline-flex"
@@ -74,6 +76,7 @@
<script setup>
import { computed, onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'
+ import { useI18n } from 'vue-i18n'
import ListExportPrint from '@/components/biz/list-export-print/index.vue'
import { useAuth } from '@/hooks/core/useAuth'
import { useTable } from '@/hooks/core/useTable'
@@ -105,9 +108,9 @@
buildWarehouseAreasSavePayload,
buildWarehouseAreasSearchParams,
createWarehouseAreasSearchState,
+ getWarehouseAreasReportTitle,
getWarehouseAreasPaginationKey,
WAREHOUSE_AREAS_REPORT_STYLE,
- WAREHOUSE_AREAS_REPORT_TITLE,
getWarehouseAreasStatusOptions,
normalizeWarehouseAreasDetailRecord,
normalizeWarehouseAreasListRow
@@ -115,6 +118,7 @@
defineOptions({ name: 'WarehouseAreas' })
+ const { t } = useI18n()
const { hasAuth } = useAuth()
const userStore = useUserStore()
@@ -132,16 +136,16 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('table.keyword'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ簱鍖哄悕绉�/缂栫爜/澶囨敞'
+ placeholder: t('pages.basicInfo.warehouseAreas.search.conditionPlaceholder')
}
},
{
- label: '浠撳簱',
+ label: t('pages.basicInfo.warehouseAreas.table.warehouseName'),
key: 'warehouseId',
type: 'select',
props: {
@@ -151,25 +155,25 @@
}
},
{
- label: '搴撳尯缂栫爜',
+ label: t('pages.basicInfo.warehouseAreas.table.code'),
key: 'code',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ簱鍖虹紪鐮�'
+ placeholder: t('pages.basicInfo.warehouseAreas.search.codePlaceholder')
}
},
{
- label: '搴撳尯鍚嶇О',
+ label: t('pages.basicInfo.warehouseAreas.table.name'),
key: 'name',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ簱鍖哄悕绉�'
+ placeholder: t('pages.basicInfo.warehouseAreas.search.namePlaceholder')
}
},
{
- label: '涓氬姟绫诲瀷',
+ label: t('pages.basicInfo.warehouseAreas.table.type'),
key: 'type',
type: 'select',
props: {
@@ -179,17 +183,17 @@
}
},
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: {
clearable: true,
- options: getWarehouseAreasStatusOptions()
+ options: getWarehouseAreasStatusOptions(t)
}
}
])
- const reportTitle = WAREHOUSE_AREAS_REPORT_TITLE
+ const reportTitle = computed(() => getWarehouseAreasReportTitle(t))
const reportQueryParams = computed(() => buildWarehouseAreasSearchParams(searchForm.value))
async function openDetail(row) {
@@ -197,13 +201,13 @@
detailLoading.value = true
try {
const detail = await guardRequestWithMessage(fetchWarehouseAreasDetail(row.id), {}, {
- timeoutMessage: '搴撳尯璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.basicInfo.warehouseAreas.messages.detailTimeout')
})
detailData.value = normalizeWarehouseAreasDetailRecord(detail)
} catch (error) {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇搴撳尯璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.basicInfo.warehouseAreas.messages.detailFailed'))
} finally {
detailLoading.value = false
}
@@ -213,11 +217,11 @@
try {
await ensureCompanyOptions()
const detail = await guardRequestWithMessage(fetchWarehouseAreasDetail(row.id), {}, {
- timeoutMessage: '搴撳尯璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.basicInfo.warehouseAreas.messages.detailTimeout')
})
showDialog('edit', detail)
} catch (error) {
- ElMessage.error(error?.message || '鑾峰彇搴撳尯璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.basicInfo.warehouseAreas.messages.detailFailed'))
}
}
@@ -234,6 +238,7 @@
paginationKey: getWarehouseAreasPaginationKey(),
columnsFactory: () =>
createWarehouseAreasTableColumns({
+ t,
handleView: openDetail,
handleEdit: hasAuth('update') ? openEditDialog : null,
handleDelete: hasAuth('delete') ? (row) => handleDeleteAction?.(row) : null,
@@ -268,7 +273,7 @@
saveRequest: fetchSaveWarehouseAreas,
updateRequest: fetchUpdateWarehouseAreas,
deleteRequest: fetchDeleteWarehouseAreas,
- entityName: '搴撳尯',
+ entityName: t('pages.basicInfo.warehouseAreas.entity'),
resolveRecordLabel: (record) => record?.name || record?.code || record?.id,
refreshCreate,
refreshUpdate,
@@ -283,6 +288,7 @@
printedAt: now.toLocaleString('zh-CN', { hour12: false }),
operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
count: rows.length,
+ reportTitle: reportTitle.value,
reportStyle: { ...WAREHOUSE_AREAS_REPORT_STYLE }
}
}
@@ -322,7 +328,7 @@
const resolvedPreviewMeta = computed(() => ({
...previewMeta.value,
- reportTitle,
+ reportTitle: reportTitle.value,
count: previewRows.value.length || previewMeta.value?.count || 0,
reportStyle: {
...WAREHOUSE_AREAS_REPORT_STYLE,
@@ -352,19 +358,19 @@
companyOptionsLoading.value = (async () => {
const records = await guardRequestWithMessage(fetchCompanysList(), [], {
- timeoutMessage: '寰�鏉ヤ紒涓氶�夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.basicInfo.warehouseAreas.messages.companyOptionsTimeout')
})
const normalizedRecords = defaultResponseAdapter(records).records
shipperOptions.value = normalizedRecords
.filter((item) => item.type === 'shipper')
.map((item) => ({
- label: item.name || item.code || `璐т富 ${item.id}`,
+ label: item.name || item.code || `${t('pages.basicInfo.warehouseAreas.table.shipperName')} ${item.id}`,
value: item.id
}))
supplierOptions.value = normalizedRecords
.filter((item) => item.type === 'supplier')
.map((item) => ({
- label: item.name || item.code || `渚涘簲鍟� ${item.id}`,
+ label: item.name || item.code || `${t('pages.basicInfo.warehouseAreas.table.supplierName')} ${item.id}`,
value: item.id
}))
companyOptionsLoaded.value = true
@@ -379,10 +385,10 @@
async function loadWarehouseOptions() {
const records = await guardRequestWithMessage(fetchWarehouseList(), [], {
- timeoutMessage: '浠撳簱閫夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.basicInfo.warehouseAreas.messages.warehouseOptionsTimeout')
})
warehouseOptions.value = defaultResponseAdapter(records).records.map((item) => ({
- label: item.name || item.code || `浠撳簱 ${item.id}`,
+ label: item.name || item.code || `${t('pages.basicInfo.warehouseAreas.table.warehouseName')} ${item.id}`,
value: item.id
}))
}
@@ -396,7 +402,7 @@
status: 1
}),
{ records: [] },
- { timeoutMessage: '涓氬姟绫诲瀷鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+ { timeoutMessage: t('pages.basicInfo.warehouseAreas.messages.typeOptionsTimeout') }
)
typeOptions.value = defaultResponseAdapter(response).records.map((item) => ({
label: item.label || item.name || item.value,
diff --git a/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-detail-drawer.vue b/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-detail-drawer.vue
index ef73bef..53ea7e2 100644
--- a/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-detail-drawer.vue
+++ b/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-detail-drawer.vue
@@ -1,7 +1,7 @@
<template>
<ElDrawer
:model-value="visible"
- title="搴撳尯璇︽儏"
+ :title="t('pages.basicInfo.warehouseAreas.detail.title')"
size="960px"
destroy-on-close
@update:model-value="handleVisibleChange"
@@ -11,30 +11,36 @@
<ElSkeleton :rows="12" animated />
</div>
<div v-else class="space-y-4">
- <ElDescriptions title="鍩虹淇℃伅" :column="2" border>
- <ElDescriptionsItem label="浠撳簱">{{ detail.warehouseName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撳尯缂栫爜">{{ detail.code || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撳尯鍚嶇О">{{ detail.name || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="涓氬姟绫诲瀷">{{ detail.typeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="璐т富">{{ detail.shipperName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟�">{{ detail.supplierName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏀寔娣锋斁">{{ detail.flagMixText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍏佽璐熷簱瀛�">{{ detail.flagMinusText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏍囩绠$悊">{{ detail.flagLabelMangeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">
+ <ElDescriptions :title="t('pages.basicInfo.warehouseAreas.detail.sections.basic')" :column="2" border>
+ <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.warehouseName')">{{ detail.warehouseName || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.code')">{{ detail.code || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.name')">{{ detail.name || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.type')">{{ detail.typeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.shipperName')">{{ detail.shipperName || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.supplierName')">{{ detail.supplierName || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.flagMix')">
+ {{ detail.flagMixTextKey ? t(detail.flagMixTextKey) : detail.flagMixText || '--' }}
+ </ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.flagMinus')">
+ {{ detail.flagMinusTextKey ? t(detail.flagMinusTextKey) : detail.flagMinusText || '--' }}
+ </ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.flagLabelManage')">
+ {{ detail.flagLabelMangeTextKey ? t(detail.flagLabelMangeTextKey) : detail.flagLabelMangeText || '--' }}
+ </ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.status')">
<ElTag :type="detail.statusType || 'info'" effect="light">
- {{ detail.statusText || '--' }}
+ {{ detail.statusTextKey ? t(detail.statusTextKey) : detail.statusText || '--' }}
</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="鎺掑簭">{{ detail.sort ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.sort')">{{ detail.sort ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.remark')" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
</ElDescriptions>
- <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptions :title="t('pages.basicInfo.warehouseAreas.detail.sections.audit')" :column="2" border>
+ <ElDescriptionsItem :label="t('table.createBy')">{{ detail.createByText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateBy')">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
</ElDescriptions>
</div>
</ElScrollbar>
@@ -43,6 +49,7 @@
<script setup>
import { computed } from 'vue'
+ import { useI18n } from 'vue-i18n'
const props = defineProps({
visible: { type: Boolean, default: false },
@@ -51,6 +58,7 @@
})
const emit = defineEmits(['update:visible'])
+ const { t } = useI18n()
const visible = computed({
get: () => props.visible,
diff --git a/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-dialog.vue b/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-dialog.vue
index 8e39da2..f7e3c2a 100644
--- a/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-dialog.vue
+++ b/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-dialog.vue
@@ -22,8 +22,8 @@
<template #footer>
<span class="dialog-footer">
- <ElButton @click="handleCancel">鍙栨秷</ElButton>
- <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+ <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+ <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
</span>
</template>
</ElDialog>
@@ -31,6 +31,7 @@
<script setup>
import { computed, nextTick, reactive, ref, watch } from 'vue'
+ import { useI18n } from 'vue-i18n'
import ArtForm from '@/components/core/forms/art-form/index.vue'
import {
buildWarehouseAreasDialogModel,
@@ -52,120 +53,125 @@
const emit = defineEmits(['update:visible', 'submit'])
const formRef = ref()
const form = reactive(createWarehouseAreasFormState())
+ const { t } = useI18n()
const isEdit = computed(() => props.dialogType === 'edit')
- const dialogTitle = computed(() => (isEdit.value ? '缂栬緫搴撳尯' : '鏂板搴撳尯'))
+ const dialogTitle = computed(() =>
+ isEdit.value
+ ? t('pages.basicInfo.warehouseAreas.dialog.titleEdit')
+ : t('pages.basicInfo.warehouseAreas.dialog.titleCreate')
+ )
const rules = computed(() => ({
- warehouseId: [{ required: true, message: '璇烽�夋嫨浠撳簱', trigger: 'change' }],
- code: [{ required: true, message: '璇疯緭鍏ュ簱鍖虹紪鐮�', trigger: 'blur' }],
- name: [{ required: true, message: '璇疯緭鍏ュ簱鍖哄悕绉�', trigger: 'blur' }],
- type: [{ required: true, message: '璇烽�夋嫨涓氬姟绫诲瀷', trigger: 'change' }],
- flagMinus: [{ required: true, message: '璇烽�夋嫨鍏佽璐熷簱瀛�', trigger: 'change' }],
- flagMix: [{ required: true, message: '璇烽�夋嫨鏀寔娣锋斁', trigger: 'change' }]
+ warehouseId: [{ required: true, message: t('pages.basicInfo.warehouseAreas.validation.warehouse'), trigger: 'change' }],
+ code: [{ required: true, message: t('pages.basicInfo.warehouseAreas.validation.code'), trigger: 'blur' }],
+ name: [{ required: true, message: t('pages.basicInfo.warehouseAreas.validation.name'), trigger: 'blur' }],
+ type: [{ required: true, message: t('pages.basicInfo.warehouseAreas.validation.type'), trigger: 'change' }],
+ flagMinus: [{ required: true, message: t('pages.basicInfo.warehouseAreas.validation.flagMinus'), trigger: 'change' }],
+ flagMix: [{ required: true, message: t('pages.basicInfo.warehouseAreas.validation.flagMix'), trigger: 'change' }]
}))
const formItems = computed(() => [
{
- label: '浠撳簱',
+ label: t('pages.basicInfo.warehouseAreas.table.warehouseName'),
key: 'warehouseId',
type: 'select',
props: {
- placeholder: '璇烽�夋嫨浠撳簱',
+ placeholder: t('pages.basicInfo.warehouseAreas.placeholders.warehouse'),
clearable: true,
filterable: true,
options: props.warehouseOptions
}
},
{
- label: '搴撳尯缂栫爜',
+ label: t('pages.basicInfo.warehouseAreas.table.code'),
key: 'code',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ュ簱鍖虹紪鐮�',
+ placeholder: t('pages.basicInfo.warehouseAreas.placeholders.code'),
clearable: true
}
},
{
- label: '搴撳尯鍚嶇О',
+ label: t('pages.basicInfo.warehouseAreas.table.name'),
key: 'name',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ュ簱鍖哄悕绉�',
+ placeholder: t('pages.basicInfo.warehouseAreas.placeholders.name'),
clearable: true
}
},
{
- label: '涓氬姟绫诲瀷',
+ label: t('pages.basicInfo.warehouseAreas.table.type'),
key: 'type',
type: 'select',
props: {
- placeholder: '璇烽�夋嫨涓氬姟绫诲瀷',
+ placeholder: t('pages.basicInfo.warehouseAreas.placeholders.type'),
clearable: true,
filterable: true,
options: props.typeOptions
}
},
{
- label: '璐т富',
+ label: t('pages.basicInfo.warehouseAreas.table.shipperName'),
key: 'shipperId',
type: 'select',
props: {
- placeholder: '璇烽�夋嫨璐т富',
+ placeholder: t('pages.basicInfo.warehouseAreas.placeholders.shipper'),
clearable: true,
filterable: true,
options: props.shipperOptions
}
},
{
- label: '渚涘簲鍟�',
+ label: t('pages.basicInfo.warehouseAreas.table.supplierName'),
key: 'supplierId',
type: 'select',
props: {
- placeholder: '璇烽�夋嫨渚涘簲鍟�',
+ placeholder: t('pages.basicInfo.warehouseAreas.placeholders.supplier'),
clearable: true,
filterable: true,
options: props.supplierOptions
}
},
{
- label: '鍏佽璐熷簱瀛�',
+ label: t('pages.basicInfo.warehouseAreas.table.flagMinus'),
key: 'flagMinus',
type: 'select',
props: {
- placeholder: '璇烽�夋嫨',
- options: getWarehouseAreasFlagOptions()
+ placeholder: t('pages.basicInfo.warehouseAreas.placeholders.flagMinus'),
+ options: getWarehouseAreasFlagOptions(t)
}
},
{
- label: '鏍囩绠$悊',
+ label: t('pages.basicInfo.warehouseAreas.table.flagLabelManage'),
key: 'flagLabelMange',
type: 'select',
props: {
- placeholder: '璇烽�夋嫨',
- options: getWarehouseAreasFlagOptions()
+ placeholder: t('pages.basicInfo.warehouseAreas.placeholders.flagLabelManage'),
+ options: getWarehouseAreasFlagOptions(t)
}
},
{
- label: '鏀寔娣锋斁',
+ label: t('pages.basicInfo.warehouseAreas.table.flagMix'),
key: 'flagMix',
type: 'select',
props: {
- placeholder: '璇烽�夋嫨',
- options: getWarehouseAreasFlagOptions()
+ placeholder: t('pages.basicInfo.warehouseAreas.placeholders.flagMix'),
+ options: getWarehouseAreasFlagOptions(t)
}
},
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: {
- placeholder: '璇烽�夋嫨鐘舵��',
- options: getWarehouseAreasStatusOptions()
+ placeholder: t('pages.basicInfo.warehouseAreas.placeholders.status'),
+ options: getWarehouseAreasStatusOptions(t)
}
},
{
- label: '鎺掑簭',
+ label: t('pages.basicInfo.warehouseAreas.table.sort'),
key: 'sort',
type: 'number',
props: {
@@ -175,14 +181,14 @@
}
},
{
- label: '澶囨敞',
+ label: t('table.remark'),
key: 'memo',
type: 'input',
span: 24,
props: {
type: 'textarea',
rows: 3,
- placeholder: '璇疯緭鍏ュ娉�',
+ placeholder: t('pages.basicInfo.warehouseAreas.placeholders.memo'),
clearable: true
}
}
diff --git a/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasPage.helpers.js b/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasPage.helpers.js
index ffed312..40935e4 100644
--- a/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasPage.helpers.js
+++ b/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasPage.helpers.js
@@ -1,9 +1,11 @@
const STATUS_META = {
- 1: { text: '姝e父', type: 'success', bool: true },
- 0: { text: '鍐荤粨', type: 'danger', bool: false }
+ 1: { textKey: 'common.status.normal', fallback: 'Normal', type: 'success', bool: true },
+ 0: { textKey: 'common.status.frozen', fallback: 'Frozen', type: 'danger', bool: false }
}
-export const WAREHOUSE_AREAS_REPORT_TITLE = '搴撳尯鎶ヨ〃'
+export function getWarehouseAreasReportTitle(t) {
+ return t('pages.basicInfo.warehouseAreas.reportTitle')
+}
export const WAREHOUSE_AREAS_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
@@ -16,14 +18,14 @@
return String(value ?? '').trim()
}
-function normalizeFlagText(value) {
- if (value === 1 || value === '1' || value === true || value === '鏄�') {
- return '鏄�'
+function normalizeFlagValue(value) {
+ if (value === 1 || value === '1' || value === true || value === '\u662f') {
+ return 1
}
- if (value === 0 || value === '0' || value === false || value === '鍚�') {
- return '鍚�'
+ if (value === 0 || value === '0' || value === false || value === '\u5426') {
+ return 0
}
- return normalizeText(value) || '-'
+ return null
}
export function createWarehouseAreasSearchState() {
@@ -65,17 +67,17 @@
}
}
-export function getWarehouseAreasStatusOptions() {
+export function getWarehouseAreasStatusOptions(t) {
return [
- { label: '姝e父', value: 1 },
- { label: '鍐荤粨', value: 0 }
+ { label: t('common.status.normal'), value: 1 },
+ { label: t('common.status.frozen'), value: 0 }
]
}
-export function getWarehouseAreasFlagOptions() {
+export function getWarehouseAreasFlagOptions(t) {
return [
- { label: '鍚�', value: 0 },
- { label: '鏄�', value: 1 }
+ { label: t('common.status.no'), value: 0 },
+ { label: t('common.status.yes'), value: 1 }
]
}
@@ -190,11 +192,14 @@
if (status === false || Number(status) === 0) {
return STATUS_META[0]
}
- return { text: '鏈煡', type: 'info', bool: false }
+ return { textKey: 'common.status.unknown', fallback: 'Unknown', type: 'info', bool: false }
}
export function normalizeWarehouseAreasDetailRecord(record = {}) {
const statusMeta = getWarehouseAreasStatusMeta(record.statusBool ?? record.status)
+ const flagMinusValue = normalizeFlagValue(record.flagMinus$ ?? record.flagMinus)
+ const flagLabelManageValue = normalizeFlagValue(record.flagLabelMange$ ?? record.flagLabelMange)
+ const flagMixValue = normalizeFlagValue(record.flagMix$ ?? record.flagMix)
return {
...record,
warehouseName: normalizeText(record.warehouseId$ || record.warehouseName || ''),
@@ -204,10 +209,16 @@
code: normalizeText(record.code || ''),
name: normalizeText(record.name || ''),
memo: normalizeText(record.memo || ''),
- flagMinusText: normalizeFlagText(record.flagMinus$ ?? record.flagMinus),
- flagLabelMangeText: normalizeFlagText(record.flagLabelMange$ ?? record.flagLabelMange),
- flagMixText: normalizeFlagText(record.flagMix$ ?? record.flagMix),
- statusText: statusMeta.text,
+ flagMinusText: normalizeText(record.flagMinus$ ?? record.flagMinus) || '-',
+ flagMinusTextKey:
+ flagMinusValue === null ? '' : flagMinusValue ? 'common.status.yes' : 'common.status.no',
+ flagLabelMangeText: normalizeText(record.flagLabelMange$ ?? record.flagLabelMange) || '-',
+ flagLabelMangeTextKey:
+ flagLabelManageValue === null ? '' : flagLabelManageValue ? 'common.status.yes' : 'common.status.no',
+ flagMixText: normalizeText(record.flagMix$ ?? record.flagMix) || '-',
+ flagMixTextKey: flagMixValue === null ? '' : flagMixValue ? 'common.status.yes' : 'common.status.no',
+ statusText: statusMeta.fallback,
+ statusTextKey: statusMeta.textKey,
statusType: statusMeta.type,
statusBool: record.statusBool !== void 0 ? Boolean(record.statusBool) : statusMeta.bool,
createByText: normalizeText(record.createBy$ || record.createByText || ''),
@@ -227,4 +238,3 @@
}
return records.map((record) => normalizeWarehouseAreasListRow(record))
}
-
diff --git a/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasTable.columns.js b/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasTable.columns.js
index 14e419a..7d4dd85 100644
--- a/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasTable.columns.js
+++ b/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasTable.columns.js
@@ -1,23 +1,25 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
import { getWarehouseAreasStatusMeta } from './warehouseAreasPage.helpers'
export function createWarehouseAreasTableColumns({
+ t = $t,
handleView,
handleEdit,
handleDelete,
canEdit = true,
canDelete = true
} = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
@@ -28,107 +30,112 @@
},
{
type: 'globalIndex',
- label: '搴忓彿',
+ label: t('table.index'),
width: 72,
align: 'center'
},
{
prop: 'warehouseName',
- label: '浠撳簱',
+ label: t('pages.basicInfo.warehouseAreas.table.warehouseName'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.warehouseName || '--'
},
{
prop: 'code',
- label: '搴撳尯缂栫爜',
+ label: t('pages.basicInfo.warehouseAreas.table.code'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.code || '--'
},
{
prop: 'name',
- label: '搴撳尯鍚嶇О',
+ label: t('pages.basicInfo.warehouseAreas.table.name'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.name || '--'
},
{
prop: 'typeText',
- label: '涓氬姟绫诲瀷',
+ label: t('pages.basicInfo.warehouseAreas.table.type'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.typeText || '--'
},
{
prop: 'shipperName',
- label: '璐т富',
+ label: t('pages.basicInfo.warehouseAreas.table.shipperName'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.shipperName || '--'
},
{
prop: 'supplierName',
- label: '渚涘簲鍟�',
+ label: t('pages.basicInfo.warehouseAreas.table.supplierName'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.supplierName || '--'
},
{
prop: 'flagMixText',
- label: '鏀寔娣锋斁',
+ label: t('pages.basicInfo.warehouseAreas.table.flagMix'),
width: 100,
align: 'center',
- formatter: (row) => row.flagMixText || '--'
+ formatter: (row) => (row.flagMixTextKey ? t(row.flagMixTextKey) : row.flagMixText || '--')
},
{
prop: 'flagMinusText',
- label: '鍏佽璐熷簱瀛�',
+ label: t('pages.basicInfo.warehouseAreas.table.flagMinus'),
width: 100,
align: 'center',
- formatter: (row) => row.flagMinusText || '--'
+ formatter: (row) => (row.flagMinusTextKey ? t(row.flagMinusTextKey) : row.flagMinusText || '--')
},
{
prop: 'flagLabelMangeText',
- label: '鏍囩绠$悊',
+ label: t('pages.basicInfo.warehouseAreas.table.flagLabelManage'),
width: 100,
align: 'center',
- formatter: (row) => row.flagLabelMangeText || '--'
+ formatter: (row) =>
+ row.flagLabelMangeTextKey ? t(row.flagLabelMangeTextKey) : row.flagLabelMangeText || '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: t('table.status'),
width: 100,
align: 'center',
formatter: (row) => {
const statusMeta = getWarehouseAreasStatusMeta(row.statusBool ?? row.status)
- return h(ElTag, { type: statusMeta.type, effect: 'light' }, () => statusMeta.text)
+ return h(
+ ElTag,
+ { type: statusMeta.type, effect: 'light' },
+ () => (statusMeta.textKey ? t(statusMeta.textKey) : statusMeta.fallback)
+ )
}
},
{
prop: 'sort',
- label: '鎺掑簭',
+ label: t('pages.basicInfo.warehouseAreas.table.sort'),
width: 80,
align: 'center',
formatter: (row) => row.sort ?? '--'
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: t('table.remark'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/warehouse/warehouseTable.columns.js b/rsf-design/src/views/basic-info/warehouse/warehouseTable.columns.js
index 89ed992..c82f20f 100644
--- a/rsf-design/src/views/basic-info/warehouse/warehouseTable.columns.js
+++ b/rsf-design/src/views/basic-info/warehouse/warehouseTable.columns.js
@@ -1,17 +1,18 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
import { getWarehouseStatusMeta } from './warehousePage.helpers'
export function createWarehouseTableColumns({ handleView, handleEdit, handleDelete, canEdit = true, canDelete = true } = {}) {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete) {
- operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+ operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
}
return [
@@ -22,41 +23,41 @@
},
{
type: 'globalIndex',
- label: '搴忓彿',
+ label: $t('table.index'),
width: 72,
align: 'center'
},
{
prop: 'name',
- label: '浠撳簱鍚嶇О',
+ label: $t('pages.basicInfo.warehouse.table.name'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.name || '--'
},
{
prop: 'code',
- label: '浠撳簱缂栫爜',
+ label: $t('pages.basicInfo.warehouse.table.code'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.code || '--'
},
{
prop: 'factory',
- label: '鎵�灞炲伐鍘�',
+ label: $t('pages.basicInfo.warehouse.table.factory'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.factory || '--'
},
{
prop: 'address',
- label: '浠撳簱鍦板潃',
+ label: $t('pages.basicInfo.warehouse.table.address'),
minWidth: 220,
showOverflowTooltip: true,
formatter: (row) => row.address || '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100,
align: 'center',
formatter: (row) => {
@@ -66,42 +67,42 @@
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || row.updateBy$ || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
},
{
prop: 'createByText',
- label: '鍒涘缓浜�',
+ label: $t('table.createBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.createByText || row.createBy$ || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || row.createTime$ || '--'
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.remark'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/wh-mat/index.vue b/rsf-design/src/views/basic-info/wh-mat/index.vue
index 240aff5..fb852a1 100644
--- a/rsf-design/src/views/basic-info/wh-mat/index.vue
+++ b/rsf-design/src/views/basic-info/wh-mat/index.vue
@@ -5,30 +5,30 @@
<ElCard class="wh-mat-page__sidebar-card">
<div class="mb-3 flex items-center justify-between gap-3">
<div>
- <div class="text-base font-medium text-[var(--art-text-primary)]">鐗╂枡鍒嗙粍</div>
+ <div class="text-base font-medium text-[var(--art-text-primary)]">{{ t('pages.basicInfo.whMat.title') }}</div>
<div class="text-xs text-[var(--art-text-secondary)]">
{{ selectedGroupLabel }}
</div>
</div>
- <ElButton text @click="handleResetGroup">鍏ㄩ儴</ElButton>
+ <ElButton text @click="handleResetGroup">{{ t('common.actions.viewAll') }}</ElButton>
</div>
<div class="mb-3 flex items-center gap-2">
<ElInput
v-model.trim="groupSearch"
clearable
- placeholder="鎼滅储鐗╂枡鍒嗙粍"
+ :placeholder="t('pages.basicInfo.whMat.search.groupKeywordPlaceholder')"
@clear="handleGroupSearch"
@keyup.enter="handleGroupSearch"
/>
- <ElButton @click="handleGroupSearch">鎼滅储</ElButton>
+ <ElButton @click="handleGroupSearch">{{ t('common.actions.search') }}</ElButton>
</div>
<ElScrollbar class="wh-mat-page__tree-scroll pr-1">
<div v-if="groupTreeLoading" class="py-6">
<ElSkeleton :rows="10" animated />
</div>
- <ElEmpty v-else-if="!groupTreeData.length" description="鏆傛棤鐗╂枡鍒嗙粍" />
+ <ElEmpty v-else-if="!groupTreeData.length" :description="t('pages.basicInfo.whMat.messages.emptyGroups')" />
<ElTree
v-else
:data="groupTreeData"
@@ -41,8 +41,8 @@
>
<template #default="{ data }">
<div class="flex items-center gap-2">
- <span class="font-medium">{{ data.name || '--' }}</span>
- <span class="text-xs text-[var(--art-text-secondary)]">{{ data.code || '--' }}</span>
+ <span class="font-medium">{{ data.name || t('common.placeholder.empty') }}</span>
+ <span class="text-xs text-[var(--art-text-secondary)]">{{ data.code || t('common.placeholder.empty') }}</span>
</div>
</template>
</ElTree>
@@ -89,6 +89,7 @@
<script setup>
import { ElMessage } from 'element-plus'
import { computed, onMounted, reactive, ref } from 'vue'
+ import { useI18n } from 'vue-i18n'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
import { useTableColumns } from '@/hooks/core/useTableColumns'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
@@ -106,6 +107,7 @@
} from './whMatPage.helpers'
defineOptions({ name: 'WhMat' })
+ const { t } = useI18n()
const loading = ref(false)
const groupTreeLoading = ref(false)
@@ -131,64 +133,65 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('pages.basicInfo.whMat.search.condition'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�/鐗╂枡鍚嶇О'
+ placeholder: t('pages.basicInfo.whMat.search.conditionPlaceholder')
}
},
{
- label: '鐗╂枡缂栫爜',
+ label: t('pages.basicInfo.whMat.search.code'),
key: 'code',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+ placeholder: t('pages.basicInfo.whMat.search.codePlaceholder')
}
},
{
- label: '鐗╂枡鍚嶇О',
+ label: t('pages.basicInfo.whMat.search.name'),
key: 'name',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+ placeholder: t('pages.basicInfo.whMat.search.namePlaceholder')
}
},
{
- label: '瑙勬牸',
+ label: t('pages.basicInfo.whMat.search.spec'),
key: 'spec',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヨ鏍�'
+ placeholder: t('pages.basicInfo.whMat.search.specPlaceholder')
}
},
{
- label: '鏉$爜',
+ label: t('pages.basicInfo.whMat.search.barcode'),
key: 'barcode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユ潯鐮�'
+ placeholder: t('pages.basicInfo.whMat.search.barcodePlaceholder')
}
}
])
const { columnChecks, columns } = useTableColumns(() =>
createWhMatTableColumns({
+ t,
handleViewDetail: openDetailDrawer
})
)
const selectedGroupLabel = computed(() => {
if (!selectedGroupId.value) {
- return '鍏ㄩ儴鐗╂枡'
+ return t('pages.basicInfo.whMat.labels.allMaterials')
}
const found = findGroupNode(groupTreeData.value, selectedGroupId.value)
- return found ? getWhMatTreeNodeLabel(found) : '鍏ㄩ儴鐗╂枡'
+ return found ? getWhMatTreeNodeLabel(found) : t('pages.basicInfo.whMat.labels.allMaterials')
})
function findGroupNode(nodes, targetId) {
@@ -219,16 +222,16 @@
const records = await guardRequestWithMessage(
fetchMatnrGroupTree(buildMatnrGroupTreeQueryParams({ condition: groupSearch.value })),
[],
- { timeoutMessage: '鐗╂枡鍒嗙粍鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+ { timeoutMessage: t('pages.basicInfo.whMat.messages.groupTimeout') }
)
- const normalizedTree = normalizeMatnrGroupTreeRows(Array.isArray(records) ? records : [])
+ const normalizedTree = normalizeMatnrGroupTreeRows(Array.isArray(records) ? records : [], t)
groupTreeData.value = normalizedTree
if (selectedGroupId.value && !findGroupNode(normalizedTree, selectedGroupId.value)) {
selectedGroupId.value = null
}
} catch (error) {
groupTreeData.value = []
- ElMessage.error(error?.message || '鐗╂枡鍒嗙粍鍔犺浇澶辫触')
+ ElMessage.error(error?.message || t('pages.basicInfo.whMat.messages.groupLoadFailed'))
} finally {
groupTreeLoading.value = false
}
@@ -252,15 +255,15 @@
current: pagination.current,
size: pagination.size
},
- { timeoutMessage: '鐗╂枡鍒楄〃鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+ { timeoutMessage: t('pages.basicInfo.whMat.messages.listTimeout') }
)
tableData.value = Array.isArray(response?.records)
- ? response.records.map((record) => normalizeMatnrRow(record))
+ ? response.records.map((record) => normalizeMatnrRow(record, t))
: []
updatePaginationState(pagination, response, pagination.current, pagination.size)
} catch (error) {
tableData.value = []
- ElMessage.error(error?.message || '鐗╂枡鍒楄〃鍔犺浇澶辫触')
+ ElMessage.error(error?.message || t('pages.basicInfo.whMat.messages.listLoadFailed'))
} finally {
loading.value = false
}
@@ -272,13 +275,14 @@
try {
detailData.value = normalizeMatnrDetail(
await guardRequestWithMessage(fetchMatnrDetail(row.id), {}, {
- timeoutMessage: '鐗╂枡璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
- })
+ timeoutMessage: t('pages.basicInfo.whMat.messages.detailTimeout')
+ }),
+ t
)
} catch (error) {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇鐗╂枡璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.basicInfo.whMat.messages.detailLoadFailed'))
} finally {
detailLoading.value = false
}
diff --git a/rsf-design/src/views/basic-info/wh-mat/modules/wh-mat-detail-drawer.vue b/rsf-design/src/views/basic-info/wh-mat/modules/wh-mat-detail-drawer.vue
index a5cb07e..0d3a588 100644
--- a/rsf-design/src/views/basic-info/wh-mat/modules/wh-mat-detail-drawer.vue
+++ b/rsf-design/src/views/basic-info/wh-mat/modules/wh-mat-detail-drawer.vue
@@ -1,7 +1,7 @@
<template>
<ElDrawer
:model-value="visible"
- title="鐗╂枡璇︽儏"
+ :title="t('pages.basicInfo.whMat.detail.title')"
size="960px"
destroy-on-close
@update:model-value="handleVisibleChange"
@@ -11,53 +11,53 @@
<ElSkeleton :rows="12" animated />
</div>
<div v-else class="space-y-4">
- <ElDescriptions title="鍩虹淇℃伅" :column="2" border>
- <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.code || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.name || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡鍒嗙粍">{{ detail.groupName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="璐т富">{{ detail.shipperName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏉$爜">{{ detail.barcode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="瑙勬牸">{{ detail.spec || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍨嬪彿">{{ detail.model || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="棰滆壊">{{ detail.color || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="灏哄">{{ detail.size || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎻忚堪">{{ detail.describle || '--' }}</ElDescriptionsItem>
+ <ElDescriptions :title="t('pages.basicInfo.whMat.detail.sections.basic')" :column="2" border>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.code')">{{ detail.code || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.name')">{{ detail.name || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.groupName')">{{ detail.groupName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.shipperName')">{{ detail.shipperName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.barcode')">{{ detail.barcode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.spec')">{{ detail.spec || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.model')">{{ detail.model || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.color')">{{ detail.color || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.size')">{{ detail.size || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.description')">{{ detail.describle || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
- <ElDescriptions title="搴撳瓨灞炴��" :column="2" border>
- <ElDescriptionsItem label="鍗曚綅">{{ detail.unit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閲囪喘鍗曚綅">{{ detail.purUnit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撲綅鍗曚綅">{{ detail.stockUnit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍑哄叆搴撲紭鍏堢骇">{{ detail.stockLevelText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏄惁鏍囩绠$悊">{{ detail.flagLabelManageText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏄惁鍏嶆">{{ detail.flagCheckText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="瀹夊叏搴撳瓨">{{ detail.safeQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏈�灏忓簱瀛橀璀�">{{ detail.minQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏈�澶у簱瀛橀璀�">{{ detail.maxQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍋滄粸澶╂暟">{{ detail.stagn ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="淇濊川鏈熷ぉ鏁�">{{ detail.valid ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏁堟湡棰勮闃堝��">{{ detail.validWarn ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">{{ detail.statusText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍩虹鍗曚綅">{{ detail.baseUnit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浣跨敤缁勭粐">{{ detail.useOrgName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="ERP鍒嗙被">{{ detail.erpClsId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞">{{ detail.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptions :title="t('pages.basicInfo.whMat.detail.sections.stock')" :column="2" border>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.unit')">{{ detail.unit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.purUnit')">{{ detail.purUnit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.stockUnit')">{{ detail.stockUnit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.stockLevel')">{{ detail.stockLevelText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.flagLabelManage')">{{ detail.flagLabelManageText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.flagCheck')">{{ detail.flagCheckText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.safeQty')">{{ detail.safeQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.minQty')">{{ detail.minQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.maxQty')">{{ detail.maxQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.stagn')">{{ detail.stagn ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.valid')">{{ detail.valid ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.validWarn')">{{ detail.validWarn ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.status')">{{ detail.statusText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.baseUnit')">{{ detail.baseUnit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.useOrgName')">{{ detail.useOrgName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.erpClsId')">{{ detail.erpClsId || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.memo')">{{ detail.memo || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
- <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptions :title="t('pages.basicInfo.whMat.detail.sections.audit')" :column="2" border>
+ <ElDescriptionsItem :label="t('table.createBy')">{{ detail.createByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateBy')">{{ detail.updateByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
- <ElDescriptions v-if="extendFieldEntries.length" title="鎵╁睍瀛楁" :column="2" border>
+ <ElDescriptions v-if="extendFieldEntries.length" :title="t('pages.basicInfo.whMat.detail.sections.extend')" :column="2" border>
<ElDescriptionsItem
v-for="entry in extendFieldEntries"
:key="entry.key"
:label="entry.key"
>
- {{ entry.value || '--' }}
+ {{ entry.value || t('common.placeholder.empty') }}
</ElDescriptionsItem>
</ElDescriptions>
</div>
@@ -67,6 +67,7 @@
<script setup>
import { computed } from 'vue'
+ import { useI18n } from 'vue-i18n'
const props = defineProps({
visible: { type: Boolean, default: false },
@@ -75,6 +76,7 @@
})
const emit = defineEmits(['update:visible'])
+ const { t } = useI18n()
const visible = computed({
get: () => props.visible,
diff --git a/rsf-design/src/views/basic-info/wh-mat/whMatPage.helpers.js b/rsf-design/src/views/basic-info/wh-mat/whMatPage.helpers.js
index 6675a07..5930c2f 100644
--- a/rsf-design/src/views/basic-info/wh-mat/whMatPage.helpers.js
+++ b/rsf-design/src/views/basic-info/wh-mat/whMatPage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
function normalizeText(value) {
return String(value ?? '').trim()
}
@@ -55,7 +57,7 @@
}
}
-export function normalizeWhMatGroupTreeRows(records = []) {
+export function normalizeWhMatGroupTreeRows(records = [], t = $t) {
if (!Array.isArray(records)) {
return []
}
@@ -76,55 +78,61 @@
label,
displayLabel: label,
status: normalizeNullableNumber(item?.status),
- statusText: normalizeNumber(item?.status, 1) === 1 ? '姝e父' : '鍐荤粨',
+ statusText: normalizeNumber(item?.status, 1) === 1 ? t('common.status.normal') : t('common.status.frozen'),
statusType: normalizeNumber(item?.status, 1) === 1 ? 'success' : 'danger',
- memo: normalizeText(item?.memo) || '-',
+ memo: normalizeText(item?.memo) || t('common.placeholder.empty'),
children
}
})
}
-export function normalizeWhMatRow(record = {}) {
+export function normalizeWhMatRow(record = {}, t = $t) {
const statusValue = normalizeNullableNumber(record?.status)
return {
...record,
- code: normalizeText(record?.code) || '-',
- name: normalizeText(record?.name) || '-',
- groupName: normalizeText(record?.groupId$ || record?.groupCode) || '-',
- shipperName: normalizeText(record?.shipperId$ || record?.shipperName) || '-',
- barcode: normalizeText(record?.barcode) || '-',
- spec: normalizeText(record?.spec) || '-',
- model: normalizeText(record?.model) || '-',
- color: normalizeText(record?.color) || '-',
- size: normalizeText(record?.size) || '-',
- unit: normalizeText(record?.unit) || '-',
- purUnit: normalizeText(record?.purUnit) || '-',
- stockUnit: normalizeText(record?.stockUnit) || '-',
- stockLevelText: normalizeText(record?.stockLeval$) || '-',
- flagLabelManageText: normalizeText(record?.flagLabelMange$) || '-',
+ code: normalizeText(record?.code) || t('common.placeholder.empty'),
+ name: normalizeText(record?.name) || t('common.placeholder.empty'),
+ groupName: normalizeText(record?.groupId$ || record?.groupCode) || t('common.placeholder.empty'),
+ shipperName: normalizeText(record?.shipperId$ || record?.shipperName) || t('common.placeholder.empty'),
+ barcode: normalizeText(record?.barcode) || t('common.placeholder.empty'),
+ spec: normalizeText(record?.spec) || t('common.placeholder.empty'),
+ model: normalizeText(record?.model) || t('common.placeholder.empty'),
+ color: normalizeText(record?.color) || t('common.placeholder.empty'),
+ size: normalizeText(record?.size) || t('common.placeholder.empty'),
+ unit: normalizeText(record?.unit) || t('common.placeholder.empty'),
+ purUnit: normalizeText(record?.purUnit) || t('common.placeholder.empty'),
+ stockUnit: normalizeText(record?.stockUnit) || t('common.placeholder.empty'),
+ stockLevelText: normalizeText(record?.stockLeval$) || t('common.placeholder.empty'),
+ flagLabelManageText: normalizeText(record?.flagLabelMange$) || t('common.placeholder.empty'),
flagCheckText:
record?.flagCheck === 1 || record?.flagCheck === '1'
- ? '鏄�'
+ ? t('common.status.yes')
: record?.flagCheck === 0 || record?.flagCheck === '0'
- ? '鍚�'
- : '-',
- statusText: normalizeText(record?.status$) || (statusValue === 1 ? '姝e父' : statusValue === 0 ? '鍐荤粨' : '-'),
+ ? t('common.status.no')
+ : t('common.placeholder.empty'),
+ statusText:
+ normalizeText(record?.status$) ||
+ (statusValue === 1
+ ? t('common.status.normal')
+ : statusValue === 0
+ ? t('common.status.frozen')
+ : t('common.placeholder.empty')),
statusType: statusValue === 1 ? 'success' : statusValue === 0 ? 'danger' : 'info',
- safeQty: record?.safeQty ?? '-',
- minQty: record?.minQty ?? '-',
- maxQty: record?.maxQty ?? '-',
- valid: record?.valid ?? '-',
- validWarn: record?.validWarn ?? '-',
- stagn: record?.stagn ?? '-',
- describle: normalizeText(record?.describle) || '-',
- baseUnit: normalizeText(record?.baseUnit) || '-',
- useOrgName: normalizeText(record?.useOrgName) || '-',
- erpClsId: normalizeText(record?.erpClsId) || '-',
- memo: normalizeText(record?.memo) || '-',
- updateByText: normalizeText(record?.updateBy$) || '-',
- createByText: normalizeText(record?.createBy$) || '-',
- updateTimeText: normalizeText(record?.updateTime$ || record?.updateTime) || '-',
- createTimeText: normalizeText(record?.createTime$ || record?.createTime) || '-',
+ safeQty: record?.safeQty ?? t('common.placeholder.empty'),
+ minQty: record?.minQty ?? t('common.placeholder.empty'),
+ maxQty: record?.maxQty ?? t('common.placeholder.empty'),
+ valid: record?.valid ?? t('common.placeholder.empty'),
+ validWarn: record?.validWarn ?? t('common.placeholder.empty'),
+ stagn: record?.stagn ?? t('common.placeholder.empty'),
+ describle: normalizeText(record?.describle) || t('common.placeholder.empty'),
+ baseUnit: normalizeText(record?.baseUnit) || t('common.placeholder.empty'),
+ useOrgName: normalizeText(record?.useOrgName) || t('common.placeholder.empty'),
+ erpClsId: normalizeText(record?.erpClsId) || t('common.placeholder.empty'),
+ memo: normalizeText(record?.memo) || t('common.placeholder.empty'),
+ updateByText: normalizeText(record?.updateBy$) || t('common.placeholder.empty'),
+ createByText: normalizeText(record?.createBy$) || t('common.placeholder.empty'),
+ updateTimeText: normalizeText(record?.updateTime$ || record?.updateTime) || t('common.placeholder.empty'),
+ createTimeText: normalizeText(record?.createTime$ || record?.createTime) || t('common.placeholder.empty'),
extendFields:
record?.extendFields && typeof record.extendFields === 'object' && !Array.isArray(record.extendFields)
? record.extendFields
@@ -132,14 +140,14 @@
}
}
-export function normalizeWhMatDetail(record = {}) {
- return normalizeWhMatRow(record)
+export function normalizeWhMatDetail(record = {}, t = $t) {
+ return normalizeWhMatRow(record, t)
}
export function getWhMatTreeNodeLabel(node = {}) {
const name = normalizeText(node?.name)
const code = normalizeText(node?.code)
- return [name, code].filter(Boolean).join(' 路 ') || '-'
+ return [name, code].filter(Boolean).join(' 路 ') || $t('common.placeholder.empty')
}
export const buildMatnrPageQueryParams = buildWhMatPageQueryParams
diff --git a/rsf-design/src/views/basic-info/wh-mat/whMatTable.columns.js b/rsf-design/src/views/basic-info/wh-mat/whMatTable.columns.js
index 3666937..9d4b6d4 100644
--- a/rsf-design/src/views/basic-info/wh-mat/whMatTable.columns.js
+++ b/rsf-design/src/views/basic-info/wh-mat/whMatTable.columns.js
@@ -1,66 +1,67 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
+import { $t } from '@/locales'
-export function createWhMatTableColumns({ handleViewDetail }) {
+export function createWhMatTableColumns({ handleViewDetail, t = $t }) {
return [
{
prop: 'code',
- label: '鐗╂枡缂栫爜',
+ label: t('pages.basicInfo.whMat.table.code'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'name',
- label: '鐗╂枡鍚嶇О',
+ label: t('pages.basicInfo.whMat.table.name'),
minWidth: 220,
showOverflowTooltip: true
},
{
prop: 'groupName',
- label: '鐗╂枡鍒嗙粍',
+ label: t('pages.basicInfo.whMat.table.groupName'),
minWidth: 160,
showOverflowTooltip: true
},
{
prop: 'barcode',
- label: '鏉$爜',
+ label: t('pages.basicInfo.whMat.table.barcode'),
minWidth: 160,
showOverflowTooltip: true
},
{
prop: 'spec',
- label: '瑙勬牸',
+ label: t('pages.basicInfo.whMat.table.spec'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'model',
- label: '鍨嬪彿',
+ label: t('pages.basicInfo.whMat.table.model'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'unit',
- label: '鍗曚綅',
+ label: t('table.unit'),
width: 100
},
{
prop: 'status',
- label: '鐘舵��',
+ label: t('table.status'),
width: 100,
align: 'center',
formatter: (row) =>
- h(ElTag, { type: row.statusType || 'info', effect: 'light' }, () => row.statusText || '-')
+ h(ElTag, { type: row.statusType || 'info', effect: 'light' }, () => row.statusText || t('common.placeholder.empty'))
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: t('table.updateTime'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'action',
- label: '鎿嶄綔',
+ label: t('table.operation'),
width: 100,
fixed: 'right',
align: 'center',
diff --git a/rsf-design/src/views/manager/freeze/freezePage.helpers.js b/rsf-design/src/views/manager/freeze/freezePage.helpers.js
index f5ece80..9d505a9 100644
--- a/rsf-design/src/views/manager/freeze/freezePage.helpers.js
+++ b/rsf-design/src/views/manager/freeze/freezePage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
export const FREEZE_DYNAMIC_FIELD_PREFIX = 'extendField__'
function normalizeText(value) {
@@ -84,7 +86,7 @@
qty: normalizeNumber(record.qty),
workQty: normalizeNumber(record.workQty),
splrName: record.splrName || '-',
- statusText: record['status$'] || '鍐荤粨',
+ statusText: record['status$'] || $t('common.status.frozen'),
updateTimeText: record['updateTime$'] || record.updateTime || '-',
createTimeText: record['createTime$'] || record.createTime || '-',
memo: record.memo || '-'
diff --git a/rsf-design/src/views/manager/freeze/freezeTable.columns.js b/rsf-design/src/views/manager/freeze/freezeTable.columns.js
index f4f7d10..918cba6 100644
--- a/rsf-design/src/views/manager/freeze/freezeTable.columns.js
+++ b/rsf-design/src/views/manager/freeze/freezeTable.columns.js
@@ -1,4 +1,5 @@
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
export function createFreezeTableColumns({ enabledFields = [] }) {
const dynamicColumns = enabledFields.map((field) => ({
@@ -12,84 +13,84 @@
return [
{
type: 'globalIndex',
- label: '搴忓彿',
+ label: $t('table.index'),
width: 72,
align: 'center'
},
{
prop: 'locCode',
- label: '搴撲綅缂栫爜',
+ label: $t('pages.manager.freeze.table.locCode'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'wareArea',
- label: '搴撳尯',
+ label: $t('pages.manager.freeze.table.wareArea'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'matnrCode',
- label: '鐗╂枡缂栫爜',
+ label: $t('pages.manager.freeze.table.matnrCode'),
minWidth: 160,
showOverflowTooltip: true
},
{
prop: 'maktx',
- label: '鐗╂枡鍚嶇О',
+ label: $t('pages.manager.freeze.table.maktx'),
minWidth: 220,
showOverflowTooltip: true
},
{
prop: 'batch',
- label: '鎵规',
+ label: $t('pages.manager.freeze.table.batch'),
minWidth: 140,
showOverflowTooltip: true
},
{
prop: 'trackCode',
- label: '杩借釜鐮�',
+ label: $t('pages.manager.freeze.table.trackCode'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'unit',
- label: '鍗曚綅',
+ label: $t('table.unit'),
width: 100
},
{
prop: 'anfme',
- label: '鍙敤鏁伴噺',
+ label: $t('pages.manager.freeze.table.anfme'),
width: 110,
align: 'right'
},
{
prop: 'qty',
- label: '搴撳瓨鏁伴噺',
+ label: $t('pages.manager.freeze.table.qty'),
width: 110,
align: 'right'
},
{
prop: 'workQty',
- label: '鎵ц涓暟閲�',
+ label: $t('pages.manager.freeze.table.workQty'),
width: 120,
align: 'right'
},
...dynamicColumns,
{
prop: 'statusText',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'action',
- label: '璇︽儏',
+ label: $t('common.actions.detail'),
width: 100,
fixed: 'right',
useSlot: true,
diff --git a/rsf-design/src/views/manager/freeze/index.vue b/rsf-design/src/views/manager/freeze/index.vue
index a7adef4..6101026 100644
--- a/rsf-design/src/views/manager/freeze/index.vue
+++ b/rsf-design/src/views/manager/freeze/index.vue
@@ -31,6 +31,7 @@
<script setup>
import { computed, onMounted, reactive, ref } from 'vue'
+ import { useI18n } from 'vue-i18n'
import { useTableColumns } from '@/hooks/core/useTableColumns'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
import { fetchEnabledFields, fetchFreezeDetail, fetchFreezePage } from '@/api/freeze'
@@ -46,6 +47,7 @@
} from './freezePage.helpers'
defineOptions({ name: 'Freeze' })
+ const { t } = useI18n()
const loading = ref(false)
const tableData = ref([])
@@ -62,57 +64,57 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('pages.manager.freeze.search.condition'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ簱浣嶇紪鐮�/鐗╂枡缂栫爜'
+ placeholder: t('pages.manager.freeze.search.conditionPlaceholder')
}
},
{
- label: '搴撲綅缂栫爜',
+ label: t('pages.manager.freeze.search.locCode'),
key: 'locCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ簱浣嶇紪鐮�'
+ placeholder: t('pages.manager.freeze.search.locCodePlaceholder')
}
},
{
- label: '鐗╂枡缂栫爜',
+ label: t('pages.manager.freeze.search.matnrCode'),
key: 'matnrCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+ placeholder: t('pages.manager.freeze.search.matnrCodePlaceholder')
}
},
{
- label: '鐗╂枡鍚嶇О',
+ label: t('pages.manager.freeze.search.maktx'),
key: 'maktx',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+ placeholder: t('pages.manager.freeze.search.maktxPlaceholder')
}
},
{
- label: '鎵规',
+ label: t('pages.manager.freeze.search.batch'),
key: 'batch',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユ壒娆�'
+ placeholder: t('pages.manager.freeze.search.batchPlaceholder')
}
},
{
- label: '杩借釜鐮�',
+ label: t('pages.manager.freeze.search.trackCode'),
key: 'trackCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヨ拷韪爜'
+ placeholder: t('pages.manager.freeze.search.trackCodePlaceholder')
}
},
...enabledFields.value.map((field) => ({
@@ -121,7 +123,7 @@
type: 'input',
props: {
clearable: true,
- placeholder: `璇疯緭鍏�${field.fieldsAlise}`
+ placeholder: t('pages.manager.freeze.search.dynamicPlaceholder', { label: field.fieldsAlise })
}
}))
])
@@ -140,7 +142,7 @@
async function loadEnabledFieldDefinitions() {
const fields = await guardRequestWithMessage(fetchEnabledFields(), [], {
- timeoutMessage: '鎵╁睍瀛楁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.manager.freeze.messages.fieldsTimeout')
})
enabledFields.value = normalizeFreezeEnabledFields(fields)
enabledFields.value.forEach((field) => {
@@ -169,7 +171,7 @@
current: pagination.current,
size: pagination.size
},
- { timeoutMessage: '鍐荤粨搴撳瓨鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+ { timeoutMessage: t('pages.manager.freeze.messages.pageTimeout') }
)
tableData.value = Array.isArray(response?.records)
? response.records.map((record) => normalizeFreezeRow(record, enabledFields.value))
@@ -182,9 +184,9 @@
async function openDetailDrawer(row) {
detailDrawerVisible.value = true
- detailData.value = normalizeFreezeDetail(
+ detailData.value = normalizeFreezeDetail(
await guardRequestWithMessage(fetchFreezeDetail(row.id), {}, {
- timeoutMessage: '鍐荤粨搴撳瓨璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.manager.freeze.messages.detailTimeout')
}),
enabledFields.value
)
diff --git a/rsf-design/src/views/manager/freeze/modules/freeze-detail-drawer.vue b/rsf-design/src/views/manager/freeze/modules/freeze-detail-drawer.vue
index 0938e12..18d8908 100644
--- a/rsf-design/src/views/manager/freeze/modules/freeze-detail-drawer.vue
+++ b/rsf-design/src/views/manager/freeze/modules/freeze-detail-drawer.vue
@@ -1,31 +1,57 @@
<template>
<ElDrawer
:model-value="visible"
- title="鍐荤粨搴撳瓨璇︽儏"
+ :title="t('pages.manager.freeze.detail.title')"
size="72%"
@update:model-value="handleVisibleChange"
>
<ElDescriptions :column="3" border>
- <ElDescriptionsItem label="搴撲綅缂栫爜">{{ detail.locCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撳尯">{{ detail.wareArea || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵规">{{ detail.batch || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="杩借釜鐮�">{{ detail.trackCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍗曚綅">{{ detail.unit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍙敤鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撳瓨鏁伴噺">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵ц涓暟閲�">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">{{ detail.statusText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟�">{{ detail.splrName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞" :span="3">{{ detail.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.freeze.table.locCode')">{{
+ detail.locCode || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.freeze.table.wareArea')">{{
+ detail.wareArea || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.freeze.table.matnrCode')">{{
+ detail.matnrCode || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.freeze.table.maktx')">{{
+ detail.maktx || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.freeze.table.batch')">{{
+ detail.batch || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.freeze.table.trackCode')">{{
+ detail.trackCode || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.unit')">{{ detail.unit || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.freeze.table.anfme')">{{
+ detail.anfme ?? '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.freeze.table.qty')">{{
+ detail.qty ?? '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.freeze.table.workQty')">{{
+ detail.workQty ?? '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.status')">{{ detail.statusText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.supplier')">{{ detail.splrName || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{
+ detail.updateTimeText || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{
+ detail.createTimeText || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.memo')" :span="3">{{ detail.memo || '--' }}</ElDescriptionsItem>
</ElDescriptions>
</ElDrawer>
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
+
+ const { t } = useI18n()
+
defineProps({
visible: { type: Boolean, default: false },
detail: { type: Object, default: () => ({}) }
diff --git a/rsf-design/src/views/manager/in-statistic-item/inStatisticItemPage.helpers.js b/rsf-design/src/views/manager/in-statistic-item/inStatisticItemPage.helpers.js
index c61ea0a..9c9a8ce 100644
--- a/rsf-design/src/views/manager/in-statistic-item/inStatisticItemPage.helpers.js
+++ b/rsf-design/src/views/manager/in-statistic-item/inStatisticItemPage.helpers.js
@@ -2,8 +2,9 @@
getInStatisticTaskStatusMeta,
getInStatisticTaskTypeMeta
} from '../../statistics/in-statistic/inStatisticPage.helpers.js'
+import { $t } from '@/locales'
-export const IN_STATISTIC_ITEM_PAGE_TITLE = '鍏ュ簱缁熻鏄庣粏'
+export const IN_STATISTIC_ITEM_PAGE_TITLE = $t('pages.manager.inStatisticItem.title')
function normalizeText(value) {
return String(value ?? '').trim()
diff --git a/rsf-design/src/views/manager/in-statistic-item/inStatisticItemTable.columns.js b/rsf-design/src/views/manager/in-statistic-item/inStatisticItemTable.columns.js
index 4c49e25..1aa1d97 100644
--- a/rsf-design/src/views/manager/in-statistic-item/inStatisticItemTable.columns.js
+++ b/rsf-design/src/views/manager/in-statistic-item/inStatisticItemTable.columns.js
@@ -1,109 +1,110 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
export function createInStatisticItemTableColumns({ handleView } = {}) {
return [
{
type: 'globalIndex',
- label: '搴忓彿',
+ label: $t('table.index'),
width: 72,
align: 'center'
},
{
prop: 'id',
- label: 'ID',
+ label: $t('table.id'),
width: 90,
align: 'center',
formatter: (row) => row.id ?? '--'
},
{
prop: 'dayTimeText',
- label: '缁熻鏃ユ湡',
+ label: $t('pages.manager.inStatisticItem.table.dayTime'),
minWidth: 130,
showOverflowTooltip: true,
formatter: (row) => row.dayTimeText || '--'
},
{
prop: 'locCode',
- label: '搴撲綅',
+ label: $t('pages.manager.inStatisticItem.table.locCode'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.locCode || '--'
},
{
prop: 'matnrCode',
- label: '鐗╂枡缂栫爜',
+ label: $t('pages.manager.inStatisticItem.table.matnrCode'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.matnrCode || '--'
},
{
prop: 'maktx',
- label: '鐗╂枡鍚嶇О',
+ label: $t('pages.manager.inStatisticItem.table.maktx'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.maktx || '--'
},
{
prop: 'anfme',
- label: '鏁伴噺',
+ label: $t('pages.manager.inStatisticItem.table.anfme'),
width: 120,
align: 'right',
formatter: (row) => row.anfme ?? '--'
},
{
prop: 'batch',
- label: '鎵规',
+ label: $t('pages.manager.inStatisticItem.table.batch'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.batch || '--'
},
{
prop: 'unit',
- label: '鍗曚綅',
+ label: $t('table.unit'),
width: 90,
align: 'center',
formatter: (row) => row.unit || '--'
},
{
prop: 'barcode',
- label: '鎵樼洏鐮�',
+ label: $t('pages.manager.inStatisticItem.table.barcode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.barcode || '--'
},
{
prop: 'createByText',
- label: '鍒涘缓浜�',
+ label: $t('table.createBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.createByText || '--'
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: $t('table.createTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.createTimeText || '--'
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 90,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/manager/in-statistic-item/index.vue b/rsf-design/src/views/manager/in-statistic-item/index.vue
index 1809adb..5c49965 100644
--- a/rsf-design/src/views/manager/in-statistic-item/index.vue
+++ b/rsf-design/src/views/manager/in-statistic-item/index.vue
@@ -31,6 +31,7 @@
<script setup>
import { computed, ref } from 'vue'
+ import { useI18n } from 'vue-i18n'
import { useTable } from '@/hooks/core/useTable'
import { fetchGetInStatisticItemDetail, fetchInStatisticItemPage } from '@/api/in-statistic-item'
import {
@@ -44,6 +45,7 @@
import InStatisticItemDetailDrawer from './modules/in-statistic-item-detail-drawer.vue'
defineOptions({ name: 'InStatisticItem' })
+ const { t } = useI18n()
const searchForm = ref(createInStatisticItemSearchState())
const detailDrawerVisible = ref(false)
@@ -52,16 +54,16 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('pages.manager.inStatisticItem.search.condition'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�/缂栫爜/鎵规'
+ placeholder: t('pages.manager.inStatisticItem.search.conditionPlaceholder')
}
},
{
- label: '缁熻鏃ユ湡',
+ label: t('pages.manager.inStatisticItem.search.dayTime'),
key: 'dayTime',
type: 'date',
props: {
@@ -71,30 +73,30 @@
}
},
{
- label: '鐗╂枡鍚嶇О',
+ label: t('pages.manager.inStatisticItem.search.maktx'),
key: 'maktx',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+ placeholder: t('pages.manager.inStatisticItem.search.maktxPlaceholder')
}
},
{
- label: '鐗╂枡缂栫爜',
+ label: t('pages.manager.inStatisticItem.search.matnrCode'),
key: 'matnrCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+ placeholder: t('pages.manager.inStatisticItem.search.matnrCodePlaceholder')
}
},
{
- label: '鎵规',
+ label: t('pages.manager.inStatisticItem.search.batch'),
key: 'batch',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユ壒娆�'
+ placeholder: t('pages.manager.inStatisticItem.search.batchPlaceholder')
}
}
])
diff --git a/rsf-design/src/views/manager/in-statistic-item/modules/in-statistic-item-detail-drawer.vue b/rsf-design/src/views/manager/in-statistic-item/modules/in-statistic-item-detail-drawer.vue
index 5c2afed..b5c805c 100644
--- a/rsf-design/src/views/manager/in-statistic-item/modules/in-statistic-item-detail-drawer.vue
+++ b/rsf-design/src/views/manager/in-statistic-item/modules/in-statistic-item-detail-drawer.vue
@@ -1,7 +1,7 @@
<template>
<ElDrawer
:model-value="visible"
- :title="IN_STATISTIC_ITEM_PAGE_TITLE + '璇︽儏'"
+ :title="t('pages.manager.inStatisticItem.detail.title', { title: IN_STATISTIC_ITEM_PAGE_TITLE })"
size="72%"
@update:model-value="handleVisibleChange"
>
@@ -9,30 +9,54 @@
<div class="flex min-h-full flex-col gap-4 pr-2">
<ElSkeleton v-if="loading" :rows="10" animated />
<ElDescriptions v-else :column="4" border>
- <ElDescriptionsItem label="ID">{{ detail.id ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="缁熻鏃ユ湡">{{ detail.dayTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浠诲姟绫诲瀷">
+ <ElDescriptionsItem :label="t('table.id')">{{ detail.id ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.dayTime')">{{
+ detail.dayTimeText || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.detail.taskType')">
<ElTag :type="detail.taskTypeTagType || 'info'" effect="light">
{{ detail.taskTypeText || '--' }}
</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="浠诲姟鐘舵��">
+ <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.detail.taskStatus')">
<ElTag :type="detail.taskStatusTagType || 'info'" effect="light">
{{ detail.taskStatusText || '--' }}
</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撲綅">{{ detail.locCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵规">{{ detail.batch || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍗曚綅">{{ detail.unit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵樼洏鐮�">{{ detail.barcode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="绱㈠紩">{{ detail.fieldsIndex || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.locCode')">{{
+ detail.locCode || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.matnrCode')">{{
+ detail.matnrCode || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.maktx')">{{
+ detail.maktx || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.batch')">{{
+ detail.batch || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.anfme')">{{
+ detail.anfme ?? '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.unit')">{{ detail.unit || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.barcode')">{{
+ detail.barcode || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.detail.fieldsIndex')">{{
+ detail.fieldsIndex || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createBy')">{{
+ detail.createByText || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{
+ detail.createTimeText || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateBy')">{{
+ detail.updateByText || '--'
+ }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{
+ detail.updateTimeText || '--'
+ }}</ElDescriptionsItem>
</ElDescriptions>
</div>
</ElScrollbar>
@@ -40,9 +64,11 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import { IN_STATISTIC_ITEM_PAGE_TITLE } from '../inStatisticItemPage.helpers'
defineOptions({ name: 'InStatisticItemDetailDrawer' })
+ const { t } = useI18n()
defineProps({
visible: { type: Boolean, default: false },
diff --git a/rsf-design/src/views/manager/loc-item/index.vue b/rsf-design/src/views/manager/loc-item/index.vue
index f6a40ed..7762814 100644
--- a/rsf-design/src/views/manager/loc-item/index.vue
+++ b/rsf-design/src/views/manager/loc-item/index.vue
@@ -36,6 +36,7 @@
<script setup>
import { computed, onMounted, ref } from 'vue'
import { useRoute } from 'vue-router'
+ import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus'
import { useTable } from '@/hooks/core/useTable'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
@@ -55,6 +56,7 @@
} from './locItemPage.helpers'
defineOptions({ name: 'LocItem' })
+ const { t } = useI18n()
const route = useRoute()
const searchForm = ref(createLocItemSearchState())
@@ -64,79 +66,79 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('pages.manager.locItem.search.condition'),
key: 'condition',
type: 'input',
- props: { clearable: true, placeholder: '璇疯緭鍏ュ簱浣嶇紪鐮�/鐗╂枡缂栫爜/杩借釜鐮�' }
+ props: { clearable: true, placeholder: t('pages.manager.locItem.search.conditionPlaceholder') }
},
{
- label: '寮�濮嬫棩鏈�',
+ label: t('pages.manager.locItem.search.timeStart'),
key: 'timeStart',
type: 'date',
props: { clearable: true, valueFormat: 'YYYY-MM-DD', type: 'date' }
},
{
- label: '缁撴潫鏃ユ湡',
+ label: t('pages.manager.locItem.search.timeEnd'),
key: 'timeEnd',
type: 'date',
props: { clearable: true, valueFormat: 'YYYY-MM-DD', type: 'date' }
},
{
- label: '搴撲綅ID',
+ label: t('pages.manager.locItem.search.locId'),
key: 'locId',
type: 'inputNumber',
- props: { min: 0, controlsPosition: 'right', placeholder: '璇疯緭鍏ュ簱浣岻D' }
+ props: { min: 0, controlsPosition: 'right', placeholder: t('pages.manager.locItem.search.locIdPlaceholder') }
},
{
- label: '鍗曟嵁ID',
+ label: t('pages.manager.locItem.search.orderId'),
key: 'orderId',
type: 'inputNumber',
- props: { min: 0, controlsPosition: 'right', placeholder: '璇疯緭鍏ュ崟鎹甀D' }
+ props: { min: 0, controlsPosition: 'right', placeholder: t('pages.manager.locItem.search.orderIdPlaceholder') }
},
{
- label: '涓氬姟绫诲瀷',
+ label: t('pages.manager.locItem.search.type'),
key: 'type',
type: 'input',
- props: { clearable: true, placeholder: '璇疯緭鍏ヤ笟鍔$被鍨�' }
+ props: { clearable: true, placeholder: t('pages.manager.locItem.search.typePlaceholder') }
},
{
- label: '宸ヤ綅绫诲瀷',
+ label: t('pages.manager.locItem.search.wkType'),
key: 'wkType',
type: 'inputNumber',
- props: { min: 0, controlsPosition: 'right', placeholder: '璇疯緭鍏ュ伐浣嶇被鍨�' }
+ props: { min: 0, controlsPosition: 'right', placeholder: t('pages.manager.locItem.search.wkTypePlaceholder') }
},
{
- label: '鐗╂枡缂栫爜',
+ label: t('pages.manager.locItem.search.matnrCode'),
key: 'matnrCode',
type: 'input',
- props: { clearable: true, placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�' }
+ props: { clearable: true, placeholder: t('pages.manager.locItem.search.matnrCodePlaceholder') }
},
{
- label: '鐗╂枡鍚嶇О',
+ label: t('pages.manager.locItem.search.maktx'),
key: 'maktx',
type: 'input',
- props: { clearable: true, placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�' }
+ props: { clearable: true, placeholder: t('pages.manager.locItem.search.maktxPlaceholder') }
},
{
- label: '杩借釜鐮�',
+ label: t('pages.manager.locItem.search.trackCode'),
key: 'trackCode',
type: 'input',
- props: { clearable: true, placeholder: '璇疯緭鍏ヨ拷韪爜' }
+ props: { clearable: true, placeholder: t('pages.manager.locItem.search.trackCodePlaceholder') }
},
{
- label: '鎵规',
+ label: t('pages.manager.locItem.search.batch'),
key: 'batch',
type: 'input',
- props: { clearable: true, placeholder: '璇疯緭鍏ユ壒娆�' }
+ props: { clearable: true, placeholder: t('pages.manager.locItem.search.batchPlaceholder') }
},
{
- label: '渚涘簲鍟嗘壒娆�',
+ label: t('pages.manager.locItem.search.splrBatch'),
key: 'splrBatch',
type: 'input',
- props: { clearable: true, placeholder: '璇疯緭鍏ヤ緵搴斿晢鎵规' }
+ props: { clearable: true, placeholder: t('pages.manager.locItem.search.splrBatchPlaceholder') }
},
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: { clearable: true, options: getLocItemStatusOptions() }
@@ -179,7 +181,7 @@
current: params.current || 1,
pageSize: params.pageSize || params.size || 20
},
- { timeoutMessage: '搴撳瓨鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+ { timeoutMessage: t('pages.manager.locItem.messages.pageTimeout') }
),
apiParams: buildLocItemPageQueryParams(searchForm.value),
paginationKey: getLocItemPaginationKey()
@@ -197,13 +199,13 @@
} catch (error) {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇搴撳瓨鏄庣粏璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.manager.locItem.messages.detailFailed'))
}
}
async function loadEnabledFieldDefinitions() {
const fields = await guardRequestWithMessage(fetchEnabledFields(), [], {
- timeoutMessage: '鎵╁睍瀛楁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.manager.locItem.messages.fieldsTimeout')
})
enabledFields.value = normalizeLocItemEnabledFields(fields)
resetColumns()
diff --git a/rsf-design/src/views/manager/loc-item/locItemPage.helpers.js b/rsf-design/src/views/manager/loc-item/locItemPage.helpers.js
index 0bc729d..dd411f2 100644
--- a/rsf-design/src/views/manager/loc-item/locItemPage.helpers.js
+++ b/rsf-design/src/views/manager/loc-item/locItemPage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
export const LOC_ITEM_DYNAMIC_FIELD_PREFIX = 'extendField__'
function normalizeText(value) {
@@ -98,8 +100,8 @@
export function getLocItemStatusOptions() {
return [
- { label: '鍚敤', value: 1 },
- { label: '鍋滅敤', value: 0 }
+ { label: $t('common.status.enabled'), value: 1 },
+ { label: $t('common.status.disabled'), value: 0 }
]
}
@@ -158,7 +160,10 @@
workQty: normalizeNumber(record.workQty),
fieldsIndex: record.fieldsIndex || '--',
memo: record.memo || '--',
- statusText: record.statusBool || Number(record.status) === 1 ? '鍚敤' : '鍋滅敤',
+ statusText:
+ record.statusBool || Number(record.status) === 1
+ ? $t('common.status.enabled')
+ : $t('common.status.disabled'),
createByText: record['createBy$'] || record.createBy || '--',
createTimeText: record['createTime$'] || record.createTime || '--',
updateByText: record['updateBy$'] || record.updateBy || '--',
diff --git a/rsf-design/src/views/manager/loc-item/locItemTable.columns.js b/rsf-design/src/views/manager/loc-item/locItemTable.columns.js
index 4a73ded..7f415e9 100644
--- a/rsf-design/src/views/manager/loc-item/locItemTable.columns.js
+++ b/rsf-design/src/views/manager/loc-item/locItemTable.columns.js
@@ -1,113 +1,114 @@
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
export function createLocItemTableColumns({ enabledFields = [], handleView }) {
return [
{
prop: 'locId',
- label: '搴撲綅ID',
+ label: $t('pages.manager.locItem.table.locId'),
width: 110
},
{
prop: 'wareArea',
- label: '搴撳尯',
+ label: $t('pages.manager.locItem.table.wareArea'),
minWidth: 140,
showOverflowTooltip: true
},
{
prop: 'locCode',
- label: '搴撲綅缂栫爜',
+ label: $t('pages.manager.locItem.table.locCode'),
minWidth: 140,
showOverflowTooltip: true
},
{
prop: 'typeText',
- label: '涓氬姟绫诲瀷',
+ label: $t('pages.manager.locItem.table.type'),
minWidth: 120,
showOverflowTooltip: true
},
{
prop: 'wkTypeText',
- label: '宸ヤ綅绫诲瀷',
+ label: $t('pages.manager.locItem.table.wkType'),
minWidth: 120,
showOverflowTooltip: true
},
{
prop: 'orderId',
- label: '鍗曟嵁ID',
+ label: $t('pages.manager.locItem.table.orderId'),
minWidth: 120
},
{
prop: 'orderItemId',
- label: '鍗曟嵁鏄庣粏ID',
+ label: $t('pages.manager.locItem.table.orderItemId'),
minWidth: 130
},
{
prop: 'matnrId',
- label: '鐗╂枡ID',
+ label: $t('pages.manager.locItem.table.matnrId'),
minWidth: 110
},
{
prop: 'matnrCode',
- label: '鐗╂枡缂栫爜',
+ label: $t('pages.manager.locItem.table.matnrCode'),
minWidth: 160,
showOverflowTooltip: true
},
{
prop: 'maktx',
- label: '鐗╂枡鍚嶇О',
+ label: $t('pages.manager.locItem.table.maktx'),
minWidth: 220,
showOverflowTooltip: true
},
{
prop: 'spec',
- label: '瑙勬牸',
+ label: $t('pages.manager.locItem.table.spec'),
minWidth: 140,
showOverflowTooltip: true
},
{
prop: 'model',
- label: '鍨嬪彿',
+ label: $t('pages.manager.locItem.table.model'),
minWidth: 140,
showOverflowTooltip: true
},
{
prop: 'splrBatch',
- label: '渚涘簲鍟嗘壒娆�',
+ label: $t('table.supplierBatch'),
minWidth: 140,
showOverflowTooltip: true
},
{
prop: 'batch',
- label: '鎵规',
+ label: $t('pages.manager.locItem.table.batch'),
minWidth: 140,
showOverflowTooltip: true
},
{
prop: 'trackCode',
- label: '杩借釜鐮�',
+ label: $t('pages.manager.locItem.table.trackCode'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'unit',
- label: '鍗曚綅',
+ label: $t('table.unit'),
width: 100
},
{
prop: 'anfme',
- label: '鍙敤鏁伴噺',
+ label: $t('pages.manager.locItem.table.anfme'),
width: 110,
align: 'right'
},
{
prop: 'qty',
- label: '搴撳瓨鏁伴噺',
+ label: $t('pages.manager.locItem.table.qty'),
width: 110,
align: 'right'
},
{
prop: 'workQty',
- label: '鎵ц涓暟閲�',
+ label: $t('pages.manager.locItem.table.workQty'),
width: 120,
align: 'right'
},
@@ -120,18 +121,18 @@
})),
{
prop: 'statusText',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 90
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'action',
- label: '璇︽儏',
+ label: $t('common.actions.detail'),
width: 96,
fixed: 'right',
align: 'center',
diff --git a/rsf-design/src/views/manager/loc-item/modules/loc-item-detail-drawer.vue b/rsf-design/src/views/manager/loc-item/modules/loc-item-detail-drawer.vue
index e8a75a7..1f646f1 100644
--- a/rsf-design/src/views/manager/loc-item/modules/loc-item-detail-drawer.vue
+++ b/rsf-design/src/views/manager/loc-item/modules/loc-item-detail-drawer.vue
@@ -1,35 +1,35 @@
<template>
<ElDrawer
:model-value="visible"
- title="搴撳瓨鏄庣粏璇︽儏"
+ :title="t('pages.manager.locItem.detail.title')"
size="72%"
@update:model-value="handleVisibleChange"
>
<div class="flex h-full flex-col gap-4">
<ElDescriptions :column="3" border>
- <ElDescriptionsItem label="搴撲綅ID">{{ detail.locId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撲綅缂栫爜">{{ detail.locCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撳尯">{{ detail.wareArea || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="涓氬姟绫诲瀷">{{ detail.typeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="宸ヤ綅绫诲瀷">{{ detail.wkTypeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍗曟嵁ID">{{ detail.orderId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="杩借釜鐮�">{{ detail.trackCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵规">{{ detail.batch || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟嗘壒娆�">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍗曚綅">{{ detail.unit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍙敤鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撳瓨鏁伴噺">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵ц涓暟閲�">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">{{ detail.statusText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.locId')">{{ detail.locId || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.locCode')">{{ detail.locCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.wareArea')">{{ detail.wareArea || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.type')">{{ detail.typeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.wkType')">{{ detail.wkTypeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.orderId')">{{ detail.orderId || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.matnrCode')">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.maktx')">{{ detail.maktx || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.trackCode')">{{ detail.trackCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.batch')">{{ detail.batch || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.supplierBatch')">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.unit')">{{ detail.unit || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.anfme')">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.qty')">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locItem.table.workQty')">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.status')">{{ detail.statusText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
</ElDescriptions>
<ElCard shadow="never">
<template #header>
- <div class="text-sm font-medium">鎵╁睍瀛楁</div>
+ <div class="text-sm font-medium">{{ t('pages.manager.locItem.detail.extendFields') }}</div>
</template>
<div v-if="dynamicFields.length" class="grid grid-cols-1 gap-3 md:grid-cols-2 xl:grid-cols-3">
<div
@@ -41,7 +41,7 @@
<div class="mt-1 text-sm text-[var(--art-text-gray-900)]">{{ field.value || '--' }}</div>
</div>
</div>
- <ElEmpty v-else description="鏆傛棤鎵╁睍瀛楁" :image-size="84" />
+ <ElEmpty v-else :description="t('pages.manager.locItem.detail.emptyExtendFields')" :image-size="84" />
</ElCard>
</div>
</ElDrawer>
@@ -49,6 +49,9 @@
<script setup>
import { computed } from 'vue'
+ import { useI18n } from 'vue-i18n'
+
+ const { t } = useI18n()
const props = defineProps({
visible: { type: Boolean, default: false },
diff --git a/rsf-design/src/views/manager/loc-preview/index.vue b/rsf-design/src/views/manager/loc-preview/index.vue
index c3a0bf6..fa48a2c 100644
--- a/rsf-design/src/views/manager/loc-preview/index.vue
+++ b/rsf-design/src/views/manager/loc-preview/index.vue
@@ -41,6 +41,7 @@
<script setup>
import { computed, onMounted, reactive, ref } from 'vue'
+ import { useI18n } from 'vue-i18n'
import { useTableColumns } from '@/hooks/core/useTableColumns'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
import {
@@ -62,6 +63,7 @@
} from './locPreviewPage.helpers'
defineOptions({ name: 'LocPreview' })
+ const { t } = useI18n()
const loading = ref(false)
const detailLoading = ref(false)
@@ -87,30 +89,30 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('pages.manager.locPreview.search.condition'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ簱浣嶇紪鐮�/鏉$爜'
+ placeholder: t('pages.manager.locPreview.search.conditionPlaceholder')
}
},
{
- label: '搴撲綅缂栫爜',
+ label: t('pages.manager.locPreview.search.code'),
key: 'code',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ簱浣嶇紪鐮�'
+ placeholder: t('pages.manager.locPreview.search.codePlaceholder')
}
},
{
- label: '鏉$爜',
+ label: t('pages.manager.locPreview.search.barcode'),
key: 'barcode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユ潯鐮�'
+ placeholder: t('pages.manager.locPreview.search.barcodePlaceholder')
}
}
])
@@ -119,64 +121,64 @@
return [
{
prop: 'locCode',
- label: '搴撲綅缂栫爜',
+ label: t('pages.manager.locPreview.table.locCode'),
minWidth: 140,
showOverflowTooltip: true
},
{
prop: 'wareArea',
- label: '搴撳尯',
+ label: t('pages.manager.locPreview.table.areaLabel'),
minWidth: 140,
showOverflowTooltip: true
},
{
prop: 'orderCode',
- label: '鍗曟嵁缂栧彿',
+ label: t('pages.orders.common.orderCode'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'matnrCode',
- label: '鐗╂枡缂栫爜',
+ label: t('table.materialCode'),
minWidth: 160,
showOverflowTooltip: true
},
{
prop: 'maktx',
- label: '鐗╂枡鍚嶇О',
+ label: t('table.materialName'),
minWidth: 220,
showOverflowTooltip: true
},
{
prop: 'batch',
- label: '鎵规',
+ label: t('table.batch'),
minWidth: 140,
showOverflowTooltip: true
},
{
prop: 'trackCode',
- label: '杩借釜鐮�',
+ label: t('pages.orders.common.trackCode'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'unit',
- label: '鍗曚綅',
+ label: t('table.unit'),
width: 100
},
{
prop: 'anfme',
- label: '鍙敤鏁伴噺',
+ label: t('pages.manager.freeze.table.anfme'),
width: 120
},
{
prop: 'qty',
- label: '搴撳瓨鏁伴噺',
+ label: t('pages.manager.freeze.table.qty'),
width: 120
},
{
prop: 'workQty',
- label: '鎵ц涓暟閲�',
+ label: t('pages.manager.freeze.table.workQty'),
width: 120
},
...enabledFields.value.map((field) => ({
@@ -188,7 +190,7 @@
})),
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: t('table.createTime'),
minWidth: 180,
showOverflowTooltip: true
}
@@ -211,7 +213,7 @@
async function loadEnabledFieldDefinitions() {
const fields = await guardRequestWithMessage(fetchEnabledFields(), [], {
- timeoutMessage: '鎵╁睍瀛楁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.manager.locPreview.messages.fieldsTimeout')
})
enabledFields.value = normalizeLocPreviewEnabledFields(fields)
}
@@ -233,7 +235,7 @@
current: pagination.current,
size: pagination.size
},
- { timeoutMessage: '搴撲綅鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+ { timeoutMessage: t('pages.manager.locPreview.messages.pageTimeout') }
)
tableData.value = Array.isArray(response?.records)
? response.records.map((record) => normalizeLocPreviewRow(record))
@@ -253,7 +255,7 @@
try {
const [detailResponse, itemResponse] = await Promise.all([
guardRequestWithMessage(fetchLocPreviewDetail(activeLocRow.value.id), {}, {
- timeoutMessage: '搴撲綅璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.manager.locPreview.messages.detailTimeout')
}),
guardRequestWithMessage(
fetchLocPreviewItemsPage({
@@ -267,7 +269,7 @@
current: detailPagination.current,
size: detailPagination.size
},
- { timeoutMessage: '搴撲綅搴撳瓨鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+ { timeoutMessage: t('pages.manager.locPreview.messages.itemPageTimeout') }
)
])
diff --git a/rsf-design/src/views/manager/loc-preview/locPreviewPage.helpers.js b/rsf-design/src/views/manager/loc-preview/locPreviewPage.helpers.js
index 43e6b35..3ac283b 100644
--- a/rsf-design/src/views/manager/loc-preview/locPreviewPage.helpers.js
+++ b/rsf-design/src/views/manager/loc-preview/locPreviewPage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
export const LOC_PREVIEW_DYNAMIC_FIELD_PREFIX = 'extendField__'
function normalizeText(value) {
@@ -86,7 +88,7 @@
col: normalizeNumber(record.col),
lev: normalizeNumber(record.lev),
channel: normalizeNumber(record.channel),
- statusLabel: record.statusBool ? '鍚敤' : '鍋滅敤',
+ statusLabel: record.statusBool ? $t('common.status.enabled') : $t('common.status.disabled'),
updateTimeText: record['updateTime$'] || record.updateTime || '-',
createTimeText: record['createTime$'] || record.createTime || '-'
}
diff --git a/rsf-design/src/views/manager/loc-preview/locPreviewTable.columns.js b/rsf-design/src/views/manager/loc-preview/locPreviewTable.columns.js
index 7957a17..c2dfc96 100644
--- a/rsf-design/src/views/manager/loc-preview/locPreviewTable.columns.js
+++ b/rsf-design/src/views/manager/loc-preview/locPreviewTable.columns.js
@@ -1,71 +1,72 @@
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
export function createLocPreviewTableColumns({ handleViewDetail }) {
return [
{
prop: 'locCode',
- label: '搴撲綅缂栫爜',
+ label: $t('pages.manager.locPreview.table.locCode'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'warehouseLabel',
- label: '浠撳簱',
+ label: $t('pages.manager.locPreview.table.warehouseLabel'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'areaLabel',
- label: '搴撳尯',
+ label: $t('pages.manager.locPreview.table.areaLabel'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'typeLabel',
- label: '搴撲綅绫诲瀷',
+ label: $t('pages.manager.locPreview.table.typeLabel'),
minWidth: 160,
showOverflowTooltip: true
},
{
prop: 'barcode',
- label: '鏉$爜',
+ label: $t('pages.manager.locPreview.table.barcode'),
minWidth: 160,
showOverflowTooltip: true
},
{
prop: 'useStatusLabel',
- label: '浣跨敤鐘舵��',
+ label: $t('pages.manager.locPreview.table.useStatusLabel'),
width: 120
},
{
prop: 'row',
- label: '鎺�',
+ label: $t('pages.manager.locPreview.table.row'),
width: 80
},
{
prop: 'col',
- label: '鍒�',
+ label: $t('pages.manager.locPreview.table.col'),
width: 80
},
{
prop: 'lev',
- label: '灞�',
+ label: $t('pages.manager.locPreview.table.lev'),
width: 80
},
{
prop: 'channel',
- label: '宸烽亾',
+ label: $t('pages.manager.locPreview.table.channel'),
width: 90
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'action',
- label: '璇︽儏',
+ label: $t('common.actions.detail'),
width: 100,
fixed: 'right',
useSlot: true,
diff --git a/rsf-design/src/views/manager/loc-preview/modules/loc-preview-detail-drawer.vue b/rsf-design/src/views/manager/loc-preview/modules/loc-preview-detail-drawer.vue
index b53a816..e2c74ba 100644
--- a/rsf-design/src/views/manager/loc-preview/modules/loc-preview-detail-drawer.vue
+++ b/rsf-design/src/views/manager/loc-preview/modules/loc-preview-detail-drawer.vue
@@ -1,27 +1,27 @@
<template>
<ElDrawer
:model-value="visible"
- title="搴撲綅璇︽儏"
+ :title="t('pages.manager.locPreview.detail.title')"
size="85%"
@update:model-value="handleVisibleChange"
>
<div class="flex h-full flex-col gap-4">
<ElDescriptions :column="4" border>
- <ElDescriptionsItem label="搴撲綅缂栫爜">{{ detail.locCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浠撳簱">{{ detail.warehouseLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撳尯">{{ detail.areaLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浣跨敤鐘舵��">{{
+ <ElDescriptionsItem :label="t('pages.manager.locPreview.table.locCode')">{{ detail.locCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locPreview.table.warehouseLabel')">{{ detail.warehouseLabel || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locPreview.table.areaLabel')">{{ detail.areaLabel || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locPreview.table.useStatusLabel')">{{
detail.useStatusLabel || '--'
}}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撲綅绫诲瀷">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏉$爜">{{ detail.barcode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎺�">{{ detail.row ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒�">{{ detail.col ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locPreview.table.typeLabel')">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locPreview.table.barcode')">{{ detail.barcode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locPreview.table.row')">{{ detail.row ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.locPreview.table.col')">{{ detail.col ?? '--' }}</ElDescriptionsItem>
</ElDescriptions>
<div class="flex items-center justify-between">
- <div class="text-sm text-[var(--art-gray-600)]">搴撳瓨鏄庣粏</div>
- <ElButton :loading="loading" @click="$emit('refresh')">鍒锋柊</ElButton>
+ <div class="text-sm text-[var(--art-gray-600)]">{{ t('pages.manager.locPreview.detail.stockItems') }}</div>
+ <ElButton :loading="loading" @click="$emit('refresh')">{{ t('common.actions.refresh') }}</ElButton>
</div>
<ArtTable
@@ -37,6 +37,10 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
+
+ const { t } = useI18n()
+
defineProps({
visible: { type: Boolean, default: false },
loading: { type: Boolean, default: false },
diff --git a/rsf-design/src/views/manager/menu-pda/index.vue b/rsf-design/src/views/manager/menu-pda/index.vue
index d40a08f..88e1d33 100644
--- a/rsf-design/src/views/manager/menu-pda/index.vue
+++ b/rsf-design/src/views/manager/menu-pda/index.vue
@@ -16,9 +16,9 @@
@refresh="handleRefresh"
>
<template #left>
- <ElButton v-auth="'add'" @click="handleAddMenu" v-ripple>娣诲姞PDA鑿滃崟</ElButton>
+ <ElButton v-auth="'add'" @click="handleAddMenu" v-ripple>{{ t('pages.manager.menuPda.actions.add') }}</ElButton>
<ElButton @click="toggleExpand" v-ripple>
- {{ isExpanded ? '鏀惰捣' : '灞曞紑' }}
+ {{ isExpanded ? t('common.actions.collapse') : t('common.actions.expand') }}
</ElButton>
</template>
</ArtTableHeader>
@@ -46,6 +46,7 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
import { useTableColumns } from '@/hooks/core/useTableColumns'
import {
@@ -66,6 +67,7 @@
} from './menuPdaPage.helpers'
defineOptions({ name: 'MenuPda' })
+ const { t } = useI18n()
const loading = ref(false)
const isExpanded = ref(false)
@@ -82,16 +84,16 @@
const formItems = computed(() => [
{
- label: '鑿滃崟鍚嶇О',
+ label: t('pages.manager.menuPda.search.name'),
key: 'name',
type: 'input',
- props: { clearable: true }
+ props: { clearable: true, placeholder: t('pages.manager.menuPda.search.namePlaceholder') }
},
{
- label: '璺敱鍦板潃',
+ label: t('pages.manager.menuPda.search.route'),
key: 'route',
type: 'input',
- props: { clearable: true }
+ props: { clearable: true, placeholder: t('pages.manager.menuPda.search.routePlaceholder') }
}
])
@@ -99,7 +101,7 @@
loading.value = true
try {
const list = await guardRequestWithMessage(fetchGetMenuPdaTree({ condition: appliedFilters.name || '' }), null, {
- timeoutMessage: 'PDA鑿滃崟鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.manager.menuPda.messages.listTimeout')
})
if (list === null) {
tableData.value = []
@@ -109,7 +111,7 @@
tableData.value = Array.isArray(list) ? list : []
menuTreeOptions.value = buildMenuPdaTreeOptions(tableData.value)
} catch (error) {
- ElMessage.error(error?.message || '鑾峰彇PDA鑿滃崟澶辫触')
+ ElMessage.error(error?.message || t('pages.manager.menuPda.messages.loadFailed'))
} finally {
loading.value = false
}
@@ -148,42 +150,42 @@
async function handleSubmit(formData) {
const payload = buildMenuPdaSubmitPayload(formData)
if (payload.id && payload.id === payload.parentId) {
- ElMessage.error('涓婄骇鑿滃崟涓嶈兘閫夋嫨褰撳墠鑿滃崟')
+ ElMessage.error(t('pages.manager.menuPda.messages.parentSelf'))
return
}
try {
if (payload.id) {
await fetchUpdateMenuPda(payload)
- ElMessage.success('淇敼鎴愬姛')
+ ElMessage.success(t('crud.messages.updateSuccess'))
} else {
await fetchSaveMenuPda(payload)
- ElMessage.success('鏂板鎴愬姛')
+ ElMessage.success(t('crud.messages.createSuccess'))
}
closeDialog()
await loadMenuPdaResources()
} catch (error) {
- ElMessage.error(error?.message || '鎻愪氦澶辫触')
+ ElMessage.error(error?.message || t('crud.messages.submitFailed'))
}
}
async function handleDeleteMenu(row) {
try {
await ElMessageBox.confirm(
- `纭畾瑕佸垹闄DA鑿滃崟銆�${getMenuPdaDisplayTitle(row)}銆嶅悧锛熷垹闄ゅ悗鏃犳硶鎭㈠`,
- '鍒犻櫎纭',
+ t('pages.manager.menuPda.messages.deleteConfirm', { title: getMenuPdaDisplayTitle(row) }),
+ t('crud.confirm.deleteTitle'),
{
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
+ confirmButtonText: t('common.confirm'),
+ cancelButtonText: t('common.cancel'),
type: 'warning'
}
)
await fetchDeleteMenuPda(row.id)
- ElMessage.success('鍒犻櫎鎴愬姛')
+ ElMessage.success(t('crud.messages.deleteSuccess'))
await loadMenuPdaResources()
} catch (error) {
if (error !== 'cancel') {
- ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+ ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
}
}
}
diff --git a/rsf-design/src/views/manager/menu-pda/menuPdaPage.helpers.js b/rsf-design/src/views/manager/menu-pda/menuPdaPage.helpers.js
index cc7786c..a0da2b3 100644
--- a/rsf-design/src/views/manager/menu-pda/menuPdaPage.helpers.js
+++ b/rsf-design/src/views/manager/menu-pda/menuPdaPage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
export function createMenuPdaSearchState() {
return {
name: '',
@@ -32,15 +34,15 @@
}
export function getMenuPdaTypeText(row = {}) {
- if (Number(row.type) === 1) return '鎸夐挳'
- if (hasNestedMenuPda(row)) return '鐩綍'
- return '鑿滃崟'
+ if (Number(row.type) === 1) return $t('pages.manager.menuPda.type.button')
+ if (hasNestedMenuPda(row)) return $t('pages.manager.menuPda.type.directory')
+ return $t('pages.manager.menuPda.type.menu')
}
export function getMenuPdaStatusMeta(status) {
return normalizeMenuPdaNumber(status, 1) === 1
- ? { text: '鍚敤', type: 'success' }
- : { text: '绂佺敤', type: 'danger' }
+ ? { text: $t('common.status.enabled'), type: 'success' }
+ : { text: $t('common.status.disabled'), type: 'danger' }
}
export function normalizeMenuPdaTreeOptions(nodes = []) {
@@ -58,7 +60,7 @@
export function buildMenuPdaTreeOptions(tree = []) {
return [
{
- label: '椤剁骇鑿滃崟',
+ label: $t('pages.manager.menuPda.tree.topLevel'),
value: 0,
children: normalizeMenuPdaTreeOptions(tree)
}
diff --git a/rsf-design/src/views/manager/menu-pda/menuPdaTable.columns.js b/rsf-design/src/views/manager/menu-pda/menuPdaTable.columns.js
index 3f53904..3f386b3 100644
--- a/rsf-design/src/views/manager/menu-pda/menuPdaTable.columns.js
+++ b/rsf-design/src/views/manager/menu-pda/menuPdaTable.columns.js
@@ -1,4 +1,5 @@
import { h } from 'vue'
+import { $t } from '@/locales'
import { ElTag } from 'element-plus'
import ArtSvgIcon from '@/components/core/base/art-svg-icon/index.vue'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
@@ -14,13 +15,13 @@
return [
{
prop: 'name',
- label: '鑿滃崟鍚嶇О',
+ label: $t('pages.manager.menuPda.table.name'),
minWidth: 180,
formatter: (row) => getMenuPdaDisplayTitle(row)
},
{
prop: 'icon',
- label: '鍥炬爣棰勮',
+ label: $t('pages.manager.menuPda.table.iconPreview'),
width: 96,
align: 'center',
formatter: (row) => {
@@ -38,31 +39,31 @@
},
{
prop: 'type',
- label: '鑿滃崟绫诲瀷',
+ label: $t('pages.manager.menuPda.table.menuType'),
width: 110,
formatter: (row) =>
h(ElTag, { type: getMenuPdaTypeTag(row), effect: 'light' }, () => getMenuPdaTypeText(row))
},
{
prop: 'route',
- label: '璺敱',
+ label: $t('table.route'),
minWidth: 180,
formatter: (row) => row.route || ''
},
{
prop: 'authority',
- label: '鏉冮檺鏍囪瘑',
+ label: $t('table.authority'),
minWidth: 180,
formatter: (row) => row.authority || '-'
},
{
prop: 'sort',
- label: '鎺掑簭',
+ label: $t('table.sort'),
width: 90
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100,
formatter: (row) => {
const statusMeta = getMenuPdaStatusMeta(row.status)
@@ -71,14 +72,14 @@
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.memo'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '-'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'right',
formatter: (row) =>
diff --git a/rsf-design/src/views/manager/menu-pda/modules/menu-pda-dialog.vue b/rsf-design/src/views/manager/menu-pda/modules/menu-pda-dialog.vue
index 05186b8..b4f7515 100644
--- a/rsf-design/src/views/manager/menu-pda/modules/menu-pda-dialog.vue
+++ b/rsf-design/src/views/manager/menu-pda/modules/menu-pda-dialog.vue
@@ -21,16 +21,16 @@
>
<template #menuType>
<ElRadioGroup v-model="form.menuType" :disabled="disableMenuType">
- <ElRadioButton value="menu">鑿滃崟</ElRadioButton>
- <ElRadioButton value="button">鎸夐挳</ElRadioButton>
+ <ElRadioButton value="menu">{{ t('pages.manager.menuPda.type.menu') }}</ElRadioButton>
+ <ElRadioButton value="button">{{ t('pages.manager.menuPda.type.button') }}</ElRadioButton>
</ElRadioGroup>
</template>
</ArtForm>
<template #footer>
<span class="dialog-footer">
- <ElButton @click="handleCancel">鍙栨秷</ElButton>
- <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+ <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+ <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
</span>
</template>
</ElDialog>
@@ -38,6 +38,9 @@
<script setup>
import ArtForm from '@/components/core/forms/art-form/index.vue'
+ import { useI18n } from 'vue-i18n'
+
+ const { t } = useI18n()
const createMenuPdaFormState = () => ({
menuType: 'menu',
@@ -65,23 +68,43 @@
const form = reactive(createMenuPdaFormState())
const isEdit = computed(() => Boolean(form.id))
- const dialogTitle = computed(() => `${isEdit.value ? '缂栬緫' : '鏂板缓'}${form.menuType === 'button' ? '鎸夐挳' : '鑿滃崟'}`)
+ const dialogTitle = computed(() =>
+ isEdit.value
+ ? form.menuType === 'button'
+ ? t('pages.manager.menuPda.dialog.titleEditButton')
+ : t('pages.manager.menuPda.dialog.titleEditMenu')
+ : form.menuType === 'button'
+ ? t('pages.manager.menuPda.dialog.titleAddButton')
+ : t('pages.manager.menuPda.dialog.titleAddMenu')
+ )
const disableMenuType = computed(() => props.lockType || isEdit.value)
const rules = computed(() => ({
- name: [{ required: true, message: form.menuType === 'button' ? '璇疯緭鍏ユ潈闄愬悕绉�' : '璇疯緭鍏ヨ彍鍗曞悕绉�', trigger: 'blur' }],
- route: form.menuType === 'menu' ? [{ required: true, message: '璇疯緭鍏ヨ矾鐢卞湴鍧�', trigger: 'blur' }] : [],
+ name: [
+ {
+ required: true,
+ message:
+ form.menuType === 'button'
+ ? t('pages.manager.menuPda.dialog.validation.permissionName')
+ : t('pages.manager.menuPda.dialog.validation.menuName'),
+ trigger: 'blur'
+ }
+ ],
+ route:
+ form.menuType === 'menu'
+ ? [{ required: true, message: t('pages.manager.menuPda.dialog.validation.route'), trigger: 'blur' }]
+ : [],
authority:
form.menuType === 'button'
- ? [{ required: true, message: '璇疯緭鍏ユ潈闄愭爣璇�', trigger: 'blur' }]
+ ? [{ required: true, message: t('pages.manager.menuPda.dialog.validation.authority'), trigger: 'blur' }]
: []
}))
const formItems = computed(() => {
const items = [
- { label: '鑿滃崟绫诲瀷', key: 'menuType', span: 24 },
+ { label: t('pages.manager.menuPda.dialog.menuType'), key: 'menuType', span: 24 },
{
- label: '涓婄骇鑿滃崟',
+ label: t('pages.manager.menuPda.dialog.parentMenu'),
key: 'parentId',
type: 'treeselect',
span: 24,
@@ -92,19 +115,25 @@
value: 'value',
children: 'children'
},
- placeholder: '璇烽�夋嫨涓婄骇鑿滃崟',
+ placeholder: t('pages.manager.menuPda.dialog.placeholder.parentMenu'),
checkStrictly: true,
clearable: false,
defaultExpandAll: true
}
},
{
- label: form.menuType === 'button' ? '鏉冮檺鍚嶇О' : '鑿滃崟鍚嶇О',
+ label:
+ form.menuType === 'button'
+ ? t('pages.manager.menuPda.dialog.permissionName')
+ : t('pages.manager.menuPda.dialog.menuName'),
key: 'name',
type: 'input',
span: 24,
props: {
- placeholder: form.menuType === 'button' ? '璇疯緭鍏ユ潈闄愬悕绉�' : '璇疯緭鍏ヨ彍鍗曞悕绉�',
+ placeholder:
+ form.menuType === 'button'
+ ? t('pages.manager.menuPda.dialog.placeholder.permissionName')
+ : t('pages.manager.menuPda.dialog.placeholder.menuName'),
clearable: true
}
}
@@ -113,22 +142,22 @@
if (form.menuType === 'menu') {
items.push(
{
- label: '璺敱鍦板潃',
+ label: t('pages.manager.menuPda.dialog.route'),
key: 'route',
type: 'input',
span: 24,
props: {
- placeholder: '璇疯緭鍏ヨ矾鐢卞湴鍧�',
+ placeholder: t('pages.manager.menuPda.dialog.placeholder.route'),
clearable: true
}
},
{
- label: '缁勪欢鏍囪瘑',
+ label: t('pages.manager.menuPda.dialog.component'),
key: 'component',
type: 'input',
span: 24,
props: {
- placeholder: '璇疯緭鍏ョ粍浠舵爣璇�',
+ placeholder: t('pages.manager.menuPda.dialog.placeholder.component'),
clearable: true
}
}
@@ -137,27 +166,27 @@
items.push(
{
- label: '鏉冮檺鏍囪瘑',
+ label: t('pages.manager.menuPda.dialog.authority'),
key: 'authority',
type: 'input',
span: 24,
props: {
- placeholder: '璇疯緭鍏ユ潈闄愭爣璇�',
+ placeholder: t('pages.manager.menuPda.dialog.placeholder.authority'),
clearable: true
}
},
{
- label: '鍥炬爣',
+ label: t('pages.manager.menuPda.dialog.icon'),
key: 'icon',
type: 'input',
span: 24,
props: {
- placeholder: '璇疯緭鍏ュ浘鏍囧悕绉�',
+ placeholder: t('pages.manager.menuPda.dialog.placeholder.icon'),
clearable: true
}
},
{
- label: '鎺掑簭',
+ label: t('pages.manager.menuPda.dialog.sort'),
key: 'sort',
type: 'number',
span: 24,
@@ -168,27 +197,27 @@
}
},
{
- label: '鐘舵��',
+ label: t('pages.manager.menuPda.dialog.status'),
key: 'status',
type: 'select',
span: 24,
props: {
- placeholder: '璇烽�夋嫨鐘舵��',
+ placeholder: t('pages.manager.menuPda.dialog.placeholder.status'),
options: [
- { label: '鍚敤', value: 1 },
- { label: '绂佺敤', value: 0 }
+ { label: t('common.status.enabled'), value: 1 },
+ { label: t('common.status.disabled'), value: 0 }
]
}
},
{
- label: '澶囨敞',
+ label: t('table.memo'),
key: 'memo',
type: 'input',
span: 24,
props: {
type: 'textarea',
rows: 3,
- placeholder: '璇疯緭鍏ュ娉�',
+ placeholder: t('pages.manager.menuPda.dialog.placeholder.memo'),
clearable: true
}
}
diff --git a/rsf-design/src/views/manager/task-log/index.vue b/rsf-design/src/views/manager/task-log/index.vue
index eb0a2b2..6ccb90b 100644
--- a/rsf-design/src/views/manager/task-log/index.vue
+++ b/rsf-design/src/views/manager/task-log/index.vue
@@ -46,6 +46,7 @@
<script setup>
import { computed, ref } from 'vue'
+ import { useI18n } from 'vue-i18n'
import { useUserStore } from '@/store/modules/user'
import { useTable } from '@/hooks/core/useTable'
import { usePrintExportPage } from '@/views/system/common/usePrintExportPage'
@@ -73,6 +74,7 @@
defineOptions({ name: 'TaskLog' })
const userStore = useUserStore()
+ const { t } = useI18n()
const searchForm = ref(createTaskLogSearchState())
const detailDrawerVisible = ref(false)
const detailData = ref({})
@@ -83,61 +85,61 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('table.keyword'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヤ换鍔″彿/鎵樼洏鐮�/鏈哄櫒浜虹紪鐮�'
+ placeholder: t('pages.manager.taskLog.search.conditionPlaceholder')
}
},
{
- label: '浠诲姟鍙�',
+ label: t('pages.manager.taskLog.table.taskCode'),
key: 'taskCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヤ换鍔″彿'
+ placeholder: t('pages.manager.taskLog.search.taskCodePlaceholder')
}
},
{
- label: '婧愬簱浣�',
+ label: t('pages.manager.taskLog.table.orgLoc'),
key: 'orgLoc',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユ簮搴撲綅'
+ placeholder: t('pages.manager.taskLog.search.orgLocPlaceholder')
}
},
{
- label: '鐩爣搴撲綅',
+ label: t('pages.manager.taskLog.table.targLoc'),
key: 'targLoc',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ洰鏍囧簱浣�'
+ placeholder: t('pages.manager.taskLog.search.targLocPlaceholder')
}
},
{
- label: '鎵樼洏鐮�',
+ label: t('pages.manager.taskLog.table.barcode'),
key: 'barcode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユ墭鐩樼爜'
+ placeholder: t('pages.manager.taskLog.search.barcodePlaceholder')
}
},
{
- label: '鏈哄櫒浜虹紪鐮�',
+ label: t('pages.manager.taskLog.table.robotCode'),
key: 'robotCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユ満鍣ㄤ汉缂栫爜'
+ placeholder: t('pages.manager.taskLog.search.robotCodePlaceholder')
}
},
{
- label: '寮�濮嬫棩鏈�',
+ label: t('pages.manager.taskLog.search.timeStart'),
key: 'timeStart',
type: 'date',
props: {
@@ -147,7 +149,7 @@
}
},
{
- label: '缁撴潫鏃ユ湡',
+ label: t('pages.manager.taskLog.search.timeEnd'),
key: 'timeEnd',
type: 'date',
props: {
diff --git a/rsf-design/src/views/manager/task-log/modules/task-log-detail-drawer.vue b/rsf-design/src/views/manager/task-log/modules/task-log-detail-drawer.vue
index b2a5166..d92c299 100644
--- a/rsf-design/src/views/manager/task-log/modules/task-log-detail-drawer.vue
+++ b/rsf-design/src/views/manager/task-log/modules/task-log-detail-drawer.vue
@@ -1,37 +1,37 @@
<template>
<ElDrawer
:model-value="visible"
- title="浠诲姟鍘嗗彶妗h鎯�"
+ :title="t('pages.manager.taskLog.detail.title')"
size="72%"
@update:model-value="handleVisibleChange"
>
<ElScrollbar class="h-[calc(100vh-120px)]">
<div class="flex min-h-full flex-col gap-4 pr-2">
<ElDescriptions :column="4" border>
- <ElDescriptionsItem label="浠诲姟ID">{{ detail.taskId ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浠诲姟鍙�">{{ detail.taskCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浠诲姟鐘舵��">{{ detail.taskStatusText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浠诲姟绫诲瀷">{{ detail.taskTypeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="婧愬簱浣�">{{ detail.orgLoc || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="婧愮珯鐐�">{{ detail.orgSite || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐩爣搴撲綅">{{ detail.targLoc || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐩爣绔欑偣">{{ detail.targSite || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵樼洏鐮�">{{ detail.barcode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏈哄櫒浜虹紪鐮�">{{ detail.robotCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵ц鐘舵��">{{ detail.exceStatusText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浼樺厛绾�">{{ detail.sort ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="寮傚父鎻忚堪">{{ detail.expDesc || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="寮傚父缂栫爜">{{ detail.expCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="寮�濮嬫椂闂�">{{ detail.startTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="缁撴潫鏃堕棿">{{ detail.endTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.detail.taskId')">{{ detail.taskId ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.table.taskCode')">{{ detail.taskCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.table.taskStatus')">{{ detail.taskStatusText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.table.taskType')">{{ detail.taskTypeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.table.orgLoc')">{{ detail.orgLoc || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.table.orgSite')">{{ detail.orgSite || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.table.targLoc')">{{ detail.targLoc || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.table.targSite')">{{ detail.targSite || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.table.barcode')">{{ detail.barcode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.table.robotCode')">{{ detail.robotCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.detail.exceStatus')">{{ detail.exceStatusText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.detail.sort')">{{ detail.sort ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.detail.expDesc')">{{ detail.expDesc || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.detail.expCode')">{{ detail.expCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.table.startTime')">{{ detail.startTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.taskLog.table.endTime')">{{ detail.endTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createBy')">{{ detail.createByText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateBy')">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.status')">
<ElTag :type="detail.statusType || 'info'" effect="light">{{ detail.statusText || '--' }}</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞" :span="3">{{ detail.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.memo')" :span="3">{{ detail.memo || '--' }}</ElDescriptionsItem>
</ElDescriptions>
</div>
</ElScrollbar>
@@ -39,6 +39,7 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
defineOptions({ name: 'TaskLogDetailDrawer' })
defineProps({
@@ -47,6 +48,7 @@
})
const emit = defineEmits(['update:visible'])
+ const { t } = useI18n()
function handleVisibleChange(visible) {
emit('update:visible', visible)
diff --git a/rsf-design/src/views/manager/task-log/taskLogPage.helpers.js b/rsf-design/src/views/manager/task-log/taskLogPage.helpers.js
index 41c7013..de00109 100644
--- a/rsf-design/src/views/manager/task-log/taskLogPage.helpers.js
+++ b/rsf-design/src/views/manager/task-log/taskLogPage.helpers.js
@@ -1,9 +1,11 @@
+import { $t } from '@/locales'
+
const STATUS_META = {
- 1: { text: '姝e父', type: 'success' },
- 0: { text: '鍐荤粨', type: 'info' }
+ 1: { text: $t('common.status.enabled'), type: 'success' },
+ 0: { text: $t('common.status.disabled'), type: 'info' }
}
-export const TASK_LOG_REPORT_TITLE = '浠诲姟鍘嗗彶妗f姤琛�'
+export const TASK_LOG_REPORT_TITLE = $t('pages.manager.taskLog.reportTitle')
function normalizeText(value) {
return String(value ?? '').trim()
@@ -132,15 +134,15 @@
export function getTaskLogReportColumns() {
return [
- { prop: 'taskCode', label: '浠诲姟鍙�' },
- { prop: 'taskStatusText', label: '浠诲姟鐘舵��' },
- { prop: 'taskTypeText', label: '浠诲姟绫诲瀷' },
- { prop: 'orgLoc', label: '婧愬簱浣�' },
- { prop: 'targLoc', label: '鐩爣搴撲綅' },
- { prop: 'barcode', label: '鎵樼洏鐮�' },
- { prop: 'robotCode', label: '鏈哄櫒浜虹紪鐮�' },
- { prop: 'startTimeText', label: '寮�濮嬫椂闂�' },
- { prop: 'endTimeText', label: '缁撴潫鏃堕棿' }
+ { prop: 'taskCode', label: $t('pages.manager.taskLog.table.taskCode') },
+ { prop: 'taskStatusText', label: $t('pages.manager.taskLog.table.taskStatus') },
+ { prop: 'taskTypeText', label: $t('pages.manager.taskLog.table.taskType') },
+ { prop: 'orgLoc', label: $t('pages.manager.taskLog.table.orgLoc') },
+ { prop: 'targLoc', label: $t('pages.manager.taskLog.table.targLoc') },
+ { prop: 'barcode', label: $t('pages.manager.taskLog.table.barcode') },
+ { prop: 'robotCode', label: $t('pages.manager.taskLog.table.robotCode') },
+ { prop: 'startTimeText', label: $t('pages.manager.taskLog.table.startTime') },
+ { prop: 'endTimeText', label: $t('pages.manager.taskLog.table.endTime') }
]
}
diff --git a/rsf-design/src/views/manager/task-log/taskLogTable.columns.js b/rsf-design/src/views/manager/task-log/taskLogTable.columns.js
index 2ece020..cb54e81 100644
--- a/rsf-design/src/views/manager/task-log/taskLogTable.columns.js
+++ b/rsf-design/src/views/manager/task-log/taskLogTable.columns.js
@@ -1,80 +1,81 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
+import { $t } from '@/locales'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
export function createTaskLogTableColumns({ handleView } = {}) {
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
{
prop: 'taskCode',
- label: '浠诲姟鍙�',
+ label: $t('pages.manager.taskLog.table.taskCode'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'taskStatusText',
- label: '浠诲姟鐘舵��',
+ label: $t('pages.manager.taskLog.table.taskStatus'),
minWidth: 120,
showOverflowTooltip: true
},
{
prop: 'taskTypeText',
- label: '浠诲姟绫诲瀷',
+ label: $t('pages.manager.taskLog.table.taskType'),
minWidth: 120,
showOverflowTooltip: true
},
{
prop: 'orgLoc',
- label: '婧愬簱浣�',
+ label: $t('pages.manager.taskLog.table.orgLoc'),
minWidth: 130,
showOverflowTooltip: true
},
{
prop: 'orgSite',
- label: '婧愮珯鐐�',
+ label: $t('pages.manager.taskLog.table.orgSite'),
minWidth: 130,
showOverflowTooltip: true
},
{
prop: 'targLoc',
- label: '鐩爣搴撲綅',
+ label: $t('pages.manager.taskLog.table.targLoc'),
minWidth: 130,
showOverflowTooltip: true
},
{
prop: 'targSite',
- label: '鐩爣绔欑偣',
+ label: $t('pages.manager.taskLog.table.targSite'),
minWidth: 130,
showOverflowTooltip: true
},
{
prop: 'barcode',
- label: '鎵樼洏鐮�',
+ label: $t('pages.manager.taskLog.table.barcode'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'robotCode',
- label: '鏈哄櫒浜虹紪鐮�',
+ label: $t('pages.manager.taskLog.table.robotCode'),
minWidth: 140,
showOverflowTooltip: true
},
{
prop: 'startTimeText',
- label: '寮�濮嬫椂闂�',
+ label: $t('pages.manager.taskLog.table.startTime'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'endTimeText',
- label: '缁撴潫鏃堕棿',
+ label: $t('pages.manager.taskLog.table.endTime'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100,
align: 'center',
formatter: (row) =>
@@ -89,13 +90,13 @@
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 92,
align: 'center',
fixed: 'right',
diff --git a/rsf-design/src/views/manager/wave-rule/index.vue b/rsf-design/src/views/manager/wave-rule/index.vue
index 41970b2..d40733f 100644
--- a/rsf-design/src/views/manager/wave-rule/index.vue
+++ b/rsf-design/src/views/manager/wave-rule/index.vue
@@ -12,7 +12,7 @@
<ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
<template #left>
<ElSpace wrap>
- <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>鏂板娉㈡绛栫暐</ElButton>
+ <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>{{ t('pages.manager.waveRule.actions.add') }}</ElButton>
<ElButton
v-auth="'delete'"
type="danger"
@@ -20,7 +20,7 @@
@click="handleBatchDelete"
v-ripple
>
- 鎵归噺鍒犻櫎
+ {{ t('common.actions.batchDelete') }}
</ElButton>
</ElSpace>
</template>
@@ -54,6 +54,7 @@
<script setup>
import { ElMessage } from 'element-plus'
+ import { useI18n } from 'vue-i18n'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
import { useAuth } from '@/hooks/core/useAuth'
import { useTable } from '@/hooks/core/useTable'
@@ -82,6 +83,7 @@
} from './waveRulePage.helpers'
defineOptions({ name: 'WaveRule' })
+ const { t } = useI18n()
const { hasAuth } = useAuth()
const searchForm = ref(createWaveRuleSearchState())
@@ -93,25 +95,25 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('table.keyword'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ紪鍙锋垨鍚嶇О'
+ placeholder: t('pages.manager.waveRule.search.conditionPlaceholder')
}
},
{
- label: '缂栧彿',
+ label: t('table.code'),
key: 'code',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ紪鍙�'
+ placeholder: t('pages.manager.waveRule.search.codePlaceholder')
}
},
{
- label: '绫诲瀷',
+ label: t('pages.manager.waveRule.table.type'),
key: 'type',
type: 'select',
props: {
@@ -120,12 +122,12 @@
}
},
{
- label: '鍚嶇О',
+ label: t('table.name'),
key: 'name',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ瓥鐣ュ悕绉�'
+ placeholder: t('pages.manager.waveRule.search.namePlaceholder')
}
}
])
@@ -140,7 +142,7 @@
}),
[],
{
- timeoutMessage: '娉㈡绛栫暐绫诲瀷鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.manager.waveRule.messages.typeTimeout')
}
)
typeOptions.value = buildWaveRuleTypeOptions(Array.isArray(records?.records) ? records.records : records?.list || records || [])
@@ -154,7 +156,7 @@
} catch (error) {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇娉㈡绛栫暐璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.manager.waveRule.messages.detailFailed'))
} finally {
detailLoading.value = false
}
@@ -166,7 +168,7 @@
dialogVisible.value = true
dialogType.value = 'edit'
} catch (error) {
- ElMessage.error(error?.message || '鑾峰彇娉㈡绛栫暐璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.manager.waveRule.messages.detailFailed'))
}
}
@@ -224,7 +226,7 @@
saveRequest: fetchSaveWaveRule,
updateRequest: fetchUpdateWaveRule,
deleteRequest: fetchDeleteWaveRule,
- entityName: '娉㈡绛栫暐',
+ entityName: t('pages.manager.waveRule.entity'),
resolveRecordLabel: (record) => record?.name || record?.code || record?.id,
refreshCreate,
refreshUpdate,
diff --git a/rsf-design/src/views/manager/wave-rule/modules/wave-rule-detail-drawer.vue b/rsf-design/src/views/manager/wave-rule/modules/wave-rule-detail-drawer.vue
index 1e4247e..df17ae1 100644
--- a/rsf-design/src/views/manager/wave-rule/modules/wave-rule-detail-drawer.vue
+++ b/rsf-design/src/views/manager/wave-rule/modules/wave-rule-detail-drawer.vue
@@ -1,29 +1,30 @@
<template>
<ElDrawer
:model-value="visible"
- title="娉㈡绛栫暐璇︽儏"
+ :title="t('pages.manager.waveRule.detail.title')"
size="560px"
@update:model-value="handleVisibleChange"
>
<ElSkeleton :loading="loading" animated :rows="10">
<ElDescriptions :column="1" border>
- <ElDescriptionsItem label="缂栧彿">{{ displayData.code || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="绫诲瀷">{{ displayData.typeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍚嶇О">{{ displayData.name || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">
+ <ElDescriptionsItem :label="t('table.code')">{{ displayData.code || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.manager.waveRule.table.type')">{{ displayData.typeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.name')">{{ displayData.name || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.status')">
<ElTag :type="displayData.statusType" effect="light">{{ displayData.statusText || '--' }}</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊浜�">{{ displayData.updateByLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ displayData.updateTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ displayData.createByLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ displayData.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞">{{ displayData.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateBy')">{{ displayData.updateByLabel || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{ displayData.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createBy')">{{ displayData.createByLabel || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{ displayData.createTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.memo')">{{ displayData.memo || '--' }}</ElDescriptionsItem>
</ElDescriptions>
</ElSkeleton>
</ElDrawer>
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import { normalizeWaveRuleListRow } from '../waveRulePage.helpers'
const props = defineProps({
@@ -34,6 +35,7 @@
const emit = defineEmits(['update:visible'])
const displayData = computed(() => normalizeWaveRuleListRow(props.detailData))
+ const { t } = useI18n()
function handleVisibleChange(visible) {
emit('update:visible', visible)
diff --git a/rsf-design/src/views/manager/wave-rule/modules/wave-rule-dialog.vue b/rsf-design/src/views/manager/wave-rule/modules/wave-rule-dialog.vue
index 5de7261..2afd6bb 100644
--- a/rsf-design/src/views/manager/wave-rule/modules/wave-rule-dialog.vue
+++ b/rsf-design/src/views/manager/wave-rule/modules/wave-rule-dialog.vue
@@ -21,14 +21,15 @@
<template #footer>
<span class="dialog-footer">
- <ElButton @click="handleCancel">鍙栨秷</ElButton>
- <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+ <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+ <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
</span>
</template>
</ElDialog>
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import ArtForm from '@/components/core/forms/art-form/index.vue'
import { buildWaveRuleDialogModel, createWaveRuleFormState } from '../waveRulePage.helpers'
@@ -41,64 +42,67 @@
const emit = defineEmits(['update:visible', 'submit'])
const formRef = ref()
const form = reactive(createWaveRuleFormState())
+ const { t } = useI18n()
const isEdit = computed(() => Boolean(form.id))
- const dialogTitle = computed(() => (isEdit.value ? '缂栬緫娉㈡绛栫暐' : '鏂板娉㈡绛栫暐'))
+ const dialogTitle = computed(() =>
+ isEdit.value ? t('pages.manager.waveRule.dialog.titleEdit') : t('pages.manager.waveRule.dialog.titleCreate')
+ )
const rules = computed(() => ({
- type: [{ required: true, message: '璇烽�夋嫨绛栫暐绫诲瀷', trigger: 'change' }],
- name: [{ required: true, message: '璇疯緭鍏ョ瓥鐣ュ悕绉�', trigger: 'blur' }]
+ type: [{ required: true, message: t('pages.manager.waveRule.dialog.validation.type'), trigger: 'change' }],
+ name: [{ required: true, message: t('pages.manager.waveRule.dialog.validation.name'), trigger: 'blur' }]
}))
const formItems = computed(() => [
{
- label: '缂栧彿',
+ label: t('table.code'),
key: 'code',
type: 'input',
props: {
disabled: true,
- placeholder: '鏂板鍚庤嚜鍔ㄧ敓鎴�'
+ placeholder: t('pages.manager.waveRule.dialog.placeholder.code')
}
},
{
- label: '绫诲瀷',
+ label: t('pages.manager.waveRule.table.type'),
key: 'type',
type: 'select',
props: {
options: props.typeOptions,
- placeholder: '璇烽�夋嫨绛栫暐绫诲瀷'
+ placeholder: t('pages.manager.waveRule.dialog.placeholder.type')
}
},
{
- label: '鍚嶇О',
+ label: t('table.name'),
key: 'name',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ瓥鐣ュ悕绉�'
+ placeholder: t('pages.manager.waveRule.dialog.placeholder.name')
}
},
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: {
options: [
- { label: '姝e父', value: 1 },
- { label: '鍐荤粨', value: 0 }
+ { label: t('common.status.enabled'), value: 1 },
+ { label: t('common.status.disabled'), value: 0 }
],
- placeholder: '璇烽�夋嫨鐘舵��'
+ placeholder: t('pages.manager.waveRule.dialog.placeholder.status')
}
},
{
- label: '澶囨敞',
+ label: t('table.memo'),
key: 'memo',
type: 'input',
span: 24,
props: {
type: 'textarea',
rows: 3,
- placeholder: '璇疯緭鍏ュ娉�'
+ placeholder: t('pages.manager.waveRule.dialog.placeholder.memo')
}
}
])
diff --git a/rsf-design/src/views/manager/wave-rule/waveRulePage.helpers.js b/rsf-design/src/views/manager/wave-rule/waveRulePage.helpers.js
index d96c6ac..cb20f59 100644
--- a/rsf-design/src/views/manager/wave-rule/waveRulePage.helpers.js
+++ b/rsf-design/src/views/manager/wave-rule/waveRulePage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
const WAVE_RULE_DICT_TYPE_CODE = 'sys_wave_rule_code'
export function getWaveRuleDictTypeCode() {
@@ -34,8 +36,8 @@
export function getWaveRuleStatusMeta(status) {
return Number(status) === 1
- ? { text: '姝e父', type: 'success', bool: true }
- : { text: '鍐荤粨', type: 'danger', bool: false }
+ ? { text: $t('common.status.enabled'), type: 'success', bool: true }
+ : { text: $t('common.status.disabled'), type: 'danger', bool: false }
}
export function buildWaveRuleSearchParams(params = {}) {
diff --git a/rsf-design/src/views/manager/wave-rule/waveRuleTable.columns.js b/rsf-design/src/views/manager/wave-rule/waveRuleTable.columns.js
index f2bf1fd..c37be6a 100644
--- a/rsf-design/src/views/manager/wave-rule/waveRuleTable.columns.js
+++ b/rsf-design/src/views/manager/wave-rule/waveRuleTable.columns.js
@@ -1,48 +1,49 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
+import { $t } from '@/locales'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
export function createWaveRuleTableColumns({ handleView, handleEdit, handleDelete }) {
return [
{
prop: 'code',
- label: '缂栧彿',
+ label: $t('table.code'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'typeText',
- label: '绫诲瀷',
+ label: $t('pages.manager.waveRule.table.type'),
minWidth: 140,
formatter: (row) => row.typeText || '-'
},
{
prop: 'name',
- label: '鍚嶇О',
+ label: $t('table.name'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 100,
formatter: (row) => h(ElTag, { type: row.statusType, effect: 'light' }, () => row.statusText || '-')
},
{
prop: 'updateByLabel',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
width: 120,
formatter: (row) => row.updateByLabel || '-'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 180,
formatter: (row) => row.updateTimeText || '-'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: handleDelete ? 160 : 120,
align: 'right',
formatter: (row) => {
diff --git a/rsf-design/src/views/orders/asn-order-item-log/asnOrderItemLogPage.helpers.js b/rsf-design/src/views/orders/asn-order-item-log/asnOrderItemLogPage.helpers.js
index 01469b7..22fe601 100644
--- a/rsf-design/src/views/orders/asn-order-item-log/asnOrderItemLogPage.helpers.js
+++ b/rsf-design/src/views/orders/asn-order-item-log/asnOrderItemLogPage.helpers.js
@@ -1,6 +1,7 @@
import { normalizeAsnOrderItemLogRow } from '../asn-order-log/asnOrderLogPage.helpers.js'
+import { $t } from '@/locales'
-export const ASN_ORDER_ITEM_LOG_REPORT_TITLE = '鏀惰揣鍘嗗彶鏄庣粏鎶ヨ〃'
+export const ASN_ORDER_ITEM_LOG_REPORT_TITLE = $t('pages.orders.asnOrderItemLog.reportTitle')
export const ASN_ORDER_ITEM_LOG_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
@@ -116,30 +117,30 @@
export function getAsnOrderItemLogReportColumns() {
return [
- { key: 'asnCode', label: 'ASN鍗曞彿' },
- { key: 'platItemId', label: '骞冲彴琛屽彿' },
- { key: 'poDetlId', label: 'PO鍗曟槑缁咺D' },
- { key: 'poCode', label: 'PO鍗曞彿' },
- { key: 'fieldsIndex', label: '鍔ㄦ�佸瓧娈电储寮�' },
- { key: 'matnrCode', label: '鐗╂枡缂栫爜' },
- { key: 'maktx', label: '鐗╂枡鍚嶇О' },
- { key: 'anfme', label: '閫佽揣鏁伴噺' },
- { key: 'stockUnit', label: '搴撳瓨鍗曚綅' },
- { key: 'purQty', label: '閲囪喘鏁伴噺' },
- { key: 'purUnit', label: '閲囪喘鍗曚綅' },
- { key: 'qty', label: '宸叉敹鏁伴噺' },
- { key: 'splrCode', label: '渚涘簲鍟嗙紪鐮�' },
- { key: 'splrBatch', label: '渚涘簲鍟嗘壒娆�' },
- { key: 'splrName', label: '渚涘簲鍟嗗悕绉�' },
- { key: 'qrcode', label: '浜岀淮鐮�' },
- { key: 'trackCode', label: '璺熻釜鐮�' },
- { key: 'barcode', label: '鏉″舰鐮�' },
- { key: 'packName', label: '鍖呰鍚嶇О' },
- { key: 'ntyStatusText', label: '涓婃姤鐘舵��' },
- { key: 'statusText', label: '鐘舵��' },
- { key: 'updateByText', label: '鏇存柊浜�' },
- { key: 'updateTimeText', label: '鏇存柊鏃堕棿' },
- { key: 'memo', label: '澶囨敞' }
+ { key: 'asnCode', label: $t('pages.orders.asnOrderItemLog.table.asnCode') },
+ { key: 'platItemId', label: $t('pages.orders.asnOrderItemLog.table.platItemId') },
+ { key: 'poDetlId', label: $t('pages.orders.asnOrderItemLog.table.poDetlId') },
+ { key: 'poCode', label: $t('pages.orders.asnOrderItemLog.table.poCode') },
+ { key: 'fieldsIndex', label: $t('pages.orders.asnOrderItemLog.table.fieldsIndex') },
+ { key: 'matnrCode', label: $t('pages.orders.asnOrderItemLog.table.matnrCode') },
+ { key: 'maktx', label: $t('pages.orders.asnOrderItemLog.table.maktx') },
+ { key: 'anfme', label: $t('pages.orders.asnOrderItemLog.table.anfme') },
+ { key: 'stockUnit', label: $t('pages.orders.asnOrderItemLog.table.stockUnit') },
+ { key: 'purQty', label: $t('pages.orders.asnOrderItemLog.table.purQty') },
+ { key: 'purUnit', label: $t('pages.orders.asnOrderItemLog.table.purUnit') },
+ { key: 'qty', label: $t('pages.orders.asnOrderItemLog.table.qty') },
+ { key: 'splrCode', label: $t('pages.orders.asnOrderItemLog.table.splrCode') },
+ { key: 'splrBatch', label: $t('pages.orders.asnOrderItemLog.table.splrBatch') },
+ { key: 'splrName', label: $t('pages.orders.asnOrderItemLog.table.splrName') },
+ { key: 'qrcode', label: $t('pages.orders.asnOrderItemLog.table.qrcode') },
+ { key: 'trackCode', label: $t('pages.orders.asnOrderItemLog.table.trackCode') },
+ { key: 'barcode', label: $t('pages.orders.asnOrderItemLog.table.barcode') },
+ { key: 'packName', label: $t('pages.orders.asnOrderItemLog.table.packName') },
+ { key: 'ntyStatusText', label: $t('pages.orders.asnOrderItemLog.table.ntyStatus') },
+ { key: 'statusText', label: $t('table.status') },
+ { key: 'updateByText', label: $t('table.updateBy') },
+ { key: 'updateTimeText', label: $t('table.updateTime') },
+ { key: 'memo', label: $t('table.memo') }
]
}
diff --git a/rsf-design/src/views/orders/asn-order-item-log/index.vue b/rsf-design/src/views/orders/asn-order-item-log/index.vue
index 68187eb..26a26a0 100644
--- a/rsf-design/src/views/orders/asn-order-item-log/index.vue
+++ b/rsf-design/src/views/orders/asn-order-item-log/index.vue
@@ -44,6 +44,7 @@
<script setup>
import { computed, ref } from 'vue'
import { useRoute } from 'vue-router'
+ import { useI18n } from 'vue-i18n'
import { useUserStore } from '@/store/modules/user'
import { useTable } from '@/hooks/core/useTable'
import { defaultResponseAdapter } from '@/utils/table/tableUtils'
@@ -69,6 +70,7 @@
} from './asnOrderItemLogPage.helpers.js'
defineOptions({ name: 'AsnOrderItemLog' })
+ const { t } = useI18n()
const route = useRoute()
const userStore = useUserStore()
@@ -85,79 +87,79 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('pages.orders.asnOrderItemLog.search.condition'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏SN鍗曞彿/PO鍗曞彿/鐗╂枡缂栫爜'
+ placeholder: t('pages.orders.asnOrderItemLog.search.conditionPlaceholder')
}
},
{
- label: '鏃ュ織ID',
+ label: t('pages.orders.asnOrderItemLog.search.logId'),
key: 'logId',
type: 'inputNumber',
props: {
clearable: true,
controlsPosition: 'right',
- placeholder: '璇疯緭鍏ユ棩蹇桰D'
+ placeholder: t('pages.orders.asnOrderItemLog.search.logIdPlaceholder')
}
},
{
- label: 'ASN鍗曞彿',
+ label: t('pages.orders.asnOrderItemLog.table.asnCode'),
key: 'orderCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏SN鍗曞彿'
+ placeholder: t('pages.orders.asnOrderItemLog.search.asnCodePlaceholder')
}
},
{
- label: 'PO鍗曞彿',
+ label: t('pages.orders.asnOrderItemLog.table.poCode'),
key: 'poCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏O鍗曞彿'
+ placeholder: t('pages.orders.asnOrderItemLog.search.poCodePlaceholder')
}
},
{
- label: '鐗╂枡缂栫爜',
+ label: t('pages.orders.asnOrderItemLog.table.matnrCode'),
key: 'matnrCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+ placeholder: t('pages.orders.asnOrderItemLog.search.matnrCodePlaceholder')
}
},
{
- label: '鐗╂枡鍚嶇О',
+ label: t('pages.orders.asnOrderItemLog.table.maktx'),
key: 'maktx',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+ placeholder: t('pages.orders.asnOrderItemLog.search.maktxPlaceholder')
}
},
{
- label: '渚涘簲鍟嗘壒娆�',
+ label: t('pages.orders.asnOrderItemLog.table.splrBatch'),
key: 'splrBatch',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヤ緵搴斿晢鎵规'
+ placeholder: t('pages.orders.asnOrderItemLog.search.splrBatchPlaceholder')
}
},
{
- label: '涓婃姤鐘舵��',
+ label: t('pages.orders.asnOrderItemLog.table.ntyStatus'),
key: 'ntyStatus',
type: 'select',
props: {
clearable: true,
options: [
- { label: '鏈笂鎶�', value: 0 },
- { label: '宸蹭笂鎶�', value: 1 },
- { label: '閮ㄥ垎涓婃姤', value: 2 }
+ { label: t('pages.orders.asnOrderItemLog.status.notReported'), value: 0 },
+ { label: t('pages.orders.asnOrderItemLog.status.reported'), value: 1 },
+ { label: t('pages.orders.asnOrderItemLog.status.partialReported'), value: 2 }
]
}
}
@@ -235,8 +237,8 @@
buildPreviewRows: (records) => buildAsnOrderItemLogPrintRows(records),
buildPreviewMeta: (rows) => ({
reportTitle,
- reportDate: new Date().toLocaleDateString('zh-CN'),
- printedAt: new Date().toLocaleString('zh-CN', { hour12: false }),
+ reportDate: new Date().toLocaleDateString(),
+ printedAt: new Date().toLocaleString([], { hour12: false }),
operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
count: rows.length,
reportStyle: {
diff --git a/rsf-design/src/views/orders/asn-order-item/asnOrderItemPage.helpers.js b/rsf-design/src/views/orders/asn-order-item/asnOrderItemPage.helpers.js
index dbf84a9..4491350 100644
--- a/rsf-design/src/views/orders/asn-order-item/asnOrderItemPage.helpers.js
+++ b/rsf-design/src/views/orders/asn-order-item/asnOrderItemPage.helpers.js
@@ -1,4 +1,9 @@
-export const ASN_ORDER_ITEM_REPORT_TITLE = '鏀惰揣鏄庣粏鎶ヨ〃'
+import { $t } from '@/locales'
+
+export function getAsnOrderItemReportTitle(t = $t) {
+ return t('pages.orders.asnOrderItem.reportTitle')
+}
+
export const ASN_ORDER_ITEM_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
@@ -7,17 +12,7 @@
showSequence: true
}
-const STATUS_MAP = {
- 1: { label: '姝e父', tagType: 'success' },
- 0: { label: '鍐荤粨', tagType: 'info' }
-}
-
-const NTY_STATUS_MAP = {
- 0: { label: '鏈笂鎶�', tagType: 'info' },
- 1: { label: '宸蹭笂鎶�', tagType: 'success' }
-}
-
-function normalizeText(value, fallback = '-') {
+function normalizeText(value, fallback = $t('common.placeholder.empty')) {
if (value === null || value === undefined || value === '') {
return fallback
}
@@ -59,20 +54,32 @@
}
}
-function getOrderTypeLabel(type) {
- if (type === 'in') return '鍏ュ簱'
- if (type === 'out') return '鍑哄簱'
- return normalizeText(type, '-')
+function getOrderTypeLabel(type, t = $t) {
+ if (type === 'in') return t('pages.orders.asnOrderItem.orderType.in')
+ if (type === 'out') return t('pages.orders.asnOrderItem.orderType.out')
+ return normalizeText(type)
}
-function getStatusConfig(status) {
+function getStatusConfig(status, t = $t) {
const numericStatus = Number(status)
- return STATUS_MAP[numericStatus] || { label: normalizeText(status, '-'), tagType: 'info' }
+ if (numericStatus === 1) {
+ return { label: t('common.status.normal'), tagType: 'success' }
+ }
+ if (numericStatus === 0) {
+ return { label: t('common.status.frozen'), tagType: 'info' }
+ }
+ return { label: normalizeText(status), tagType: 'info' }
}
-function getNtyStatusConfig(status) {
+function getNtyStatusConfig(status, t = $t) {
const numericStatus = Number(status)
- return NTY_STATUS_MAP[numericStatus] || { label: normalizeText(status, '-'), tagType: 'info' }
+ if (numericStatus === 0) {
+ return { label: t('pages.orders.asnOrderItem.ntyStatus.notReported'), tagType: 'info' }
+ }
+ if (numericStatus === 1) {
+ return { label: t('pages.orders.asnOrderItem.ntyStatus.reported'), tagType: 'success' }
+ }
+ return { label: normalizeText(status), tagType: 'info' }
}
export function createAsnOrderItemSearchState() {
@@ -147,76 +154,76 @@
}
}
-export function normalizeAsnOrderItemRow(record = {}) {
+export function normalizeAsnOrderItemRow(record = {}, t = $t) {
return {
...record,
id: record.id ?? null,
- poCode: normalizeText(record.poCode, '-'),
- typeLabel: getOrderTypeLabel(record.type),
- wkTypeLabel: normalizeText(record['wkType$'] || record.wkType, '-'),
- purchaseOrgName: normalizeText(record.purchaseOrgName, '-'),
- purchaseUserName: normalizeText(record.purchaseUserName, '-'),
- supplierId: normalizeText(record.supplierId, '-'),
- supplierName: normalizeText(record.supplierName, '-'),
- platWorkCode: normalizeText(record.platWorkCode, '-'),
- platItemId: normalizeText(record.platItemId, '-'),
- matnrCode: normalizeText(record.matnrCode, '-'),
- maktx: normalizeText(record.maktx, '-'),
- batch: normalizeText(record.batch, '-'),
- stockUnit: normalizeText(record.stockUnit, '-'),
+ poCode: normalizeText(record.poCode),
+ typeLabel: getOrderTypeLabel(record.type, t),
+ wkTypeLabel: normalizeText(record['wkType$'] || record.wkType),
+ purchaseOrgName: normalizeText(record.purchaseOrgName),
+ purchaseUserName: normalizeText(record.purchaseUserName),
+ supplierId: normalizeText(record.supplierId),
+ supplierName: normalizeText(record.supplierName),
+ platWorkCode: normalizeText(record.platWorkCode),
+ platItemId: normalizeText(record.platItemId),
+ matnrCode: normalizeText(record.matnrCode),
+ maktx: normalizeText(record.maktx),
+ batch: normalizeText(record.batch),
+ stockUnit: normalizeText(record.stockUnit),
anfme: normalizeNumber(record.anfme),
qty: normalizeNumber(record.qty),
- targetWarehouseId: normalizeText(record.targetWarehouseId, '-'),
- businessTimeText: normalizeText(record.businessTime, '-'),
- updateTimeText: normalizeText(record.updateTime, '-'),
- memo: normalizeText(record.memo, '-')
+ targetWarehouseId: normalizeText(record.targetWarehouseId),
+ businessTimeText: normalizeText(record.businessTime),
+ updateTimeText: normalizeText(record.updateTime),
+ memo: normalizeText(record.memo)
}
}
-export function normalizeAsnOrderItemDetail(record = {}) {
- const statusConfig = getStatusConfig(record.status)
- const ntyStatusConfig = getNtyStatusConfig(record.ntyStatus)
+export function normalizeAsnOrderItemDetail(record = {}, t = $t) {
+ const statusConfig = getStatusConfig(record.status, t)
+ const ntyStatusConfig = getNtyStatusConfig(record.ntyStatus, t)
return {
...record,
id: record.id ?? null,
- orderCode: normalizeText(record.orderCode, '-'),
- poCode: normalizeText(record.poCode, '-'),
- typeLabel: getOrderTypeLabel(record.type),
- poDetlId: record.poDetlId ?? '-',
- platWorkCode: normalizeText(record.platWorkCode, '-'),
- platItemId: normalizeText(record.platItemId, '-'),
- projectCode: normalizeText(record.projectCode, '-'),
- matnrCode: normalizeText(record.matnrCode, '-'),
- maktx: normalizeText(record.maktx, '-'),
- spec: normalizeText(record.spec, '-'),
- model: normalizeText(record.model, '-'),
- batch: normalizeText(record.batch, '-'),
- stockUnit: normalizeText(record.stockUnit, '-'),
+ orderCode: normalizeText(record.orderCode),
+ poCode: normalizeText(record.poCode),
+ typeLabel: getOrderTypeLabel(record.type, t),
+ poDetlId: record.poDetlId ?? $t('common.placeholder.empty'),
+ platWorkCode: normalizeText(record.platWorkCode),
+ platItemId: normalizeText(record.platItemId),
+ projectCode: normalizeText(record.projectCode),
+ matnrCode: normalizeText(record.matnrCode),
+ maktx: normalizeText(record.maktx),
+ spec: normalizeText(record.spec),
+ model: normalizeText(record.model),
+ batch: normalizeText(record.batch),
+ stockUnit: normalizeText(record.stockUnit),
purQty: normalizeNumber(record.purQty),
- purUnit: normalizeText(record.purUnit, '-'),
+ purUnit: normalizeText(record.purUnit),
anfme: normalizeNumber(record.anfme),
qty: normalizeNumber(record.qty),
workQty: normalizeNumber(record.workQty),
- splrCode: normalizeText(record.splrCode, '-'),
- splrName: normalizeText(record.splrName, '-'),
- splrBatch: normalizeText(record.splrBatch, '-'),
- qrcode: normalizeText(record.qrcode, '-'),
- barcode: normalizeText(record.barcode, '-'),
- packName: normalizeText(record.packName, '-'),
- prodTimeText: normalizeText(record.prodTime, '-'),
- targetWarehouseId: normalizeText(record.targetWarehouseId, '-'),
- sourceWarehouseId: normalizeText(record.sourceWarehouseId, '-'),
+ splrCode: normalizeText(record.splrCode),
+ splrName: normalizeText(record.splrName),
+ splrBatch: normalizeText(record.splrBatch),
+ qrcode: normalizeText(record.qrcode),
+ barcode: normalizeText(record.barcode),
+ packName: normalizeText(record.packName),
+ prodTimeText: normalizeText(record.prodTime),
+ targetWarehouseId: normalizeText(record.targetWarehouseId),
+ sourceWarehouseId: normalizeText(record.sourceWarehouseId),
ntyStatusText: ntyStatusConfig.label,
ntyStatusTagType: ntyStatusConfig.tagType,
statusText: statusConfig.label,
statusTagType: statusConfig.tagType,
- isptResultText: normalizeText(record['isptResult$'] || record.isptResult, '-'),
- updateByText: normalizeText(record['updateBy$'] || record.updateBy, '-'),
- updateTimeText: normalizeText(record['updateTime$'] || record.updateTime, '-'),
- createByText: normalizeText(record['createBy$'] || record.createBy, '-'),
- createTimeText: normalizeText(record['createTime$'] || record.createTime, '-'),
- memo: normalizeText(record.memo, '-'),
+ isptResultText: normalizeText(record['isptResult$'] || record.isptResult),
+ updateByText: normalizeText(record['updateBy$'] || record.updateBy),
+ updateTimeText: normalizeText(record['updateTime$'] || record.updateTime),
+ createByText: normalizeText(record['createBy$'] || record.createBy),
+ createTimeText: normalizeText(record['createTime$'] || record.createTime),
+ memo: normalizeText(record.memo),
extendFields: record.extendFields || {}
}
}
@@ -234,7 +241,7 @@
orientation = ASN_ORDER_ITEM_REPORT_STYLE.orientation
} = {}) {
return {
- reportTitle: ASN_ORDER_ITEM_REPORT_TITLE,
+ reportTitle: getAsnOrderItemReportTitle(),
reportDate: previewMeta.reportDate,
printedAt: previewMeta.printedAt,
operator: previewMeta.operator,
diff --git a/rsf-design/src/views/orders/asn-order-item/asnOrderItemTable.columns.js b/rsf-design/src/views/orders/asn-order-item/asnOrderItemTable.columns.js
index 3306ced..8894168 100644
--- a/rsf-design/src/views/orders/asn-order-item/asnOrderItemTable.columns.js
+++ b/rsf-design/src/views/orders/asn-order-item/asnOrderItemTable.columns.js
@@ -1,5 +1,6 @@
import { h } from 'vue'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
function createTextColumn(prop, label, minWidth, { align, formatter } = {}) {
return {
@@ -8,52 +9,52 @@
minWidth,
align,
showOverflowTooltip: true,
- formatter: formatter || ((row) => row?.[prop] || '-')
+ formatter: formatter || ((row) => row?.[prop] || $t('common.placeholder.empty'))
}
}
-export function createAsnOrderItemTableColumns({ handleView } = {}) {
+export function createAsnOrderItemTableColumns({ handleView, t = $t } = {}) {
return [
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
- createTextColumn('poCode', 'PO鍗曞彿', 160),
- createTextColumn('wkTypeLabel', '涓氬姟绫诲瀷', 120),
- createTextColumn('typeLabel', '鍗曟嵁绫诲瀷', 110),
- createTextColumn('purchaseOrgName', '閲囪喘缁勭粐', 150),
- createTextColumn('purchaseUserName', '閲囪喘鍛�', 120),
- createTextColumn('supplierName', '渚涘簲鍟�', 160),
- createTextColumn('platWorkCode', '璁″垝璺熻釜鍙�', 150),
- createTextColumn('platItemId', '琛屽彿', 110),
- createTextColumn('matnrCode', '鐗╂枡缂栫爜', 160),
- createTextColumn('maktx', '鐗╂枡鍚嶇О', 220),
- createTextColumn('batch', '渚涘簲鍟嗘壒娆�', 140),
- createTextColumn('stockUnit', '搴撳瓨鍗曚綅', 110),
+ { type: 'globalIndex', label: t('table.index'), width: 72, align: 'center' },
+ createTextColumn('poCode', t('pages.orders.asnOrderItem.table.poCode'), 160),
+ createTextColumn('wkTypeLabel', t('pages.orders.asnOrderItem.table.wkType'), 120),
+ createTextColumn('typeLabel', t('pages.orders.asnOrderItem.table.type'), 110),
+ createTextColumn('purchaseOrgName', t('pages.orders.asnOrderItem.table.purchaseOrg'), 150),
+ createTextColumn('purchaseUserName', t('pages.orders.asnOrderItem.table.purchaseUser'), 120),
+ createTextColumn('supplierName', t('table.supplier'), 160),
+ createTextColumn('platWorkCode', t('pages.orders.asnOrderItem.table.platWorkCode'), 150),
+ createTextColumn('platItemId', t('pages.orders.asnOrderItem.table.platItemId'), 110),
+ createTextColumn('matnrCode', t('table.materialCode'), 160),
+ createTextColumn('maktx', t('table.materialName'), 220),
+ createTextColumn('batch', t('table.supplierBatch'), 140),
+ createTextColumn('stockUnit', t('pages.orders.asnOrderItem.table.stockUnit'), 110),
{
prop: 'anfme',
- label: '閫佽揣鏁伴噺',
+ label: t('pages.orders.asnOrderItem.table.anfme'),
width: 110,
align: 'right',
formatter: (row) => row.anfme ?? 0
},
{
prop: 'qty',
- label: '宸叉敹鏁伴噺',
+ label: t('pages.orders.asnOrderItem.table.qty'),
width: 110,
align: 'right',
formatter: (row) => row.qty ?? 0
},
- createTextColumn('targetWarehouseId', '寤鸿鐩爣浠�', 140),
- createTextColumn('businessTimeText', '涓氬姟鏃堕棿', 180),
- createTextColumn('updateTimeText', '鏇存柊鏃堕棿', 180),
+ createTextColumn('targetWarehouseId', t('pages.orders.asnOrderItem.table.targetWarehouseId'), 140),
+ createTextColumn('businessTimeText', t('pages.orders.asnOrderItem.table.businessTime'), 180),
+ createTextColumn('updateTimeText', t('table.updateTime'), 180),
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: t('table.operation'),
width: 110,
fixed: 'right',
- align: 'right',
+ align: 'center',
formatter: (row) =>
h(
'div',
- { class: 'flex justify-end' },
+ { class: 'flex justify-center' },
[
h(ArtButtonTable, {
type: 'view',
diff --git a/rsf-design/src/views/orders/asn-order-item/index.vue b/rsf-design/src/views/orders/asn-order-item/index.vue
index a10b8b2..91fe80f 100644
--- a/rsf-design/src/views/orders/asn-order-item/index.vue
+++ b/rsf-design/src/views/orders/asn-order-item/index.vue
@@ -3,10 +3,10 @@
<ElCard v-if="activeSourceSummary" class="mb-3">
<div class="flex items-center justify-between gap-3">
<div class="flex items-center gap-2 text-sm text-[var(--art-text-gray-600)]">
- <span class="font-medium text-[var(--art-text-gray-900)]">褰撳墠鏉ユ簮</span>
- <span>鍏ュ簱閫氱煡鍗旾D锛歿{ activeSourceSummary.orderId }}</span>
+ <span class="font-medium text-[var(--art-text-gray-900)]">{{ t('pages.orders.asnOrderItem.sourceTitle') }}</span>
+ <span>{{ t('pages.orders.asnOrderItem.sourceLabel', { id: activeSourceSummary.orderId }) }}</span>
</div>
- <ElButton link type="primary" @click="handleClearSourceFilter">鏌ョ湅鍏ㄩ儴</ElButton>
+ <ElButton link type="primary" @click="handleClearSourceFilter">{{ t('common.actions.viewAll') }}</ElButton>
</div>
</ElCard>
@@ -60,6 +60,7 @@
<script setup>
import { computed, onMounted, ref, watch } from 'vue'
+ import { useI18n } from 'vue-i18n'
import { ElButton, ElMessage } from 'element-plus'
import { useRoute, useRouter } from 'vue-router'
import { useUserStore } from '@/store/modules/user'
@@ -77,12 +78,12 @@
import { createAsnOrderItemTableColumns } from './asnOrderItemTable.columns'
import {
ASN_ORDER_ITEM_REPORT_STYLE,
- ASN_ORDER_ITEM_REPORT_TITLE,
buildAsnOrderItemPageQueryParams,
buildAsnOrderItemPrintRows,
buildAsnOrderItemReportMeta,
buildAsnOrderItemSearchParams,
createAsnOrderItemSearchState,
+ getAsnOrderItemReportTitle,
normalizeAsnOrderItemDetail,
normalizeAsnOrderItemRow
} from './asnOrderItemPage.helpers'
@@ -91,10 +92,11 @@
const DEFAULT_PAGE_SIZE = 20
+ const { t } = useI18n()
const userStore = useUserStore()
const route = useRoute()
const router = useRouter()
- const reportTitle = ASN_ORDER_ITEM_REPORT_TITLE
+ const reportTitle = computed(() => getAsnOrderItemReportTitle(t))
const searchForm = ref(createAsnOrderItemSearchState())
const selectedRows = ref([])
const detailDrawerVisible = ref(false)
@@ -118,130 +120,130 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('table.keyword'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏� PO 鍗曞彿/鐗╂枡缂栫爜/鐗╂枡鍚嶇О/渚涘簲鍟�'
+ placeholder: t('pages.orders.asnOrderItem.search.conditionPlaceholder')
}
},
{
- label: 'PO鍗曞彿',
+ label: t('pages.orders.asnOrderItem.search.poCode'),
key: 'poCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏� PO 鍗曞彿'
+ placeholder: t('pages.orders.asnOrderItem.search.poCodePlaceholder')
}
},
{
- label: 'ASN鍗曞彿',
+ label: t('pages.orders.asnOrderItem.search.orderCode'),
key: 'orderCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏� ASN 鍗曞彿'
+ placeholder: t('pages.orders.asnOrderItem.search.orderCodePlaceholder')
}
},
{
- label: '璁″垝璺熻釜鍙�',
+ label: t('pages.orders.asnOrderItem.search.platWorkCode'),
key: 'platWorkCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヨ鍒掕窡韪彿'
+ placeholder: t('pages.orders.asnOrderItem.search.platWorkCodePlaceholder')
}
},
{
- label: '琛屽彿',
+ label: t('pages.orders.asnOrderItem.search.platItemId'),
key: 'platItemId',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヨ鍙�'
+ placeholder: t('pages.orders.asnOrderItem.search.platItemIdPlaceholder')
}
},
{
- label: '鐗╂枡缂栫爜',
+ label: t('table.materialCode'),
key: 'matnrCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+ placeholder: t('pages.orders.asnOrderItem.search.matnrCodePlaceholder')
}
},
{
- label: '鐗╂枡鍚嶇О',
+ label: t('table.materialName'),
key: 'maktx',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+ placeholder: t('pages.orders.asnOrderItem.search.maktxPlaceholder')
}
},
{
- label: '渚涘簲鍟嗘壒娆�',
+ label: t('table.supplierBatch'),
key: 'splrBatch',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヤ緵搴斿晢鎵规'
+ placeholder: t('pages.orders.asnOrderItem.search.splrBatchPlaceholder')
}
},
{
- label: '搴撳瓨鍗曚綅',
+ label: t('pages.orders.asnOrderItem.search.stockUnit'),
key: 'stockUnit',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ簱瀛樺崟浣�'
+ placeholder: t('pages.orders.asnOrderItem.search.stockUnitPlaceholder')
}
},
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: {
clearable: true,
options: [
- { label: '姝e父', value: 1 },
- { label: '鍐荤粨', value: 0 }
+ { label: t('common.status.normal'), value: 1 },
+ { label: t('common.status.frozen'), value: 0 }
]
}
},
{
- label: '涓婃姤鐘舵��',
+ label: t('pages.orders.asnOrderItem.search.ntyStatus'),
key: 'ntyStatus',
type: 'select',
props: {
clearable: true,
options: [
- { label: '鏈笂鎶�', value: 0 },
- { label: '宸蹭笂鎶�', value: 1 }
+ { label: t('pages.orders.asnOrderItem.ntyStatus.notReported'), value: 0 },
+ { label: t('pages.orders.asnOrderItem.ntyStatus.reported'), value: 1 }
]
}
},
{
- label: '鍒涘缓鏃堕棿',
+ label: t('pages.orders.asnOrderItem.search.createTimeRange'),
key: 'createTimeRange',
type: 'datetimerange',
props: {
clearable: true,
- startPlaceholder: '寮�濮嬫椂闂�',
- endPlaceholder: '缁撴潫鏃堕棿',
- rangeSeparator: '鑷�'
+ startPlaceholder: t('pages.orders.asnOrderItem.search.startTime'),
+ endPlaceholder: t('pages.orders.asnOrderItem.search.endTime'),
+ rangeSeparator: t('pages.orders.asnOrderItem.search.rangeSeparator')
}
},
{
- label: '鏇存柊鏃堕棿',
+ label: t('pages.orders.asnOrderItem.search.updateTimeRange'),
key: 'updateTimeRange',
type: 'datetimerange',
props: {
clearable: true,
- startPlaceholder: '寮�濮嬫椂闂�',
- endPlaceholder: '缁撴潫鏃堕棿',
- rangeSeparator: '鑷�'
+ startPlaceholder: t('pages.orders.asnOrderItem.search.startTime'),
+ endPlaceholder: t('pages.orders.asnOrderItem.search.endTime'),
+ rangeSeparator: t('pages.orders.asnOrderItem.search.rangeSeparator')
}
}
])
@@ -268,12 +270,13 @@
}),
columnsFactory: () =>
createAsnOrderItemTableColumns({
- handleView: openDetail
+ handleView: openDetail,
+ t
})
},
transform: {
dataTransformer: (records) =>
- Array.isArray(records) ? records.map((item) => normalizeAsnOrderItemRow(item)) : []
+ Array.isArray(records) ? records.map((item) => normalizeAsnOrderItemRow(item, t)) : []
}
})
@@ -324,7 +327,7 @@
async function openDetail(row) {
activeItemId.value = row.id
- detailData.value = normalizeAsnOrderItemDetail(row)
+ detailData.value = normalizeAsnOrderItemDetail(row, t)
detailDrawerVisible.value = true
await loadDetailResource()
}
@@ -340,18 +343,18 @@
fetchGetAsnOrderItemDetail(activeItemId.value),
{},
{
- timeoutMessage: '鏀惰揣鏄庣粏璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.orders.asnOrderItem.messages.detailTimeout')
}
)
detailData.value = normalizeAsnOrderItemDetail({
...detailData.value,
...detailResponse
- })
+ }, t)
} catch (error) {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇鏀惰揣鏄庣粏璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.orders.asnOrderItem.messages.detailFailed'))
} finally {
detailLoading.value = false
}
@@ -370,7 +373,7 @@
),
{ records: [], total: 0, current: 1, size: reportPageSize },
{
- timeoutMessage: '鏀惰揣鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.orders.asnOrderItem.messages.pageTimeout')
}
)
@@ -393,7 +396,7 @@
.filter((id) => id !== undefined && id !== null)
if (ids.length === 0) {
- throw new Error('鏆傛棤鍙鍑虹殑鏁版嵁')
+ throw new Error(t('pages.orders.asnOrderItem.messages.noExportData'))
}
return fetchExportAsnOrderItemReport(
@@ -410,7 +413,7 @@
buildPreviewMeta: (rows) => {
const now = new Date()
return {
- reportTitle,
+ reportTitle: reportTitle.value,
reportDate: now.toLocaleDateString('zh-CN'),
printedAt: now.toLocaleString('zh-CN', { hour12: false }),
operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
diff --git a/rsf-design/src/views/orders/asn-order-item/modules/asn-order-item-detail-drawer.vue b/rsf-design/src/views/orders/asn-order-item/modules/asn-order-item-detail-drawer.vue
index edd2178..48db213 100644
--- a/rsf-design/src/views/orders/asn-order-item/modules/asn-order-item-detail-drawer.vue
+++ b/rsf-design/src/views/orders/asn-order-item/modules/asn-order-item-detail-drawer.vue
@@ -1,7 +1,7 @@
<template>
<ElDrawer
:model-value="visible"
- title="鏀惰揣鏄庣粏璇︽儏"
+ :title="t('pages.orders.asnOrderItem.detail.title')"
size="1180px"
destroy-on-close
@update:model-value="handleVisibleChange"
@@ -11,62 +11,62 @@
<ElSkeleton :rows="12" animated />
</div>
<div v-else class="space-y-4">
- <ElDescriptions title="鍩虹淇℃伅" :column="2" border>
- <ElDescriptionsItem label="PO鍗曞彿">{{ detail.poCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="ASN鍗曞彿">{{ detail.orderCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="涓氬姟绫诲瀷">{{ detail.wkTypeLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍗曟嵁绫诲瀷">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閲囪喘缁勭粐">{{ detail.purchaseOrgName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閲囪喘鍛�">{{ detail.purchaseUserName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟咺D">{{ detail.supplierId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟嗗悕绉�">{{ detail.supplierName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="涓氬姟鏃堕棿">{{ detail.businessTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="寤鸿鐩爣浠�">{{ detail.targetWarehouseId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">
+ <ElDescriptions :title="t('pages.orders.asnOrderItem.detail.baseInfo')" :column="2" border>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.poCode')">{{ detail.poCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.orderCode')">{{ detail.orderCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.wkType')">{{ detail.wkTypeLabel || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.orderType')">{{ detail.typeLabel || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.purchaseOrg')">{{ detail.purchaseOrgName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.purchaseUser')">{{ detail.purchaseUserName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.supplierId')">{{ detail.supplierId || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.supplierName')">{{ detail.supplierName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.businessTime')">{{ detail.businessTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.targetWarehouseId')">{{ detail.targetWarehouseId || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.status')">
<ElTag :type="detail.statusTagType || 'info'" effect="light">
- {{ detail.statusText || '--' }}
+ {{ detail.statusText || t('common.placeholder.empty') }}
</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="涓婃姤鐘舵��">
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.ntyStatus')">
<ElTag :type="detail.ntyStatusTagType || 'info'" effect="light">
- {{ detail.ntyStatusText || '--' }}
+ {{ detail.ntyStatusText || t('common.placeholder.empty') }}
</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.memo')" :span="2">{{ detail.memo || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
- <ElDescriptions title="鏄庣粏淇℃伅" :column="2" border>
- <ElDescriptionsItem label="璁″垝琛屽彿">{{ detail.platItemId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="璁″垝璺熻釜鍙�">{{ detail.platWorkCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="瑙勬牸">{{ detail.spec || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍨嬪彿">{{ detail.model || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟嗘壒娆�">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏉″舰鐮�">{{ detail.barcode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浜岀淮鐮�">{{ detail.qrcode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍖呰鍚嶇О">{{ detail.packName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撳瓨鍗曚綅">{{ detail.stockUnit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閲囪喘鍗曚綅">{{ detail.purUnit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閫佽揣鏁伴噺">{{ detail.anfme ?? 0 }}</ElDescriptionsItem>
- <ElDescriptionsItem label="宸叉敹鏁伴噺">{{ detail.qty ?? 0 }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閲囪喘鏁伴噺">{{ detail.purQty ?? 0 }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐢熶骇鏃ユ湡">{{ detail.prodTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="璐ㄦ缁撴灉">{{ detail.isptResultText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏉ユ簮浠撳簱">{{ detail.sourceWarehouseId || '--' }}</ElDescriptionsItem>
+ <ElDescriptions :title="t('pages.orders.asnOrderItem.detail.itemInfo')" :column="2" border>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.platItemId')">{{ detail.platItemId || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.platWorkCode')">{{ detail.platWorkCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.materialCode')">{{ detail.matnrCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.materialName')">{{ detail.maktx || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.spec')">{{ detail.spec || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.model')">{{ detail.model || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.supplierBatch')">{{ detail.splrBatch || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.barcode')">{{ detail.barcode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.qrcode')">{{ detail.qrcode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.packName')">{{ detail.packName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.stockUnit')">{{ detail.stockUnit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.purUnit')">{{ detail.purUnit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.anfme')">{{ detail.anfme ?? 0 }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.qty')">{{ detail.qty ?? 0 }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.purQty')">{{ detail.purQty ?? 0 }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.prodTime')">{{ detail.prodTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.isptResult')">{{ detail.isptResultText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.sourceWarehouseId')">{{ detail.sourceWarehouseId || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
- <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptions :title="t('pages.orders.asnOrderItem.detail.auditInfo')" :column="2" border>
+ <ElDescriptionsItem :label="t('table.createBy')">{{ detail.createByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateBy')">{{ detail.updateByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
<ElDescriptions
v-if="Object.keys(detail.extendFields || {}).length > 0"
- title="鎵╁睍瀛楁"
+ :title="t('pages.orders.asnOrderItem.detail.extendFields')"
:column="2"
border
>
@@ -85,6 +85,9 @@
<script setup>
import { computed } from 'vue'
+ import { useI18n } from 'vue-i18n'
+
+ const { t } = useI18n()
defineOptions({ name: 'AsnOrderItemDetailDrawer' })
diff --git a/rsf-design/src/views/orders/asn-order-log/asnOrderLogTable.columns.js b/rsf-design/src/views/orders/asn-order-log/asnOrderLogTable.columns.js
index 417d2ae..9ecb695 100644
--- a/rsf-design/src/views/orders/asn-order-log/asnOrderLogTable.columns.js
+++ b/rsf-design/src/views/orders/asn-order-log/asnOrderLogTable.columns.js
@@ -1,6 +1,7 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
function buildTagRenderer(textKey, typeKey) {
return (row) =>
@@ -17,122 +18,122 @@
export function createAsnOrderLogTableColumns({ handleView } = {}) {
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
{
prop: 'code',
- label: 'ASN鍗曞彿',
+ label: $t('pages.orders.asnOrderItemLog.table.asnCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.code || '--'
},
{
prop: 'poCode',
- label: 'PO鍗曞彿',
+ label: $t('pages.orders.asnOrderItemLog.table.poCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.poCode || '--'
},
{
prop: 'poId',
- label: 'PO鍗旾D',
+ label: $t('pages.orders.asnOrderLog.table.poId'),
width: 110,
align: 'right',
formatter: (row) => row.poId ?? '--'
},
{
prop: 'typeText',
- label: '鍗曟嵁绫诲瀷',
+ label: $t('pages.orders.asnOrderLog.table.type'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.typeText || '--'
},
{
prop: 'wkTypeText',
- label: '涓氬姟绫诲瀷',
+ label: $t('pages.orders.asnOrderLog.table.wkType'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.wkTypeText || '--'
},
{
prop: 'anfme',
- label: '閫佽揣鏁伴噺',
+ label: $t('pages.orders.asnOrderLog.table.anfme'),
width: 110,
align: 'right',
formatter: (row) => row.anfme ?? '--'
},
{
prop: 'qty',
- label: '宸叉敹鏁伴噺',
+ label: $t('pages.orders.asnOrderLog.table.qty'),
width: 110,
align: 'right',
formatter: (row) => row.qty ?? '--'
},
{
prop: 'logisNo',
- label: '鐗╂祦鍗曞彿',
+ label: $t('pages.orders.asnOrderLog.table.logisNo'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.logisNo || '--'
},
{
prop: 'arrTimeText',
- label: '棰勮鍒拌揪鏃堕棿',
+ label: $t('pages.orders.asnOrderLog.table.arrTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.arrTimeText || '--'
},
{
prop: 'rleStatusText',
- label: '閲婃斁鐘舵��',
+ label: $t('pages.orders.asnOrderLog.table.rleStatus'),
width: 110,
align: 'center',
formatter: buildTagRenderer('rleStatusText', 'rleStatusTagType')
},
{
prop: 'ntyStatusText',
- label: '涓婃姤鐘舵��',
+ label: $t('pages.orders.asnOrderItemLog.table.ntyStatus'),
width: 110,
align: 'center',
formatter: buildTagRenderer('ntyStatusText', 'ntyStatusTagType')
},
{
prop: 'exceStatusText',
- label: '鎵ц鐘舵��',
+ label: $t('pages.orders.asnOrderLog.table.exceStatus'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.exceStatusText || '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 96,
align: 'center',
formatter: buildTagRenderer('statusText', 'statusType')
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: $t('table.memo'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 92,
align: 'center',
fixed: 'right',
@@ -147,164 +148,164 @@
export function createAsnOrderItemLogColumns() {
return [
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
{
prop: 'asnCode',
- label: 'ASN鍗曞彿',
+ label: $t('pages.orders.asnOrderItemLog.table.asnCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.asnCode || '--'
},
{
prop: 'platItemId',
- label: '骞冲彴琛屽彿',
+ label: $t('pages.orders.asnOrderItemLog.table.platItemId'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.platItemId || '--'
},
{
prop: 'poDetlId',
- label: 'PO鍗曟槑缁咺D',
+ label: $t('pages.orders.asnOrderItemLog.table.poDetlId'),
width: 120,
align: 'right',
formatter: (row) => row.poDetlId ?? '--'
},
{
prop: 'poCode',
- label: 'PO鍗曞彿',
+ label: $t('pages.orders.asnOrderItemLog.table.poCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.poCode || '--'
},
{
prop: 'fieldsIndex',
- label: '鍔ㄦ�佸瓧娈电储寮�',
+ label: $t('pages.orders.asnOrderItemLog.table.fieldsIndex'),
minWidth: 130,
showOverflowTooltip: true,
formatter: (row) => row.fieldsIndex || '--'
},
{
prop: 'matnrCode',
- label: '鐗╂枡缂栫爜',
+ label: $t('pages.orders.asnOrderItemLog.table.matnrCode'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.matnrCode || '--'
},
{
prop: 'maktx',
- label: '鐗╂枡鍚嶇О',
+ label: $t('pages.orders.asnOrderItemLog.table.maktx'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.maktx || '--'
},
{
prop: 'anfme',
- label: '閫佽揣鏁伴噺',
+ label: $t('pages.orders.asnOrderItemLog.table.anfme'),
width: 110,
align: 'right',
formatter: (row) => row.anfme ?? '--'
},
{
prop: 'stockUnit',
- label: '搴撳瓨鍗曚綅',
+ label: $t('pages.orders.asnOrderItemLog.table.stockUnit'),
width: 100,
align: 'center',
formatter: (row) => row.stockUnit || '--'
},
{
prop: 'purQty',
- label: '閲囪喘鏁伴噺',
+ label: $t('pages.orders.asnOrderItemLog.table.purQty'),
width: 110,
align: 'right',
formatter: (row) => row.purQty ?? '--'
},
{
prop: 'purUnit',
- label: '閲囪喘鍗曚綅',
+ label: $t('pages.orders.asnOrderItemLog.table.purUnit'),
width: 100,
align: 'center',
formatter: (row) => row.purUnit || '--'
},
{
prop: 'qty',
- label: '宸叉敹鏁伴噺',
+ label: $t('pages.orders.asnOrderItemLog.table.qty'),
width: 110,
align: 'right',
formatter: (row) => row.qty ?? '--'
},
{
prop: 'splrCode',
- label: '渚涘簲鍟嗙紪鐮�',
+ label: $t('pages.orders.asnOrderItemLog.table.splrCode'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.splrCode || '--'
},
{
prop: 'splrBatch',
- label: '渚涘簲鍟嗘壒娆�',
+ label: $t('pages.orders.asnOrderItemLog.table.splrBatch'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.splrBatch || '--'
},
{
prop: 'splrName',
- label: '渚涘簲鍟嗗悕绉�',
+ label: $t('pages.orders.asnOrderItemLog.table.splrName'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.splrName || '--'
},
{
prop: 'qrcode',
- label: '浜岀淮鐮�',
+ label: $t('pages.orders.asnOrderItemLog.table.qrcode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.qrcode || '--'
},
{
prop: 'trackCode',
- label: '璺熻釜鐮�',
+ label: $t('pages.orders.asnOrderItemLog.table.trackCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.trackCode || '--'
},
{
prop: 'barcode',
- label: '鏉″舰鐮�',
+ label: $t('pages.orders.asnOrderItemLog.table.barcode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.barcode || '--'
},
{
prop: 'packName',
- label: '鍖呰鍚嶇О',
+ label: $t('pages.orders.asnOrderItemLog.table.packName'),
minWidth: 130,
showOverflowTooltip: true,
formatter: (row) => row.packName || '--'
},
{
prop: 'ntyStatusText',
- label: '涓婃姤鐘舵��',
+ label: $t('pages.orders.asnOrderItemLog.table.ntyStatus'),
width: 110,
align: 'center',
formatter: (row) => row.ntyStatusText || '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: $t('table.status'),
width: 96,
align: 'center',
formatter: (row) => row.statusText || '--'
},
{
prop: 'updateByText',
- label: '鏇存柊浜�',
+ label: $t('table.updateBy'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.updateByText || '--'
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: $t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
diff --git a/rsf-design/src/views/orders/asn-order/asnOrderPage.helpers.js b/rsf-design/src/views/orders/asn-order/asnOrderPage.helpers.js
index 3c58d73..1e3063d 100644
--- a/rsf-design/src/views/orders/asn-order/asnOrderPage.helpers.js
+++ b/rsf-design/src/views/orders/asn-order/asnOrderPage.helpers.js
@@ -1,22 +1,14 @@
import { $t } from '@/locales'
-export const ASN_ORDER_REPORT_TITLE = $t('pages.orders.asnOrder.reportTitle')
+export function getAsnOrderReportTitle(t = $t) {
+ return t('pages.orders.asnOrder.reportTitle')
+}
export const ASN_ORDER_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
orientation: 'landscape',
density: 'compact',
showSequence: true
-}
-
-const ASN_ORDER_STATUS_MAP = {
- 0: { label: $t('pages.orders.asnOrder.status.pending'), tagType: 'info' },
- 1: { label: $t('pages.orders.asnOrder.status.running'), tagType: 'warning' },
- 2: { label: $t('pages.orders.asnOrder.status.receiving'), tagType: 'success' },
- 3: { label: $t('pages.orders.asnOrder.status.taskRunning'), tagType: 'warning' },
- 4: { label: $t('pages.orders.asnOrder.status.completed'), tagType: 'success' },
- 8: { label: $t('pages.orders.asnOrder.status.cancelled'), tagType: 'danger' },
- 9: { label: $t('pages.orders.asnOrder.status.closed'), tagType: 'info' }
}
function normalizeText(value) {
@@ -39,9 +31,21 @@
return Number.isFinite(numericValue) ? numericValue : '-'
}
-function getStatusConfig(status, statusText) {
+function getAsnOrderStatusMap(t = $t) {
+ return {
+ 0: { label: t('pages.orders.asnOrder.status.pending'), tagType: 'info' },
+ 1: { label: t('pages.orders.asnOrder.status.running'), tagType: 'warning' },
+ 2: { label: t('pages.orders.asnOrder.status.receiving'), tagType: 'success' },
+ 3: { label: t('pages.orders.asnOrder.status.taskRunning'), tagType: 'warning' },
+ 4: { label: t('pages.orders.asnOrder.status.completed'), tagType: 'success' },
+ 8: { label: t('pages.orders.asnOrder.status.cancelled'), tagType: 'danger' },
+ 9: { label: t('pages.orders.asnOrder.status.closed'), tagType: 'info' }
+ }
+}
+
+function getStatusConfig(status, statusText, t = $t) {
const numericStatus = Number(status)
- const fallback = ASN_ORDER_STATUS_MAP[numericStatus] || {
+ const fallback = getAsnOrderStatusMap(t)[numericStatus] || {
label: statusText || '-',
tagType: 'info'
}
@@ -123,8 +127,8 @@
}
}
-export function normalizeAsnOrderRow(record = {}) {
- const statusConfig = getStatusConfig(record.exceStatus, record['exceStatus$'])
+export function normalizeAsnOrderRow(record = {}, t = $t) {
+ const statusConfig = getStatusConfig(record.exceStatus, record['exceStatus$'], t)
return {
...record,
id: record.id ?? null,
@@ -206,20 +210,21 @@
}
}
-export function buildAsnOrderPrintRows(records = []) {
+export function buildAsnOrderPrintRows(records = [], t = $t) {
if (!Array.isArray(records)) {
return []
}
- return records.map((record) => normalizeAsnOrderRow(record))
+ return records.map((record) => normalizeAsnOrderRow(record, t))
}
export function buildAsnOrderReportMeta({
previewMeta = {},
count = 0,
- orientation = ASN_ORDER_REPORT_STYLE.orientation
+ orientation = ASN_ORDER_REPORT_STYLE.orientation,
+ t = $t
} = {}) {
return {
- reportTitle: ASN_ORDER_REPORT_TITLE,
+ reportTitle: getAsnOrderReportTitle(t),
reportDate: previewMeta.reportDate,
printedAt: previewMeta.printedAt,
operator: previewMeta.operator,
@@ -231,8 +236,8 @@
}
}
-export function getAsnOrderStatusOptions() {
- return Object.entries(ASN_ORDER_STATUS_MAP).map(([value, item]) => ({
+export function getAsnOrderStatusOptions(t = $t) {
+ return Object.entries(getAsnOrderStatusMap(t)).map(([value, item]) => ({
label: item.label,
value: Number(value)
}))
diff --git a/rsf-design/src/views/orders/asn-order/index.vue b/rsf-design/src/views/orders/asn-order/index.vue
index 46584e1..1a23773 100644
--- a/rsf-design/src/views/orders/asn-order/index.vue
+++ b/rsf-design/src/views/orders/asn-order/index.vue
@@ -84,13 +84,13 @@
} from './asnOrderTable.columns'
import {
ASN_ORDER_REPORT_STYLE,
- ASN_ORDER_REPORT_TITLE,
buildAsnOrderDetailQueryParams,
buildAsnOrderPageQueryParams,
buildAsnOrderPrintRows,
buildAsnOrderReportMeta,
buildAsnOrderSearchParams,
createAsnOrderSearchState,
+ getAsnOrderReportTitle,
getAsnOrderStatusOptions,
normalizeAsnOrderItemRow,
normalizeAsnOrderRow
@@ -101,7 +101,7 @@
const userStore = useUserStore()
const router = useRouter()
const { t } = useI18n()
- const reportTitle = ASN_ORDER_REPORT_TITLE
+ const reportTitle = computed(() => getAsnOrderReportTitle(t))
const searchForm = ref(createAsnOrderSearchState())
const selectedRows = ref([])
const detailDrawerVisible = ref(false)
@@ -163,7 +163,7 @@
type: 'select',
props: {
clearable: true,
- options: getAsnOrderStatusOptions()
+ options: getAsnOrderStatusOptions(t)
}
},
{
@@ -189,7 +189,7 @@
async function openDetail(row) {
activeOrderId.value = row.id
activeOrderRow.value = row
- detailData.value = normalizeAsnOrderRow(row)
+ detailData.value = normalizeAsnOrderRow(row, t)
detailPagination.current = 1
detailDrawerVisible.value = true
await loadDetailResources()
@@ -270,7 +270,7 @@
},
transform: {
dataTransformer: (records) =>
- Array.isArray(records) ? records.map((item) => normalizeAsnOrderRow(item)) : []
+ Array.isArray(records) ? records.map((item) => normalizeAsnOrderRow(item, t)) : []
}
})
@@ -306,7 +306,7 @@
}
)
- detailData.value = normalizeAsnOrderRow(activeOrderRow.value || {})
+ detailData.value = normalizeAsnOrderRow(activeOrderRow.value || {}, t)
detailTableData.value = Array.isArray(itemResponse?.records)
? itemResponse.records.map((item) => normalizeAsnOrderItemRow(item))
: []
@@ -384,11 +384,11 @@
})
).records
},
- buildPreviewRows: (records) => buildAsnOrderPrintRows(records),
+ buildPreviewRows: (records) => buildAsnOrderPrintRows(records, t),
buildPreviewMeta: (rows) => {
const now = new Date()
return {
- reportTitle,
+ reportTitle: reportTitle.value,
reportDate: now.toLocaleDateString('zh-CN'),
printedAt: now.toLocaleString('zh-CN', { hour12: false }),
operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -404,7 +404,8 @@
buildAsnOrderReportMeta({
previewMeta: previewMeta.value,
count: previewRows.value.length,
- orientation: previewMeta.value?.reportStyle?.orientation || ASN_ORDER_REPORT_STYLE.orientation
+ orientation: previewMeta.value?.reportStyle?.orientation || ASN_ORDER_REPORT_STYLE.orientation,
+ t
})
)
</script>
diff --git a/rsf-design/src/views/orders/delivery-item/deliveryItemPage.helpers.js b/rsf-design/src/views/orders/delivery-item/deliveryItemPage.helpers.js
index afe7c69..db0887c 100644
--- a/rsf-design/src/views/orders/delivery-item/deliveryItemPage.helpers.js
+++ b/rsf-design/src/views/orders/delivery-item/deliveryItemPage.helpers.js
@@ -1,9 +1,16 @@
-const STATUS_META = {
- 1: { text: '姝e父', type: 'success', bool: true },
- 0: { text: '鍐荤粨', type: 'danger', bool: false }
+import { $t } from '@/locales'
+
+function getDeliveryItemStatusMetaMap(t = $t) {
+ return {
+ 1: { text: t('common.status.normal'), type: 'success', bool: true },
+ 0: { text: t('common.status.frozen'), type: 'danger', bool: false }
+ }
}
-export const DELIVERY_ITEM_REPORT_TITLE = 'DO鍗曟槑缁嗘姤琛�'
+export function getDeliveryItemReportTitle(t = $t) {
+ return t('pages.orders.deliveryItem.reportTitle')
+}
+
export const DELIVERY_ITEM_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
@@ -24,14 +31,15 @@
return Number.isNaN(parsed) ? fallback : parsed
}
-function normalizeStatusMeta(status) {
+function normalizeStatusMeta(status, t = $t) {
+ const statusMetaMap = getDeliveryItemStatusMetaMap(t)
if (status === true || Number(status) === 1) {
- return STATUS_META[1]
+ return statusMetaMap[1]
}
if (status === false || Number(status) === 0) {
- return STATUS_META[0]
+ return statusMetaMap[0]
}
- return { text: '鏈煡', type: 'info', bool: false }
+ return { text: t('common.status.unknown'), type: 'info', bool: false }
}
export function createDeliveryItemSearchState() {
@@ -85,8 +93,8 @@
}
}
-export function normalizeDeliveryItemRow(record = {}) {
- const statusMeta = normalizeStatusMeta(record.statusBool ?? record.status)
+export function normalizeDeliveryItemRow(record = {}, t = $t) {
+ const statusMeta = normalizeStatusMeta(record.statusBool ?? record.status, t)
return {
...record,
id: record.id ?? null,
@@ -121,20 +129,21 @@
}
}
-export function buildDeliveryItemPrintRows(records = []) {
+export function buildDeliveryItemPrintRows(records = [], t = $t) {
if (!Array.isArray(records)) {
return []
}
- return records.map((record) => normalizeDeliveryItemRow(record))
+ return records.map((record) => normalizeDeliveryItemRow(record, t))
}
export function buildDeliveryItemReportMeta({
previewMeta = {},
count = 0,
- orientation = DELIVERY_ITEM_REPORT_STYLE.orientation
+ orientation = DELIVERY_ITEM_REPORT_STYLE.orientation,
+ t = $t
} = {}) {
return {
- reportTitle: DELIVERY_ITEM_REPORT_TITLE,
+ reportTitle: getDeliveryItemReportTitle(t),
reportDate: previewMeta.reportDate,
printedAt: previewMeta.printedAt,
operator: previewMeta.operator,
diff --git a/rsf-design/src/views/orders/delivery-item/deliveryItemTable.columns.js b/rsf-design/src/views/orders/delivery-item/deliveryItemTable.columns.js
index 47eea48..23275c6 100644
--- a/rsf-design/src/views/orders/delivery-item/deliveryItemTable.columns.js
+++ b/rsf-design/src/views/orders/delivery-item/deliveryItemTable.columns.js
@@ -1,119 +1,120 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
-export function createDeliveryItemTableColumns({ handleActionClick } = {}) {
+export function createDeliveryItemTableColumns({ handleActionClick, t = $t } = {}) {
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: t('table.index'), width: 72, align: 'center' },
{
prop: 'deliveryCode',
- label: '浜ゆ帴鍗曞彿',
+ label: t('pages.orders.deliveryItem.table.deliveryCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.deliveryCode || '--'
},
{
prop: 'deliveryId',
- label: '涓诲崟ID',
+ label: t('pages.orders.deliveryItem.table.deliveryId'),
width: 110,
align: 'right',
formatter: (row) => row.deliveryId ?? '--'
},
{
prop: 'platItemId',
- label: '骞冲彴琛屽彿',
+ label: t('pages.orders.deliveryItem.table.platItemId'),
minWidth: 130,
showOverflowTooltip: true,
formatter: (row) => row.platItemId || '--'
},
{
prop: 'matnrCode',
- label: '鐗╂枡缂栫爜',
+ label: t('table.materialCode'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.matnrCode || '--'
},
{
prop: 'maktx',
- label: '鐗╂枡鍚嶇О',
+ label: t('table.materialName'),
minWidth: 220,
showOverflowTooltip: true,
formatter: (row) => row.maktx || '--'
},
{
prop: 'fieldsIndex',
- label: '鍔ㄦ�佸瓧娈电储寮�',
+ label: t('pages.orders.deliveryItem.table.fieldsIndex'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.fieldsIndex || '--'
},
{
prop: 'unit',
- label: '鍗曚綅',
+ label: t('table.unit'),
width: 90,
align: 'center',
formatter: (row) => row.unit || '--'
},
{
prop: 'anfme',
- label: '鏁伴噺',
+ label: t('table.quantity'),
width: 110,
align: 'right',
formatter: (row) => row.anfme ?? '--'
},
{
prop: 'workQty',
- label: '鎵ц鏁伴噺',
+ label: t('pages.orders.deliveryItem.table.workQty'),
width: 110,
align: 'right',
formatter: (row) => row.workQty ?? '--'
},
{
prop: 'qty',
- label: '宸插嚭鏁伴噺',
+ label: t('pages.orders.deliveryItem.table.qty'),
width: 110,
align: 'right',
formatter: (row) => row.qty ?? '--'
},
{
prop: 'nromQty',
- label: '鏍囧噯鍖呰',
+ label: t('pages.orders.deliveryItem.table.nromQty'),
width: 110,
align: 'right',
formatter: (row) => row.nromQty ?? '--'
},
{
prop: 'printQty',
- label: '鎵撳嵃鏁伴噺',
+ label: t('pages.orders.deliveryItem.table.printQty'),
width: 110,
align: 'right',
formatter: (row) => row.printQty ?? '--'
},
{
prop: 'splrName',
- label: '渚涘簲鍟嗗悕绉�',
+ label: t('pages.orders.deliveryItem.table.supplierName'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.splrName || '--'
},
{
prop: 'splrCode',
- label: '渚涘簲鍟嗙紪鐮�',
+ label: t('pages.orders.deliveryItem.table.supplierCode'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.splrCode || '--'
},
{
prop: 'splrBatch',
- label: '渚涘簲鍟嗘壒娆�',
+ label: t('table.supplierBatch'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.splrBatch || '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: t('table.status'),
width: 96,
align: 'center',
formatter: (row) =>
@@ -121,14 +122,14 @@
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: t('table.memo'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: t('table.operation'),
width: 92,
fixed: 'right',
formatter: (row) =>
diff --git a/rsf-design/src/views/orders/delivery-item/index.vue b/rsf-design/src/views/orders/delivery-item/index.vue
index fdd6cc6..609f5c1 100644
--- a/rsf-design/src/views/orders/delivery-item/index.vue
+++ b/rsf-design/src/views/orders/delivery-item/index.vue
@@ -3,10 +3,10 @@
<ElCard v-if="activeSourceSummary" class="mb-3">
<div class="flex items-center justify-between gap-3">
<div class="flex items-center gap-2 text-sm text-[var(--art-text-gray-600)]">
- <span class="font-medium text-[var(--art-text-gray-900)]">褰撳墠鏉ユ簮</span>
- <span>DO鍗旾D锛歿{ activeSourceSummary.deliveryId }}</span>
+ <span class="font-medium text-[var(--art-text-gray-900)]">{{ t('pages.orders.deliveryItem.sourceTitle') }}</span>
+ <span>{{ t('pages.orders.deliveryItem.sourceLabel', { id: activeSourceSummary.deliveryId }) }}</span>
</div>
- <ElButton link type="primary" @click="handleClearSourceFilter">鏌ョ湅鍏ㄩ儴</ElButton>
+ <ElButton link type="primary" @click="handleClearSourceFilter">{{ t('common.actions.viewAll') }}</ElButton>
</div>
</ElCard>
@@ -41,6 +41,7 @@
<script setup>
import { computed, onMounted, ref, watch } from 'vue'
+ import { useI18n } from 'vue-i18n'
import { ElButton, ElMessage } from 'element-plus'
import { useRoute, useRouter } from 'vue-router'
import { useTable } from '@/hooks/core/useTable'
@@ -56,6 +57,7 @@
defineOptions({ name: 'DeliveryItem' })
+ const { t } = useI18n()
const route = useRoute()
const router = useRouter()
const searchForm = ref(createDeliveryItemSearchState())
@@ -74,66 +76,66 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('table.keyword'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヤ氦鎺ュ崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О'
+ placeholder: t('pages.orders.deliveryItem.search.conditionPlaceholder')
}
},
{
- label: '浜ゆ帴鍗曞彿',
+ label: t('pages.orders.deliveryItem.search.deliveryCode'),
key: 'deliveryCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヤ氦鎺ュ崟鍙�'
+ placeholder: t('pages.orders.deliveryItem.search.deliveryCodePlaceholder')
}
},
{
- label: '骞冲彴琛屽彿',
+ label: t('pages.orders.deliveryItem.search.platItemId'),
key: 'platItemId',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ钩鍙拌鍙�'
+ placeholder: t('pages.orders.deliveryItem.search.platItemIdPlaceholder')
}
},
{
- label: '鐗╂枡缂栫爜',
+ label: t('table.materialCode'),
key: 'matnrCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+ placeholder: t('pages.orders.deliveryItem.search.matnrCodePlaceholder')
}
},
{
- label: '鐗╂枡鍚嶇О',
+ label: t('table.materialName'),
key: 'maktx',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+ placeholder: t('pages.orders.deliveryItem.search.maktxPlaceholder')
}
},
{
- label: '渚涘簲鍟嗗悕绉�',
+ label: t('pages.orders.deliveryItem.search.supplierName'),
key: 'splrName',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヤ緵搴斿晢鍚嶇О'
+ placeholder: t('pages.orders.deliveryItem.search.supplierNamePlaceholder')
}
},
{
- label: '渚涘簲鍟嗘壒娆�',
+ label: t('table.supplierBatch'),
key: 'splrBatch',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヤ緵搴斿晢鎵规'
+ placeholder: t('pages.orders.deliveryItem.search.supplierBatchPlaceholder')
}
}
])
@@ -142,15 +144,15 @@
detailDrawerVisible.value = true
detailLoading.value = true
guardRequestWithMessage(fetchGetDeliveryItemDetail(row.id), {}, {
- timeoutMessage: '浜ゆ帴鍗曟槑缁嗚鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�'
+ timeoutMessage: t('pages.orders.deliveryItem.messages.detailTimeout')
})
.then((detail) => {
- detailData.value = normalizeDeliveryItemRow(detail)
+ detailData.value = normalizeDeliveryItemRow(detail, t)
})
.catch((error) => {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇浜ゆ帴鍗曟槑缁嗚鎯呭け璐�')
+ ElMessage.error(error?.message || t('pages.orders.deliveryItem.messages.detailFailed'))
})
.finally(() => {
detailLoading.value = false
@@ -176,11 +178,11 @@
...searchForm.value,
pageSize: 20
}),
- columnsFactory: () => createDeliveryItemTableColumns({ handleActionClick: openDetail })
+ columnsFactory: () => createDeliveryItemTableColumns({ handleActionClick: openDetail, t })
},
transform: {
dataTransformer: (records) =>
- Array.isArray(records) ? records.map((item) => normalizeDeliveryItemRow(item)) : []
+ Array.isArray(records) ? records.map((item) => normalizeDeliveryItemRow(item, t)) : []
}
})
diff --git a/rsf-design/src/views/orders/delivery-item/modules/delivery-item-detail-drawer.vue b/rsf-design/src/views/orders/delivery-item/modules/delivery-item-detail-drawer.vue
index 6688dd8..06ede2f 100644
--- a/rsf-design/src/views/orders/delivery-item/modules/delivery-item-detail-drawer.vue
+++ b/rsf-design/src/views/orders/delivery-item/modules/delivery-item-detail-drawer.vue
@@ -1,7 +1,7 @@
<template>
<ElDrawer
:model-value="visible"
- title="浜ゆ帴鍗曟槑缁嗚鎯�"
+ :title="t('pages.orders.deliveryItem.detail.title')"
size="960px"
destroy-on-close
@update:model-value="handleVisibleChange"
@@ -11,39 +11,39 @@
<ElSkeleton :rows="10" animated />
</div>
<div v-else class="space-y-4">
- <ElDescriptions title="鍩虹淇℃伅" :column="2" border>
- <ElDescriptionsItem label="浜ゆ帴鍗曞彿">{{ detail.deliveryCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="涓诲崟ID">{{ detail.deliveryId ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="骞冲彴琛屽彿">{{ detail.platItemId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍔ㄦ�佸瓧娈电储寮�">{{ detail.fieldsIndex || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍗曚綅">{{ detail.unit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵ц鏁伴噺">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="宸插嚭鏁伴噺">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏍囧噯鍖呰">{{ detail.nromQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵撳嵃鏁伴噺">{{ detail.printQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟嗗悕绉�">{{ detail.splrName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟嗙紪鐮�">{{ detail.splrCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟嗘壒娆�">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵规">{{ detail.batch || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="璺熻釜鐮�">{{ detail.trackCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍖呰">{{ detail.packName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐢熶骇鏃ユ湡">{{ detail.prodTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">
+ <ElDescriptions :title="t('pages.orders.deliveryItem.detail.baseInfo')" :column="2" border>
+ <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.deliveryCode')">{{ detail.deliveryCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.deliveryId')">{{ detail.deliveryId ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.platItemId')">{{ detail.platItemId || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.materialCode')">{{ detail.matnrCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.materialName')">{{ detail.maktx || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.fieldsIndex')">{{ detail.fieldsIndex || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.unit')">{{ detail.unit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.quantity')">{{ detail.anfme ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.workQty')">{{ detail.workQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.qty')">{{ detail.qty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.nromQty')">{{ detail.nromQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.printQty')">{{ detail.printQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.supplierName')">{{ detail.splrName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.supplierCode')">{{ detail.splrCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.supplierBatch')">{{ detail.splrBatch || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.batch')">{{ detail.batch || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.common.trackCode')">{{ detail.trackCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.packName')">{{ detail.packName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.prodTime')">{{ detail.prodTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.status')">
<ElTag :type="detail.statusType || 'info'" effect="light">
- {{ detail.statusText || '--' }}
+ {{ detail.statusText || t('common.placeholder.empty') }}
</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.memo')" :span="2">{{ detail.memo || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
- <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptions :title="t('pages.orders.deliveryItem.detail.auditInfo')" :column="2" border>
+ <ElDescriptionsItem :label="t('table.createBy')">{{ detail.createByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateBy')">{{ detail.updateByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
</div>
</ElScrollbar>
@@ -52,6 +52,9 @@
<script setup>
import { computed } from 'vue'
+ import { useI18n } from 'vue-i18n'
+
+ const { t } = useI18n()
defineOptions({ name: 'DeliveryItemDetailDrawer' })
diff --git a/rsf-design/src/views/orders/delivery/deliveryPage.helpers.js b/rsf-design/src/views/orders/delivery/deliveryPage.helpers.js
index b6fd8a2..9b61115 100644
--- a/rsf-design/src/views/orders/delivery/deliveryPage.helpers.js
+++ b/rsf-design/src/views/orders/delivery/deliveryPage.helpers.js
@@ -1,18 +1,24 @@
import { $t } from '@/locales'
-const DELIVERY_STATUS_META = {
- 1: { text: $t('pages.orders.delivery.status.normal'), type: 'success', bool: true },
- 0: { text: $t('pages.orders.delivery.status.disabled'), type: 'danger', bool: false }
+function getDeliveryStatusMetaMap(t = $t) {
+ return {
+ 1: { text: t('pages.orders.delivery.status.normal'), type: 'success', bool: true },
+ 0: { text: t('pages.orders.delivery.status.disabled'), type: 'danger', bool: false }
+ }
}
-const DELIVERY_EXCE_STATUS_META = {
- 0: { text: $t('pages.orders.delivery.status.pending'), type: 'info' },
- 1: { text: $t('pages.orders.delivery.status.running'), type: 'warning' },
- 2: { text: $t('pages.orders.delivery.status.partial'), type: 'primary' },
- 3: { text: $t('pages.orders.delivery.status.completed'), type: 'success' }
+function getDeliveryExceStatusMetaMap(t = $t) {
+ return {
+ 0: { text: t('pages.orders.delivery.status.pending'), type: 'info' },
+ 1: { text: t('pages.orders.delivery.status.running'), type: 'warning' },
+ 2: { text: t('pages.orders.delivery.status.partial'), type: 'primary' },
+ 3: { text: t('pages.orders.delivery.status.completed'), type: 'success' }
+ }
}
-export const DELIVERY_REPORT_TITLE = $t('pages.orders.delivery.reportTitle')
+export function getDeliveryReportTitle(t = $t) {
+ return t('pages.orders.delivery.reportTitle')
+}
export const DELIVERY_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
@@ -33,26 +39,28 @@
return Number.isNaN(parsed) ? fallback : parsed
}
-function normalizeStatusMeta(status) {
+function normalizeStatusMeta(status, t = $t) {
+ const deliveryStatusMeta = getDeliveryStatusMetaMap(t)
if (status === true || Number(status) === 1) {
- return DELIVERY_STATUS_META[1]
+ return deliveryStatusMeta[1]
}
if (status === false || Number(status) === 0) {
- return DELIVERY_STATUS_META[0]
+ return deliveryStatusMeta[0]
}
- return { text: $t('common.status.unknown'), type: 'info', bool: false }
+ return { text: t('common.status.unknown'), type: 'info', bool: false }
}
-function normalizeExceStatusMeta(exceStatus, exceStatusText) {
+function normalizeExceStatusMeta(exceStatus, exceStatusText, t = $t) {
+ const deliveryExceStatusMeta = getDeliveryExceStatusMetaMap(t)
if (exceStatusText) {
const numericValue = Number(exceStatus)
- const fallback = DELIVERY_EXCE_STATUS_META[numericValue] || {
+ const fallback = deliveryExceStatusMeta[numericValue] || {
text: exceStatusText,
type: 'info'
}
return fallback
}
- return DELIVERY_EXCE_STATUS_META[Number(exceStatus)] || {
+ return deliveryExceStatusMeta[Number(exceStatus)] || {
text: normalizeText(exceStatus) || '--',
type: 'info'
}
@@ -122,9 +130,9 @@
}
}
-export function normalizeDeliveryRow(record = {}) {
- const statusMeta = normalizeStatusMeta(record.statusBool ?? record.status)
- const exceStatusMeta = normalizeExceStatusMeta(record.exceStatus, record['exceStatus$'] || record.exceStatusText)
+export function normalizeDeliveryRow(record = {}, t = $t) {
+ const statusMeta = normalizeStatusMeta(record.statusBool ?? record.status, t)
+ const exceStatusMeta = normalizeExceStatusMeta(record.exceStatus, record['exceStatus$'] || record.exceStatusText, t)
return {
...record,
id: record.id ?? null,
@@ -152,7 +160,8 @@
}
}
-export function normalizeDeliveryItemRow(record = {}) {
+export function normalizeDeliveryItemRow(record = {}, t = $t) {
+ const statusMeta = normalizeStatusMeta(record.statusBool ?? record.status, t)
return {
...record,
id: record.id ?? null,
@@ -179,12 +188,12 @@
trackCode: normalizeText(record.trackCode) || '--',
packName: normalizeText(record.packName) || '--',
prodTimeText: normalizeText(record['prodTime$'] || record.prodTimeText || record.prodTime) || '--',
- statusText: normalizeStatusMeta(record.statusBool ?? record.status).text,
- statusType: normalizeStatusMeta(record.statusBool ?? record.status).type,
+ statusText: statusMeta.text,
+ statusType: statusMeta.type,
statusBool:
record.statusBool !== void 0
? Boolean(record.statusBool)
- : normalizeStatusMeta(record.statusBool ?? record.status).bool,
+ : statusMeta.bool,
createByText: normalizeText(record['createBy$'] || record.createByText) || '--',
createTimeText: normalizeText(record['createTime$'] || record.createTimeText || record.createTime) || '--',
updateByText: normalizeText(record['updateBy$'] || record.updateByText) || '--',
@@ -193,27 +202,28 @@
}
}
-export function buildDeliveryPrintRows(records = []) {
+export function buildDeliveryPrintRows(records = [], t = $t) {
if (!Array.isArray(records)) {
return []
}
- return records.map((record) => normalizeDeliveryRow(record))
+ return records.map((record) => normalizeDeliveryRow(record, t))
}
-export function buildDeliveryItemPrintRows(records = []) {
+export function buildDeliveryItemPrintRows(records = [], t = $t) {
if (!Array.isArray(records)) {
return []
}
- return records.map((record) => normalizeDeliveryItemRow(record))
+ return records.map((record) => normalizeDeliveryItemRow(record, t))
}
export function buildDeliveryReportMeta({
previewMeta = {},
count = 0,
- orientation = DELIVERY_REPORT_STYLE.orientation
+ orientation = DELIVERY_REPORT_STYLE.orientation,
+ t = $t
} = {}) {
return {
- reportTitle: DELIVERY_REPORT_TITLE,
+ reportTitle: getDeliveryReportTitle(t),
reportDate: previewMeta.reportDate,
printedAt: previewMeta.printedAt,
operator: previewMeta.operator,
@@ -228,10 +238,11 @@
export function buildDeliveryItemReportMeta({
previewMeta = {},
count = 0,
- orientation = DELIVERY_REPORT_STYLE.orientation
+ orientation = DELIVERY_REPORT_STYLE.orientation,
+ t = $t
} = {}) {
return {
- reportTitle: $t('pages.orders.delivery.detailReportTitle'),
+ reportTitle: t('pages.orders.delivery.detailReportTitle'),
reportDate: previewMeta.reportDate,
printedAt: previewMeta.printedAt,
operator: previewMeta.operator,
diff --git a/rsf-design/src/views/orders/delivery/index.vue b/rsf-design/src/views/orders/delivery/index.vue
index ef9ee74..f679705 100644
--- a/rsf-design/src/views/orders/delivery/index.vue
+++ b/rsf-design/src/views/orders/delivery/index.vue
@@ -71,6 +71,7 @@
buildDeliveryReportMeta,
buildDeliverySearchParams,
createDeliverySearchState,
+ getDeliveryReportTitle,
getDeliveryPaginationKey,
normalizeDeliveryItemRow,
normalizeDeliveryRow
@@ -91,7 +92,7 @@
const userStore = useUserStore()
const router = useRouter()
const { t } = useI18n()
- const reportTitle = t('pages.orders.delivery.reportTitle')
+ const reportTitle = computed(() => getDeliveryReportTitle(t))
const searchForm = ref(createDeliverySearchState())
const selectedRows = ref([])
const detailDrawerVisible = ref(false)
@@ -207,7 +208,7 @@
{ timeoutMessage: t('pages.orders.delivery.messages.itemsTimeout') }
)
const normalizedResponse = defaultResponseAdapter(response)
- detailItemRows.value = normalizedResponse.records.map((item) => normalizeDeliveryItemRow(item))
+ detailItemRows.value = normalizedResponse.records.map((item) => normalizeDeliveryItemRow(item, t))
detailItemPagination.total = Number(normalizedResponse.total || 0)
detailItemPagination.current = Number(normalizedResponse.current || detailItemPagination.current || 1)
detailItemPagination.size = Number(normalizedResponse.size || detailItemPagination.size || 20)
@@ -224,7 +225,7 @@
{},
{ timeoutMessage: t('pages.orders.delivery.messages.detailTimeout') }
)
- detailData.value = normalizeDeliveryRow(detail)
+ detailData.value = normalizeDeliveryRow(detail, t)
} finally {
detailLoading.value = false
}
@@ -319,7 +320,7 @@
columnsFactory: () => createDeliveryTableColumns({ handleActionClick: handleTableActionClick })
},
transform: {
- dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeDeliveryRow(item)) : [])
+ dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeDeliveryRow(item, t)) : [])
}
})
@@ -369,11 +370,11 @@
}
),
resolvePrintRecords,
- buildPreviewRows: (records) => buildDeliveryPrintRows(records),
+ buildPreviewRows: (records) => buildDeliveryPrintRows(records, t),
buildPreviewMeta: (rows) => {
const now = new Date()
return {
- reportTitle,
+ reportTitle: reportTitle.value,
reportDate: now.toLocaleDateString('zh-CN'),
printedAt: now.toLocaleString('zh-CN', { hour12: false }),
operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -393,7 +394,8 @@
buildDeliveryReportMeta({
previewMeta: rawPreviewMeta.value,
count: previewRows.value.length,
- orientation: rawPreviewMeta.value?.reportStyle?.orientation || 'landscape'
+ orientation: rawPreviewMeta.value?.reportStyle?.orientation || 'landscape',
+ t
})
)
diff --git a/rsf-design/src/views/orders/out-stock-item/index.vue b/rsf-design/src/views/orders/out-stock-item/index.vue
index 03c29d0..555e0ae 100644
--- a/rsf-design/src/views/orders/out-stock-item/index.vue
+++ b/rsf-design/src/views/orders/out-stock-item/index.vue
@@ -3,10 +3,10 @@
<ElCard v-if="activeSourceSummary" class="mb-3">
<div class="flex items-center justify-between gap-3">
<div class="flex items-center gap-2 text-sm text-[var(--art-text-gray-600)]">
- <span class="font-medium text-[var(--art-text-gray-900)]">褰撳墠鏉ユ簮</span>
- <span>鍑哄簱鍗旾D锛歿{ activeSourceSummary.orderId }}</span>
+ <span class="font-medium text-[var(--art-text-gray-900)]">{{ t('pages.orders.outStockItem.sourceSummary.title') }}</span>
+ <span>{{ t('pages.orders.outStockItem.sourceSummary.orderId', { id: activeSourceSummary.orderId }) }}</span>
</div>
- <ElButton link type="primary" @click="handleClearSourceFilter">鏌ョ湅鍏ㄩ儴</ElButton>
+ <ElButton link type="primary" @click="handleClearSourceFilter">{{ t('common.actions.viewAll') }}</ElButton>
</div>
</ElCard>
@@ -43,6 +43,7 @@
import { computed, onMounted, ref, watch } from 'vue'
import { ElButton, ElMessage } from 'element-plus'
import { useRoute, useRouter } from 'vue-router'
+ import { useI18n } from 'vue-i18n'
import { useTable } from '@/hooks/core/useTable'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
import { fetchGetOutStockItemDetail, fetchOutStockItemPage } from '@/api/out-stock-item'
@@ -55,6 +56,7 @@
} from './outStockItemPage.helpers.js'
defineOptions({ name: 'OutStockItem' })
+ const { t } = useI18n()
const route = useRoute()
const router = useRouter()
@@ -77,104 +79,105 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('pages.orders.outStockItem.search.condition'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ嚭搴撳崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О'
+ placeholder: t('pages.orders.outStockItem.search.conditionPlaceholder')
}
},
{
- label: '鍑哄簱鍗曞彿',
+ label: t('pages.orders.outStockItem.search.orderCode'),
key: 'orderCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ嚭搴撳崟鍙�'
+ placeholder: t('pages.orders.outStockItem.search.orderCodePlaceholder')
}
},
{
- label: 'PO鍗曞彿',
+ label: t('pages.orders.outStockItem.search.poCode'),
key: 'poCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏O鍗曞彿'
+ placeholder: t('pages.orders.outStockItem.search.poCodePlaceholder')
}
},
{
- label: '骞冲彴琛屽彿',
+ label: t('pages.orders.outStockItem.search.platItemId'),
key: 'platItemId',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ钩鍙拌鍙�'
+ placeholder: t('pages.orders.outStockItem.search.platItemIdPlaceholder')
}
},
{
- label: '鐗╂枡缂栫爜',
+ label: t('pages.orders.outStockItem.search.matnrCode'),
key: 'matnrCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+ placeholder: t('pages.orders.outStockItem.search.matnrCodePlaceholder')
}
},
{
- label: '鐗╂枡鍚嶇О',
+ label: t('pages.orders.outStockItem.search.maktx'),
key: 'maktx',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+ placeholder: t('pages.orders.outStockItem.search.maktxPlaceholder')
}
},
{
- label: '鎵规',
+ label: t('pages.orders.outStockItem.search.batch'),
key: 'batch',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユ壒娆�'
+ placeholder: t('pages.orders.outStockItem.search.batchPlaceholder')
}
},
{
- label: '渚涘簲鍟嗘壒娆�',
+ label: t('pages.orders.outStockItem.search.splrBatch'),
key: 'splrBatch',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヤ緵搴斿晢鎵规'
+ placeholder: t('pages.orders.outStockItem.search.splrBatchPlaceholder')
}
},
{
- label: '鏉″舰鐮�',
+ label: t('pages.orders.outStockItem.search.barcode'),
key: 'barcode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユ潯褰㈢爜'
+ placeholder: t('pages.orders.outStockItem.search.barcodePlaceholder')
}
},
{
- label: '瀛楁绱㈠紩',
+ label: t('pages.orders.outStockItem.search.fieldsIndex'),
key: 'fieldsIndex',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ瓧娈电储寮�'
+ placeholder: t('pages.orders.outStockItem.search.fieldsIndexPlaceholder')
}
},
{
- label: '鐘舵��',
+ label: t('pages.orders.outStockItem.search.status'),
key: 'status',
type: 'select',
props: {
clearable: true,
+ placeholder: t('pages.orders.outStockItem.search.statusPlaceholder'),
options: [
- { label: '姝e父', value: 1 },
- { label: '鍐荤粨', value: 0 }
+ { label: t('common.status.normal'), value: 1 },
+ { label: t('common.status.frozen'), value: 0 }
]
}
}
@@ -184,15 +187,15 @@
detailDrawerVisible.value = true
detailLoading.value = true
guardRequestWithMessage(fetchGetOutStockItemDetail(row.id), {}, {
- timeoutMessage: '鍑哄簱鍗曟槑缁嗚鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�'
+ timeoutMessage: t('pages.orders.outStockItem.messages.detailTimeout')
})
.then((detail) => {
- detailData.value = normalizeOutStockItemRow(detail)
+ detailData.value = normalizeOutStockItemRow(detail, t)
})
.catch((error) => {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇鍑哄簱鍗曟槑缁嗚鎯呭け璐�')
+ ElMessage.error(error?.message || t('pages.orders.outStockItem.messages.detailFailed'))
})
.finally(() => {
detailLoading.value = false
@@ -218,11 +221,11 @@
...searchForm.value,
pageSize: 20
}),
- columnsFactory: () => createOutStockItemTableColumns({ handleActionClick: openDetail })
+ columnsFactory: () => createOutStockItemTableColumns({ handleActionClick: openDetail, t })
},
transform: {
dataTransformer: (records) =>
- Array.isArray(records) ? records.map((item) => normalizeOutStockItemRow(item)) : []
+ Array.isArray(records) ? records.map((item) => normalizeOutStockItemRow(item, t)) : []
}
})
diff --git a/rsf-design/src/views/orders/out-stock-item/modules/out-stock-item-detail-drawer.vue b/rsf-design/src/views/orders/out-stock-item/modules/out-stock-item-detail-drawer.vue
index 4829125..571f720 100644
--- a/rsf-design/src/views/orders/out-stock-item/modules/out-stock-item-detail-drawer.vue
+++ b/rsf-design/src/views/orders/out-stock-item/modules/out-stock-item-detail-drawer.vue
@@ -1,7 +1,7 @@
<template>
<ElDrawer
:model-value="visible"
- title="鍑哄簱鍗曟槑缁嗚鎯�"
+ :title="t('pages.orders.outStockItem.detail.title')"
size="80%"
destroy-on-close
append-to-body
@@ -11,49 +11,49 @@
<ElSkeleton :loading="loading" animated :rows="10">
<div class="flex min-h-full flex-col gap-4 pr-2">
<ElDescriptions :column="3" border>
- <ElDescriptionsItem label="鍑哄簱鍗曞彿">{{ detail.orderCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="PO鍗曞彿">{{ detail.poCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="骞冲彴琛屽彿">{{ detail.platItemId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="骞冲彴璁㈠崟鍙�">{{ detail.platOrderCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="骞冲彴宸ュ崟鍙�">{{ detail.platWorkCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="椤圭洰鍙�">{{ detail.projectCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="瑙勬牸">{{ detail.spec || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍨嬪彿">{{ detail.model || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵规">{{ detail.batch || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟嗘壒娆�">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撳瓨鍗曚綅">{{ detail.stockUnit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閲囪喘鍗曚綅">{{ detail.purUnit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍩烘湰鍗曚綅">{{ detail.baseUnit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="瀛楁绱㈠紩">{{ detail.fieldsIndex || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏉″舰鐮�">{{ detail.barcode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浜岀淮鐮�">{{ detail.qrcode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍖呰鍚嶇О">{{ detail.packName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.orderCode')">{{ detail.orderCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.poCode')">{{ detail.poCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.platItemId')">{{ detail.platItemId || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.platOrderCode')">{{ detail.platOrderCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.platWorkCode')">{{ detail.platWorkCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.projectCode')">{{ detail.projectCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.matnrCode')">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.maktx')">{{ detail.maktx || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.spec')">{{ detail.spec || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.model')">{{ detail.model || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.batch')">{{ detail.batch || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.splrBatch')">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.stockUnit')">{{ detail.stockUnit || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.purUnit')">{{ detail.purUnit || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.baseUnit')">{{ detail.baseUnit || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.fieldsIndex')">{{ detail.fieldsIndex || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.barcode')">{{ detail.barcode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.qrcode')">{{ detail.qrcode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.packName')">{{ detail.packName || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.status')">
<ElTag :type="detail.statusTagType || 'info'" effect="light">
{{ detail.statusText || '--' }}
</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵ц鏁伴噺">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="宸插嚭鏁伴噺">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閲囪喘鏁伴噺">{{ detail.purQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="闇�姹傛暟閲�">{{ detail.demandQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟嗙紪鐮�">{{ detail.splrCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟嗗悕绉�">{{ detail.splrName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏉ユ簮浠撳簱">{{ detail.sourceWarehouseId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐩爣浠撳簱">{{ detail.targetWarehouseId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="璐т富">{{ detail.ownerName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="淇濈鑰�">{{ detail.keeperName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞" :span="3">{{ detail.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.anfme')">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.workQty')">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.qty')">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.purQty')">{{ detail.purQty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.demandQty')">{{ detail.demandQty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.splrCode')">{{ detail.splrCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.splrName')">{{ detail.splrName || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.sourceWarehouseId')">{{ detail.sourceWarehouseId || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.targetWarehouseId')">{{ detail.targetWarehouseId || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.ownerName')">{{ detail.ownerName || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.keeperName')">{{ detail.keeperName || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.memo')" :span="3">{{ detail.memo || '--' }}</ElDescriptionsItem>
</ElDescriptions>
<ElDescriptions :column="2" border>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="淇敼浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="淇敼鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.createBy')">{{ detail.createByText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.updateBy')">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
</ElDescriptions>
</div>
</ElSkeleton>
@@ -62,6 +62,7 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
defineOptions({ name: 'OutStockItemDetailDrawer' })
const props = defineProps({
@@ -80,6 +81,7 @@
})
const emit = defineEmits(['update:visible'])
+ const { t } = useI18n()
function handleVisibleChange(visible) {
emit('update:visible', visible)
diff --git a/rsf-design/src/views/orders/out-stock-item/outStockItemPage.helpers.js b/rsf-design/src/views/orders/out-stock-item/outStockItemPage.helpers.js
index 7f92e10..123681d 100644
--- a/rsf-design/src/views/orders/out-stock-item/outStockItemPage.helpers.js
+++ b/rsf-design/src/views/orders/out-stock-item/outStockItemPage.helpers.js
@@ -1,6 +1,10 @@
const STATUS_META = {
- 1: { text: '姝e父', type: 'success' },
- 0: { text: '鍐荤粨', type: 'danger' }
+ 1: { key: 'common.status.normal', type: 'success' },
+ 0: { key: 'common.status.frozen', type: 'danger' }
+}
+
+function translate(t, key) {
+ return typeof t === 'function' ? t(key) : key
}
function normalizeText(value, fallback = '--') {
@@ -32,9 +36,16 @@
}
}
-function getStatusMeta(status, statusText) {
+function getStatusMeta(status, statusText, t) {
const numericStatus = Number(status)
- return STATUS_META[numericStatus] || {
+ const meta = STATUS_META[numericStatus]
+ if (meta) {
+ return {
+ text: translate(t, meta.key),
+ type: meta.type
+ }
+ }
+ return {
text: normalizeText(statusText || status, '--'),
type: 'info'
}
@@ -89,8 +100,8 @@
}
}
-export function normalizeOutStockItemRow(record = {}) {
- const statusMeta = getStatusMeta(record.status, record['status$'])
+export function normalizeOutStockItemRow(record = {}, t) {
+ const statusMeta = getStatusMeta(record.status, record['status$'], t)
return {
...record,
diff --git a/rsf-design/src/views/orders/out-stock-item/outStockItemTable.columns.js b/rsf-design/src/views/orders/out-stock-item/outStockItemTable.columns.js
index d12747b..c5ca70f 100644
--- a/rsf-design/src/views/orders/out-stock-item/outStockItemTable.columns.js
+++ b/rsf-design/src/views/orders/out-stock-item/outStockItemTable.columns.js
@@ -2,96 +2,96 @@
import { ElTag } from 'element-plus'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
-export function createOutStockItemTableColumns({ handleActionClick } = {}) {
+export function createOutStockItemTableColumns({ handleActionClick, t } = {}) {
return [
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: t('table.index'), width: 72, align: 'center' },
{
prop: 'orderCode',
- label: '鍑哄簱鍗曞彿',
+ label: t('pages.orders.outStockItem.table.orderCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.orderCode || '--'
},
{
prop: 'poCode',
- label: 'PO鍗曞彿',
+ label: t('pages.orders.outStockItem.table.poCode'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.poCode || '--'
},
{
prop: 'platItemId',
- label: '骞冲彴琛屽彿',
+ label: t('pages.orders.outStockItem.table.platItemId'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.platItemId || '--'
},
{
prop: 'matnrCode',
- label: '鐗╂枡缂栫爜',
+ label: t('pages.orders.outStockItem.table.matnrCode'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.matnrCode || '--'
},
{
prop: 'maktx',
- label: '鐗╂枡鍚嶇О',
+ label: t('pages.orders.outStockItem.table.maktx'),
minWidth: 220,
showOverflowTooltip: true,
formatter: (row) => row.maktx || '--'
},
{
prop: 'batch',
- label: '鎵规',
+ label: t('pages.orders.outStockItem.table.batch'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.batch || '--'
},
{
prop: 'splrBatch',
- label: '渚涘簲鍟嗘壒娆�',
+ label: t('pages.orders.outStockItem.table.splrBatch'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.splrBatch || '--'
},
{
prop: 'stockUnit',
- label: '搴撳瓨鍗曚綅',
+ label: t('pages.orders.outStockItem.table.stockUnit'),
width: 100,
align: 'center',
formatter: (row) => row.stockUnit || '--'
},
{
prop: 'anfme',
- label: '鏁伴噺',
+ label: t('pages.orders.outStockItem.table.anfme'),
width: 100,
align: 'right',
formatter: (row) => row.anfme ?? '--'
},
{
prop: 'workQty',
- label: '鎵ц鏁伴噺',
+ label: t('pages.orders.outStockItem.table.workQty'),
width: 100,
align: 'right',
formatter: (row) => row.workQty ?? '--'
},
{
prop: 'qty',
- label: '宸插嚭鏁伴噺',
+ label: t('pages.orders.outStockItem.table.qty'),
width: 100,
align: 'right',
formatter: (row) => row.qty ?? '--'
},
{
prop: 'fieldsIndex',
- label: '瀛楁绱㈠紩',
+ label: t('pages.orders.outStockItem.table.fieldsIndex'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.fieldsIndex || '--'
},
{
prop: 'statusText',
- label: '鐘舵��',
+ label: t('pages.orders.outStockItem.table.status'),
width: 96,
align: 'center',
formatter: (row) =>
@@ -99,14 +99,14 @@
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: t('pages.orders.outStockItem.table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: t('table.operation'),
width: 92,
fixed: 'right',
formatter: (row) =>
diff --git a/rsf-design/src/views/orders/out-stock/index.vue b/rsf-design/src/views/orders/out-stock/index.vue
index ab3fd34..c3d5018 100644
--- a/rsf-design/src/views/orders/out-stock/index.vue
+++ b/rsf-design/src/views/orders/out-stock/index.vue
@@ -58,6 +58,7 @@
import { computed, reactive, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useRouter } from 'vue-router'
+ import { useI18n } from 'vue-i18n'
import { useUserStore } from '@/store/modules/user'
import { useTable } from '@/hooks/core/useTable'
import { usePrintExportPage } from '@/views/system/common/usePrintExportPage'
@@ -76,13 +77,13 @@
} from '@/api/out-stock'
import OutStockDetailDrawer from './modules/out-stock-detail-drawer.vue'
import {
- OUT_STOCK_REPORT_TITLE,
OUT_STOCK_REPORT_STYLE,
buildOutStockPageQueryParams,
buildOutStockPrintRows,
buildOutStockReportMeta,
buildOutStockSearchParams,
createOutStockSearchState,
+ getOutStockReportTitle,
normalizeOutStockRow
} from './outStockPage.helpers'
import { createOutStockTableColumns } from './outStockTable.columns'
@@ -90,10 +91,11 @@
import { normalizeOutStockItemRow } from '../out-stock-item/outStockItemPage.helpers.js'
defineOptions({ name: 'OutStock' })
+ const { t } = useI18n()
const userStore = useUserStore()
const router = useRouter()
- const reportTitle = OUT_STOCK_REPORT_TITLE
+ const reportTitle = computed(() => getOutStockReportTitle(t))
const searchForm = ref(createOutStockSearchState())
const selectedRows = ref([])
const detailDrawerVisible = ref(false)
@@ -108,60 +110,98 @@
total: 0
})
const detailItemColumns = computed(() =>
- createOutStockItemTableColumns().filter((column) => column.prop !== 'operation')
+ createOutStockItemTableColumns({ t }).filter((column) => column.prop !== 'operation')
)
const reportQueryParams = computed(() => buildOutStockSearchParams(searchForm.value))
const searchItems = computed(() => [
- { label: '鍏抽敭瀛�', key: 'condition', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ嚭搴撳崟鍙�/PO鍗曞彿/瀹㈡埛' } },
- { label: '鍑哄簱鍗曞彿', key: 'code', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ嚭搴撳崟鍙�' } },
- { label: 'PO鍗曞彿', key: 'poCode', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏O鍗曞彿' } },
{
- label: '涓氬姟绫诲瀷',
+ label: t('pages.orders.outStock.search.condition'),
+ key: 'condition',
+ type: 'input',
+ props: { clearable: true, placeholder: t('pages.orders.outStock.search.conditionPlaceholder') }
+ },
+ {
+ label: t('pages.orders.outStock.search.code'),
+ key: 'code',
+ type: 'input',
+ props: { clearable: true, placeholder: t('pages.orders.outStock.search.codePlaceholder') }
+ },
+ {
+ label: t('pages.orders.outStock.search.poCode'),
+ key: 'poCode',
+ type: 'input',
+ props: { clearable: true, placeholder: t('pages.orders.outStock.search.poCodePlaceholder') }
+ },
+ {
+ label: t('pages.orders.outStock.search.wkType'),
key: 'wkType',
type: 'select',
props: {
clearable: true,
+ placeholder: t('pages.orders.outStock.search.wkTypePlaceholder'),
options: [
- { label: '閿�鍞嚭搴撳崟', value: 'sales_out' },
- { label: '璋冩嫧鍑哄簱鍗�', value: 'transfer_out' },
- { label: '搴撳瓨鍑哄簱鍗�', value: 'stock_out' },
- { label: '澶囪揣鍑哄簱鍗�', value: 'pre_out' }
+ { label: t('pages.orders.outStock.businessType.salesOut'), value: 'sales_out' },
+ { label: t('pages.orders.outStock.businessType.transferOut'), value: 'transfer_out' },
+ { label: t('pages.orders.outStock.businessType.stockOut'), value: 'stock_out' },
+ { label: t('pages.orders.outStock.businessType.preOut'), value: 'pre_out' }
]
}
},
{
- label: '鍗曟嵁鐘舵��',
+ label: t('pages.orders.outStock.search.exceStatus'),
key: 'exceStatus',
type: 'select',
props: {
clearable: true,
+ placeholder: t('pages.orders.outStock.search.exceStatusPlaceholder'),
options: [
- { label: '鍒濆鍖�', value: 10 },
- { label: '寰呭鐞�', value: 11 },
- { label: '鐢熸垚宸ヤ綔妗�', value: 13 },
- { label: '浣滀笟涓�', value: 14 },
- { label: '宸插畬鎴�', value: 15 },
- { label: '鍙栨秷', value: 8 }
+ { label: t('pages.orders.outStock.status.initialized'), value: 10 },
+ { label: t('pages.orders.outStock.status.pending'), value: 11 },
+ { label: t('pages.orders.outStock.status.generated'), value: 13 },
+ { label: t('pages.orders.outStock.status.running'), value: 14 },
+ { label: t('pages.orders.outStock.status.completed'), value: 15 },
+ { label: t('pages.orders.outStock.status.cancelled'), value: 8 }
]
}
},
{
- label: '閲婃斁鐘舵��',
+ label: t('pages.orders.outStock.search.rleStatus'),
key: 'rleStatus',
type: 'select',
props: {
clearable: true,
+ placeholder: t('pages.orders.outStock.search.rleStatusPlaceholder'),
options: [
- { label: '姝e父', value: 0 },
- { label: '宸查噴鏀�', value: 1 }
+ { label: t('common.status.normal'), value: 0 },
+ { label: t('pages.orders.outStock.status.released'), value: 1 }
]
}
},
- { label: '鐗╂祦鍗曞彿', key: 'logisNo', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ョ墿娴佸崟鍙�' } },
- { label: '瀹㈡埛鍚嶇О', key: 'customerName', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ鎴峰悕绉�' } },
- { label: '閿�鍞粍缁�', key: 'saleOrgName', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ラ攢鍞粍缁�' } },
- { label: '澶囨敞', key: 'memo', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ娉�' } }
+ {
+ label: t('pages.orders.outStock.search.logisNo'),
+ key: 'logisNo',
+ type: 'input',
+ props: { clearable: true, placeholder: t('pages.orders.outStock.search.logisNoPlaceholder') }
+ },
+ {
+ label: t('pages.orders.outStock.search.customerName'),
+ key: 'customerName',
+ type: 'input',
+ props: { clearable: true, placeholder: t('pages.orders.outStock.search.customerNamePlaceholder') }
+ },
+ {
+ label: t('pages.orders.outStock.search.saleOrgName'),
+ key: 'saleOrgName',
+ type: 'input',
+ props: { clearable: true, placeholder: t('pages.orders.outStock.search.saleOrgNamePlaceholder') }
+ },
+ {
+ label: t('pages.orders.outStock.search.memo'),
+ key: 'memo',
+ type: 'input',
+ props: { clearable: true, placeholder: t('pages.orders.outStock.search.memoPlaceholder') }
+ }
])
async function loadDetailResources() {
@@ -173,7 +213,7 @@
detailItemsLoading.value = true
try {
const [detailResponse, itemResponse] = await Promise.all([
- guardRequestWithMessage(fetchGetOutStockDetail(activeOutStockId.value), {}, { timeoutMessage: '鍑哄簱鍗曡鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�' }),
+ guardRequestWithMessage(fetchGetOutStockDetail(activeOutStockId.value), {}, { timeoutMessage: t('pages.orders.outStock.messages.detailTimeout') }),
guardRequestWithMessage(
fetchOutStockItemPage({
orderId: activeOutStockId.value,
@@ -186,13 +226,13 @@
current: detailItemPagination.current,
size: detailItemPagination.size
},
- { timeoutMessage: '鍑哄簱鍗曟槑缁嗗姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�' }
+ { timeoutMessage: t('pages.orders.outStock.messages.itemsTimeout') }
)
])
- detailData.value = normalizeOutStockRow(detailResponse)
+ detailData.value = normalizeOutStockRow(detailResponse, t)
const normalized = defaultResponseAdapter(itemResponse)
- detailItemRows.value = normalized.records.map((item) => normalizeOutStockItemRow(item))
+ detailItemRows.value = normalized.records.map((item) => normalizeOutStockItemRow(item, t))
detailItemPagination.total = Number(normalized.total || 0)
detailItemPagination.current = Number(normalized.current || detailItemPagination.current || 1)
detailItemPagination.size = Number(normalized.size || detailItemPagination.size || 20)
@@ -214,7 +254,7 @@
detailDrawerVisible.value = false
detailData.value = {}
detailItemRows.value = []
- ElMessage.error(error?.message || '鑾峰彇鍑哄簱鍗曡鎯呭け璐�')
+ ElMessage.error(error?.message || t('pages.orders.outStock.messages.detailLoadFailed'))
}
}
@@ -231,55 +271,62 @@
async function handleComplete(row) {
try {
- await ElMessageBox.confirm(`纭畾瀹屾垚鍑哄簱鍗� ${row.code || ''} 鍚楋紵`, '瀹屾垚纭', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
+ await ElMessageBox.confirm(t('pages.orders.outStock.messages.completeConfirm', { code: row.code || '' }), t('pages.orders.outStock.messages.completeTitle'), {
+ confirmButtonText: t('common.confirm'),
+ cancelButtonText: t('common.cancel'),
type: 'warning'
})
await fetchCompleteOutStock(row.id)
- ElMessage.success('瀹屾垚鎴愬姛')
+ ElMessage.success(t('pages.orders.outStock.messages.completeSuccess'))
await refreshData()
if (detailDrawerVisible.value && activeOutStockId.value === row.id) {
await loadDetailResources()
}
} catch (error) {
if (error === 'cancel' || error?.message === 'cancel') return
- ElMessage.error(error?.message || '瀹屾垚澶辫触')
+ ElMessage.error(error?.message || t('pages.orders.outStock.messages.actionFailed'))
}
}
async function handleCancel(row) {
try {
- await ElMessageBox.confirm(`纭畾鍙栨秷鍑哄簱鍗� ${row.code || ''} 鍚楋紵`, '鍙栨秷纭', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
+ await ElMessageBox.confirm(t('pages.orders.outStock.messages.cancelConfirm', { code: row.code || '' }), t('pages.orders.outStock.messages.cancelTitle'), {
+ confirmButtonText: t('common.confirm'),
+ cancelButtonText: t('common.cancel'),
type: 'warning'
})
await fetchCancelOutStock(row.id)
- ElMessage.success('鍙栨秷鎴愬姛')
+ ElMessage.success(t('pages.orders.outStock.messages.cancelSuccess'))
await refreshData()
if (detailDrawerVisible.value && activeOutStockId.value === row.id) {
await loadDetailResources()
}
} catch (error) {
if (error === 'cancel' || error?.message === 'cancel') return
- ElMessage.error(error?.message || '鍙栨秷澶辫触')
+ ElMessage.error(error?.message || t('pages.orders.outStock.messages.actionFailed'))
}
}
async function handleDelete(row) {
try {
- await ElMessageBox.confirm(`纭畾鍒犻櫎鍑哄簱鍗� ${row.code || ''} 鍚楋紵`, '鍒犻櫎纭', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- })
+ await ElMessageBox.confirm(
+ t('crud.confirm.deleteMessage', {
+ entity: t('pages.orders.outStock.entity'),
+ label: row.code || ''
+ }),
+ t('crud.confirm.deleteTitle'),
+ {
+ confirmButtonText: t('common.confirm'),
+ cancelButtonText: t('common.cancel'),
+ type: 'warning'
+ }
+ )
await fetchDeleteOutStock(row.id)
- ElMessage.success('鍒犻櫎鎴愬姛')
+ ElMessage.success(t('crud.messages.deleteSuccess'))
await refreshData()
} catch (error) {
if (error === 'cancel' || error?.message === 'cancel') return
- ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+ ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
}
}
@@ -331,10 +378,11 @@
core: {
apiFn: fetchOutStockPage,
apiParams: buildOutStockPageQueryParams(searchForm.value),
- columnsFactory: () => createOutStockTableColumns({ handleActionClick })
+ columnsFactory: () => createOutStockTableColumns({ handleActionClick, t })
},
transform: {
- dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeOutStockRow(item)) : [])
+ dataTransformer: (records) =>
+ Array.isArray(records) ? records.map((item) => normalizeOutStockRow(item, t)) : []
}
})
@@ -361,11 +409,11 @@
}
}),
resolvePrintRecords,
- buildPreviewRows: (records) => buildOutStockPrintRows(records),
+ buildPreviewRows: (records) => buildOutStockPrintRows(records, t),
buildPreviewMeta: (rows) => {
const now = new Date()
return {
- reportTitle,
+ reportTitle: reportTitle.value,
reportDate: now.toLocaleDateString('zh-CN'),
printedAt: now.toLocaleString('zh-CN', { hour12: false }),
operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -379,7 +427,8 @@
buildOutStockReportMeta({
previewMeta: rawPreviewMeta.value,
count: previewRows.value.length,
- orientation: rawPreviewMeta.value?.reportStyle?.orientation || OUT_STOCK_REPORT_STYLE.orientation
+ orientation: rawPreviewMeta.value?.reportStyle?.orientation || OUT_STOCK_REPORT_STYLE.orientation,
+ t
})
)
diff --git a/rsf-design/src/views/orders/out-stock/modules/out-stock-detail-drawer.vue b/rsf-design/src/views/orders/out-stock/modules/out-stock-detail-drawer.vue
index 98a20e1..3fe0c0c 100644
--- a/rsf-design/src/views/orders/out-stock/modules/out-stock-detail-drawer.vue
+++ b/rsf-design/src/views/orders/out-stock/modules/out-stock-detail-drawer.vue
@@ -1,7 +1,7 @@
<template>
<ElDrawer
v-model="visibleProxy"
- :title="'鍑哄簱鍗曡鎯�'"
+ :title="t('pages.orders.outStock.detail.title')"
size="1180px"
destroy-on-close
append-to-body
@@ -9,43 +9,43 @@
<ElScrollbar class="h-[calc(100vh-180px)] pr-1">
<ElSkeleton :loading="loading" animated :rows="8">
<div class="space-y-4">
- <ElDescriptions title="鍩虹淇℃伅" :column="2" border>
- <ElDescriptionsItem label="鍑哄簱鍗曞彿">{{ detail.code || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="PO鍗曞彿">{{ detail.poCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍗曟嵁绫诲瀷">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="涓氬姟绫诲瀷">{{ detail.wkTypeLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍗曟嵁鐘舵��">
+ <ElDescriptions :title="t('pages.orders.outStock.detail.baseInfo')" :column="2" border>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.code')">{{ detail.code || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.poCode')">{{ detail.poCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.type')">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.wkType')">{{ detail.wkTypeLabel || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.exceStatus')">
<ElTag :type="detail.exceStatusTagType || 'info'">{{ detail.exceStatusText || '--' }}</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="閲婃斁鐘舵��">
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.rleStatus')">
<ElTag :type="detail.rleStatusTagType || 'info'">{{ detail.rleStatusText || '--' }}</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂祦鍗曞彿">{{ detail.logisNo || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="涓氬姟鏃堕棿">{{ detail.businessTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閿�鍞粍缁�">{{ detail.saleOrgName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閿�鍞憳">{{ detail.saleUserName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="瀹㈡埛缂栫爜">{{ detail.customerId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="瀹㈡埛鍚嶇О">{{ detail.customerName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浠撳簱缁勭粐">{{ detail.stockOrgName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴斿嚭鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵ц鏁伴噺">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="宸插嚭鏁伴噺">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.logisNo')">{{ detail.logisNo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.businessTime')">{{ detail.businessTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.saleOrgName')">{{ detail.saleOrgName || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.saleUserName')">{{ detail.saleUserName || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.customerId')">{{ detail.customerId || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.customerName')">{{ detail.customerName || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.stockOrgName')">{{ detail.stockOrgName || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.anfme')">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.workQty')">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.qty')">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.memo')" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
</ElDescriptions>
- <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="淇敼浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="淇敼鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptions :title="t('pages.orders.outStock.detail.auditInfo')" :column="2" border>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.createBy')">{{ detail.createByText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.updateBy')">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.outStock.detail.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
</ElDescriptions>
<div class="space-y-3">
<div class="flex items-center justify-between">
- <div class="text-sm font-medium text-[var(--art-gray-900)]">鍗曟嵁鏄庣粏</div>
+ <div class="text-sm font-medium text-[var(--art-gray-900)]">{{ t('pages.orders.outStock.detail.items') }}</div>
<div class="flex items-center gap-3">
- <ElTag effect="plain">鍏� {{ itemRows.length }} 鏉�</ElTag>
- <ElButton :loading="itemsLoading" @click="$emit('refresh')">鍒锋柊</ElButton>
+ <ElTag effect="plain">{{ t('pages.orders.outStock.detail.count', { count: itemRows.length }) }}</ElTag>
+ <ElButton :loading="itemsLoading" @click="$emit('refresh')">{{ t('common.actions.refresh') }}</ElButton>
</div>
</div>
@@ -66,9 +66,11 @@
<script setup>
import { computed } from 'vue'
+ import { useI18n } from 'vue-i18n'
import ArtTable from '@/components/core/tables/art-table/index.vue'
defineOptions({ name: 'OutStockDetailDrawer' })
+ const { t } = useI18n()
const props = defineProps({
visible: {
diff --git a/rsf-design/src/views/orders/out-stock/outStockPage.helpers.js b/rsf-design/src/views/orders/out-stock/outStockPage.helpers.js
index 19012d1..7e213da 100644
--- a/rsf-design/src/views/orders/out-stock/outStockPage.helpers.js
+++ b/rsf-design/src/views/orders/out-stock/outStockPage.helpers.js
@@ -1,22 +1,28 @@
+function translate(t, key, params) {
+ if (typeof t === 'function') {
+ return t(key, params)
+ }
+ return key
+}
+
const OUT_STOCK_STATUS_META = {
- 8: { text: '鍙栨秷', type: 'danger' },
- 10: { text: '鍒濆鍖�', type: 'info' },
- 11: { text: '寰呭鐞�', type: 'warning' },
- 13: { text: '鐢熸垚宸ヤ綔妗�', type: 'primary' },
- 14: { text: '浣滀笟涓�', type: 'warning' },
- 15: { text: '宸插畬鎴�', type: 'success' }
+ 8: { key: 'pages.orders.outStock.status.cancelled', type: 'danger' },
+ 10: { key: 'pages.orders.outStock.status.initialized', type: 'info' },
+ 11: { key: 'pages.orders.outStock.status.pending', type: 'warning' },
+ 13: { key: 'pages.orders.outStock.status.generated', type: 'primary' },
+ 14: { key: 'pages.orders.outStock.status.running', type: 'warning' },
+ 15: { key: 'pages.orders.outStock.status.completed', type: 'success' }
}
const OUT_STOCK_RLE_STATUS_META = {
- 0: { text: '姝e父', type: 'success' },
- 1: { text: '宸查噴鏀�', type: 'warning' }
+ 0: { key: 'common.status.normal', type: 'success' },
+ 1: { key: 'pages.orders.outStock.status.released', type: 'warning' }
}
const OUT_STOCK_TYPE_META = {
- out: '鍑哄簱鍗�'
+ out: 'pages.orders.outStock.type.out'
}
-export const OUT_STOCK_REPORT_TITLE = '鍑哄簱鍗曟姤琛�'
export const OUT_STOCK_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
@@ -37,30 +43,60 @@
return Number.isNaN(parsed) ? fallback : parsed
}
-function normalizeStatusMeta(exceStatus, exceStatusText) {
+function normalizeStatusMeta(exceStatus, exceStatusText, t) {
if (exceStatusText) {
const fallback = OUT_STOCK_STATUS_META[Number(exceStatus)] || {
text: exceStatusText,
type: 'info'
}
+ if (fallback.key) {
+ return {
+ text: translate(t, fallback.key),
+ type: fallback.type
+ }
+ }
return fallback
}
- return OUT_STOCK_STATUS_META[Number(exceStatus)] || {
- text: normalizeText(exceStatus) || '--',
+
+ const fallback = OUT_STOCK_STATUS_META[Number(exceStatus)]
+ if (fallback?.key) {
+ return {
+ text: translate(t, fallback.key),
+ type: fallback.type
+ }
+ }
+
+ return {
+ text: normalizeText(exceStatus) || translate(t, 'common.placeholder.empty'),
type: 'info'
}
}
-function normalizeRleStatusMeta(rleStatus, rleStatusText) {
+function normalizeRleStatusMeta(rleStatus, rleStatusText, t) {
if (rleStatusText) {
const fallback = OUT_STOCK_RLE_STATUS_META[Number(rleStatus)] || {
text: rleStatusText,
type: 'info'
}
+ if (fallback.key) {
+ return {
+ text: translate(t, fallback.key),
+ type: fallback.type
+ }
+ }
return fallback
}
- return OUT_STOCK_RLE_STATUS_META[Number(rleStatus)] || {
- text: normalizeText(rleStatus) || '--',
+
+ const fallback = OUT_STOCK_RLE_STATUS_META[Number(rleStatus)]
+ if (fallback?.key) {
+ return {
+ text: translate(t, fallback.key),
+ type: fallback.type
+ }
+ }
+
+ return {
+ text: normalizeText(rleStatus) || translate(t, 'common.placeholder.empty'),
type: 'info'
}
}
@@ -111,78 +147,90 @@
}
}
-export function normalizeOutStockRow(record = {}) {
- const statusMeta = normalizeStatusMeta(record.exceStatus, record['exceStatus$'] || record.exceStatusText)
- const rleStatusMeta = normalizeRleStatusMeta(record.rleStatus, record['rleStatus$'] || record.rleStatusText)
+export function getOutStockReportTitle(t) {
+ return translate(t, 'pages.orders.outStock.reportTitle')
+}
+
+export function normalizeOutStockRow(record = {}, t) {
+ const statusMeta = normalizeStatusMeta(record.exceStatus, record['exceStatus$'] || record.exceStatusText, t)
+ const rleStatusMeta = normalizeRleStatusMeta(record.rleStatus, record['rleStatus$'] || record.rleStatusText, t)
const typeValue = normalizeText(record['type$'] || record.type)
return {
...record,
id: record.id ?? null,
- code: normalizeText(record.code) || '--',
- poCode: normalizeText(record.poCode) || '--',
- typeLabel: OUT_STOCK_TYPE_META[typeValue] || typeValue || '--',
- wkTypeLabel: normalizeText(record['wkType$'] || record.wkType) || '--',
+ code: normalizeText(record.code) || translate(t, 'common.placeholder.empty'),
+ poCode: normalizeText(record.poCode) || translate(t, 'common.placeholder.empty'),
+ typeLabel: OUT_STOCK_TYPE_META[typeValue]
+ ? translate(t, OUT_STOCK_TYPE_META[typeValue])
+ : typeValue || translate(t, 'common.placeholder.empty'),
+ wkTypeLabel: normalizeText(record['wkType$'] || record.wkType) || translate(t, 'common.placeholder.empty'),
exceStatusText: statusMeta.text,
exceStatusTagType: statusMeta.type,
rleStatusText: rleStatusMeta.text,
rleStatusTagType: rleStatusMeta.type,
- anfme: record.anfme ?? '--',
- workQty: record.workQty ?? '--',
- qty: record.qty ?? '--',
- logisNo: normalizeText(record.logisNo) || '--',
- saleOrgName: normalizeText(record.saleOrgName) || '--',
- saleUserName: normalizeText(record.saleUserName) || '--',
- businessTimeText: normalizeText(record['businessTime$'] || record.businessTimeText || record.businessTime) || '--',
- customerId: normalizeText(record.customerId) || '--',
- customerName: normalizeText(record.customerName) || '--',
- stockOrgName: normalizeText(record.stockOrgName) || '--',
- createByText: normalizeText(record['createBy$'] || record.createByText) || '--',
- createTimeText: normalizeText(record['createTime$'] || record.createTimeText || record.createTime) || '--',
- updateByText: normalizeText(record['updateBy$'] || record.updateByText) || '--',
- updateTimeText: normalizeText(record['updateTime$'] || record.updateTimeText || record.updateTime) || '--',
- memo: normalizeText(record.memo) || '--',
+ anfme: record.anfme ?? translate(t, 'common.placeholder.empty'),
+ workQty: record.workQty ?? translate(t, 'common.placeholder.empty'),
+ qty: record.qty ?? translate(t, 'common.placeholder.empty'),
+ logisNo: normalizeText(record.logisNo) || translate(t, 'common.placeholder.empty'),
+ saleOrgName: normalizeText(record.saleOrgName) || translate(t, 'common.placeholder.empty'),
+ saleUserName: normalizeText(record.saleUserName) || translate(t, 'common.placeholder.empty'),
+ businessTimeText:
+ normalizeText(record['businessTime$'] || record.businessTimeText || record.businessTime) ||
+ translate(t, 'common.placeholder.empty'),
+ customerId: normalizeText(record.customerId) || translate(t, 'common.placeholder.empty'),
+ customerName: normalizeText(record.customerName) || translate(t, 'common.placeholder.empty'),
+ stockOrgName: normalizeText(record.stockOrgName) || translate(t, 'common.placeholder.empty'),
+ createByText: normalizeText(record['createBy$'] || record.createByText) || translate(t, 'common.placeholder.empty'),
+ createTimeText:
+ normalizeText(record['createTime$'] || record.createTimeText || record.createTime) ||
+ translate(t, 'common.placeholder.empty'),
+ updateByText: normalizeText(record['updateBy$'] || record.updateByText) || translate(t, 'common.placeholder.empty'),
+ updateTimeText:
+ normalizeText(record['updateTime$'] || record.updateTimeText || record.updateTime) ||
+ translate(t, 'common.placeholder.empty'),
+ memo: normalizeText(record.memo) || translate(t, 'common.placeholder.empty'),
canComplete: Number(record.exceStatus) !== 15,
canCancel: Number(record.exceStatus) === 10,
canDelete: Number(record.exceStatus) !== 15
}
}
-export function getOutStockActionList(row = {}) {
- const normalizedRow = normalizeOutStockRow(row)
+export function getOutStockActionList(row = {}, t) {
+ const normalizedRow = normalizeOutStockRow(row, t)
return [
{
key: 'view',
- label: '鏌ョ湅璇︽儏',
+ label: translate(t, 'pages.orders.outStock.actions.view'),
icon: 'ri:eye-line'
},
{
key: 'items',
- label: '鏄庣粏',
+ label: translate(t, 'pages.orders.outStock.actions.items'),
icon: 'ri:list-check-3'
},
{
key: 'print',
- label: '鎵撳嵃',
+ label: translate(t, 'pages.orders.outStock.actions.print'),
icon: 'ri:printer-line'
},
{
key: 'complete',
- label: '瀹屾垚',
+ label: translate(t, 'pages.orders.outStock.actions.complete'),
icon: 'ri:check-line',
color: 'var(--el-color-success)',
disabled: !normalizedRow.canComplete
},
{
key: 'cancel',
- label: '鍙栨秷',
+ label: translate(t, 'pages.orders.outStock.actions.cancel'),
icon: 'ri:close-circle-line',
color: 'var(--el-color-danger)',
disabled: !normalizedRow.canCancel
},
{
key: 'delete',
- label: '鍒犻櫎',
+ label: translate(t, 'pages.orders.outStock.actions.delete'),
icon: 'ri:delete-bin-6-line',
color: 'var(--el-color-danger)',
disabled: !normalizedRow.canDelete
@@ -190,20 +238,21 @@
]
}
-export function buildOutStockPrintRows(records = []) {
+export function buildOutStockPrintRows(records = [], t) {
if (!Array.isArray(records)) {
return []
}
- return records.map((record) => normalizeOutStockRow(record))
+ return records.map((record) => normalizeOutStockRow(record, t))
}
export function buildOutStockReportMeta({
previewMeta = {},
count = 0,
- orientation = OUT_STOCK_REPORT_STYLE.orientation
+ orientation = OUT_STOCK_REPORT_STYLE.orientation,
+ t
} = {}) {
return {
- reportTitle: OUT_STOCK_REPORT_TITLE,
+ reportTitle: getOutStockReportTitle(t),
reportDate: previewMeta.reportDate,
printedAt: previewMeta.printedAt,
operator: previewMeta.operator,
diff --git a/rsf-design/src/views/orders/out-stock/outStockTable.columns.js b/rsf-design/src/views/orders/out-stock/outStockTable.columns.js
index 5fb513f..691485a 100644
--- a/rsf-design/src/views/orders/out-stock/outStockTable.columns.js
+++ b/rsf-design/src/views/orders/out-stock/outStockTable.columns.js
@@ -1,112 +1,114 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
+import { $t } from '@/locales'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
import { getOutStockActionList } from './outStockPage.helpers'
-export function createOutStockTableColumns({ handleActionClick } = {}) {
+export function createOutStockTableColumns({ handleActionClick, t } = {}) {
+ const translate = typeof t === 'function' ? t : $t
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: translate('table.index'), width: 72, align: 'center' },
{
prop: 'code',
- label: '鍑哄簱鍗曞彿',
+ label: translate('pages.orders.outStock.table.code'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.code || '--'
},
{
prop: 'poCode',
- label: 'PO鍗曞彿',
+ label: translate('pages.orders.outStock.table.poCode'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.poCode || '--'
},
{
prop: 'typeLabel',
- label: '鍑哄簱绫诲瀷',
+ label: translate('pages.orders.outStock.table.type'),
minWidth: 120,
showOverflowTooltip: true,
formatter: (row) => row.typeLabel || '--'
},
{
prop: 'wkTypeLabel',
- label: '涓氬姟绫诲瀷',
+ label: translate('pages.orders.outStock.table.wkType'),
minWidth: 130,
showOverflowTooltip: true,
formatter: (row) => row.wkTypeLabel || '--'
},
{
prop: 'customerName',
- label: '瀹㈡埛',
+ label: translate('pages.orders.outStock.table.customerName'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.customerName || '--'
},
{
prop: 'saleOrgName',
- label: '閿�鍞粍缁�',
+ label: translate('pages.orders.outStock.table.saleOrgName'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.saleOrgName || '--'
},
{
prop: 'anfme',
- label: '搴斿嚭鏁伴噺',
+ label: translate('pages.orders.outStock.table.anfme'),
width: 100,
align: 'right',
formatter: (row) => row.anfme ?? '--'
},
{
prop: 'workQty',
- label: '鎵ц鏁伴噺',
+ label: translate('pages.orders.outStock.table.workQty'),
width: 100,
align: 'right',
formatter: (row) => row.workQty ?? '--'
},
{
prop: 'qty',
- label: '宸插嚭鏁伴噺',
+ label: translate('pages.orders.outStock.table.qty'),
width: 100,
align: 'right',
formatter: (row) => row.qty ?? '--'
},
{
prop: 'logisNo',
- label: '鐗╂祦鍗曞彿',
+ label: translate('pages.orders.outStock.table.logisNo'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.logisNo || '--'
},
{
prop: 'rleStatusText',
- label: '閲婃斁鐘舵��',
+ label: translate('pages.orders.outStock.table.rleStatus'),
width: 110,
formatter: (row) =>
h(ElTag, { type: row.rleStatusTagType || 'info', effect: 'light' }, () => row.rleStatusText || '--')
},
{
prop: 'exceStatusText',
- label: '鍗曟嵁鐘舵��',
+ label: translate('pages.orders.outStock.table.exceStatus'),
width: 120,
formatter: (row) =>
h(ElTag, { type: row.exceStatusTagType || 'info', effect: 'light' }, () => row.exceStatusText || '--')
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: translate('pages.orders.outStock.table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: translate('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
formatter: (row) =>
h(ArtButtonMore, {
- list: getOutStockActionList(row),
+ list: getOutStockActionList(row, translate),
onClick: (item) => handleActionClick?.(item, row)
})
}
diff --git a/rsf-design/src/views/orders/preparation/preparationPage.helpers.js b/rsf-design/src/views/orders/preparation/preparationPage.helpers.js
index 6278cca..53bdd34 100644
--- a/rsf-design/src/views/orders/preparation/preparationPage.helpers.js
+++ b/rsf-design/src/views/orders/preparation/preparationPage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
const PREPARATION_STATUS_META = {
8: { text: '鍙栨秷', type: 'danger' },
10: { text: '鍒濆鍖�', type: 'info' },
@@ -185,26 +187,26 @@
export function getPreparationActionList(row = {}) {
const normalizedRow = normalizePreparationRow(row)
return [
- { key: 'view', label: '鏌ョ湅璇︽儏', icon: 'ri:eye-line' },
- { key: 'items', label: '鏄庣粏', icon: 'ri:list-check-3' },
- { key: 'print', label: '鎵撳嵃', icon: 'ri:printer-line' },
+ { key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' },
+ { key: 'items', label: $t('common.actions.items'), icon: 'ri:list-check-3' },
+ { key: 'print', label: $t('common.actions.print'), icon: 'ri:printer-line' },
{
key: 'complete',
- label: '瀹屾垚',
+ label: $t('common.actions.complete'),
icon: 'ri:check-line',
color: 'var(--el-color-success)',
disabled: !normalizedRow.canComplete
},
{
key: 'cancel',
- label: '鍙栨秷',
+ label: $t('common.cancel'),
icon: 'ri:close-circle-line',
color: 'var(--el-color-danger)',
disabled: !normalizedRow.canCancel
},
{
key: 'delete',
- label: '鍒犻櫎',
+ label: $t('common.actions.delete'),
icon: 'ri:delete-bin-6-line',
color: 'var(--el-color-danger)',
disabled: !normalizedRow.canDelete
@@ -214,14 +216,14 @@
export function createPreparationDetailItemColumns() {
return [
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
{ prop: 'matnrCode', label: '鐗╂枡缂栫爜', minWidth: 160, showOverflowTooltip: true },
{ prop: 'maktx', label: '鐗╂枡鍚嶇О', minWidth: 180, showOverflowTooltip: true },
{ prop: 'splrBatch', label: '渚涘簲鍟嗘壒娆�', minWidth: 140, showOverflowTooltip: true },
{ prop: 'splrName', label: '渚涘簲鍟�', minWidth: 160, showOverflowTooltip: true },
{ prop: 'anfme', label: '搴斿嚭鏁伴噺', width: 100, align: 'right' },
{ prop: 'qty', label: '宸插嚭鏁伴噺', width: 100, align: 'right' },
- { prop: 'memo', label: '澶囨敞', minWidth: 160, showOverflowTooltip: true }
+ { prop: 'memo', label: $t('table.remark'), minWidth: 160, showOverflowTooltip: true }
]
}
diff --git a/rsf-design/src/views/orders/purchase/purchaseTable.columns.js b/rsf-design/src/views/orders/purchase/purchaseTable.columns.js
index 2d81a20..b0a577d 100644
--- a/rsf-design/src/views/orders/purchase/purchaseTable.columns.js
+++ b/rsf-design/src/views/orders/purchase/purchaseTable.columns.js
@@ -1,5 +1,6 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
+import { $t } from '@/locales'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
import { getPurchaseStatusMeta } from './purchasePage.helpers'
@@ -14,7 +15,7 @@
} = {}) {
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
{
prop: 'code',
label: 'PO鍗曞彿',
@@ -146,29 +147,29 @@
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
formatter: (row) => {
- const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+ const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
if (handleViewItems) {
operations.push({
key: 'items',
- label: '鏄庣粏',
+ label: $t('common.actions.items'),
icon: 'ri:list-check-3'
})
}
if (canEdit && handleEdit) {
- operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+ operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
}
if (canDelete && handleDelete && canDeleteRow(row)) {
operations.push({
key: 'delete',
- label: '鍒犻櫎',
+ label: $t('common.actions.delete'),
icon: 'ri:delete-bin-5-line',
color: 'var(--art-error)'
})
diff --git a/rsf-design/src/views/orders/transfer-item/index.vue b/rsf-design/src/views/orders/transfer-item/index.vue
index 4981645..3dc2aee 100644
--- a/rsf-design/src/views/orders/transfer-item/index.vue
+++ b/rsf-design/src/views/orders/transfer-item/index.vue
@@ -3,10 +3,10 @@
<ElCard v-if="activeSourceSummary" class="mb-3">
<div class="flex items-center justify-between gap-3">
<div class="flex items-center gap-2 text-sm text-[var(--art-text-gray-600)]">
- <span class="font-medium text-[var(--art-text-gray-900)]">褰撳墠鏉ユ簮</span>
- <span>璋冩嫧鍗旾D锛歿{ activeSourceSummary.transferId }}</span>
+ <span class="font-medium text-[var(--art-text-gray-900)]">{{ t('pages.orders.transferItem.sourceTitle') }}</span>
+ <span>{{ t('pages.orders.transferItem.sourceLabel', { id: activeSourceSummary.transferId }) }}</span>
</div>
- <ElButton link type="primary" @click="handleClearSourceFilter">鏌ョ湅鍏ㄩ儴</ElButton>
+ <ElButton link type="primary" @click="handleClearSourceFilter">{{ t('common.actions.viewAll') }}</ElButton>
</div>
</ElCard>
@@ -59,6 +59,7 @@
<script setup>
import { computed, onMounted, ref, watch } from 'vue'
+ import { useI18n } from 'vue-i18n'
import { ElButton, ElMessage } from 'element-plus'
import { useRoute, useRouter } from 'vue-router'
import { useUserStore } from '@/store/modules/user'
@@ -77,23 +78,24 @@
import { createTransferItemTableColumns } from './transferItemTable.columns.js'
import {
TRANSFER_ITEM_REPORT_STYLE,
- TRANSFER_ITEM_REPORT_TITLE,
buildTransferItemPageQueryParams,
buildTransferItemPrintRows,
buildTransferItemReportMeta,
buildTransferItemSearchParams,
createTransferItemSearchState,
getTransferItemPaginationKey,
+ getTransferItemReportTitle,
getTransferItemStatusOptions,
normalizeTransferItemRow
} from './transferItemPage.helpers.js'
defineOptions({ name: 'TransferItem' })
+ const { t } = useI18n()
const userStore = useUserStore()
const route = useRoute()
const router = useRouter()
- const reportTitle = TRANSFER_ITEM_REPORT_TITLE
+ const reportTitle = computed(() => getTransferItemReportTitle(t))
const searchForm = ref(createTransferItemSearchState())
const selectedRows = ref([])
const detailDrawerVisible = ref(false)
@@ -111,220 +113,220 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('table.keyword'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヨ皟鎷ㄥ崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О/澶囨敞'
+ placeholder: t('pages.orders.transferItem.search.conditionPlaceholder')
}
},
{
- label: '寮�濮嬫椂闂�',
+ label: t('pages.orders.transferItem.search.timeStart'),
key: 'timeStart',
type: 'datetime',
props: {
clearable: true,
format: 'YYYY-MM-DD HH:mm:ss',
valueFormat: 'YYYY-MM-DD HH:mm:ss',
- placeholder: '璇烽�夋嫨寮�濮嬫椂闂�'
+ placeholder: t('pages.orders.transferItem.search.timeStartPlaceholder')
}
},
{
- label: '缁撴潫鏃堕棿',
+ label: t('pages.orders.transferItem.search.timeEnd'),
key: 'timeEnd',
type: 'datetime',
props: {
clearable: true,
format: 'YYYY-MM-DD HH:mm:ss',
valueFormat: 'YYYY-MM-DD HH:mm:ss',
- placeholder: '璇烽�夋嫨缁撴潫鏃堕棿'
+ placeholder: t('pages.orders.transferItem.search.timeEndPlaceholder')
}
},
{
- label: '璋冩嫧鍗旾D',
+ label: t('pages.orders.transferItem.search.transferId'),
key: 'transferId',
type: 'inputNumber',
props: {
clearable: true,
controlsPosition: 'right',
- placeholder: '璇疯緭鍏ヨ皟鎷ㄥ崟ID'
+ placeholder: t('pages.orders.transferItem.search.transferIdPlaceholder')
}
},
{
- label: '璋冩嫧鍗曞彿',
+ label: t('pages.orders.transferItem.search.transferCode'),
key: 'transferCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヨ皟鎷ㄥ崟鍙�'
+ placeholder: t('pages.orders.transferItem.search.transferCodePlaceholder')
}
},
{
- label: '鐗╂枡ID',
+ label: t('pages.orders.transferItem.search.matnrId'),
key: 'matnrId',
type: 'inputNumber',
props: {
clearable: true,
controlsPosition: 'right',
- placeholder: '璇疯緭鍏ョ墿鏂橧D'
+ placeholder: t('pages.orders.transferItem.search.matnrIdPlaceholder')
}
},
{
- label: '鐗╂枡鍚嶇О',
+ label: t('table.materialName'),
key: 'maktx',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+ placeholder: t('pages.orders.transferItem.search.maktxPlaceholder')
}
},
{
- label: '鐗╂枡缂栫爜',
+ label: t('table.materialCode'),
key: 'matnrCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+ placeholder: t('pages.orders.transferItem.search.matnrCodePlaceholder')
}
},
{
- label: '鍗曚綅',
+ label: t('table.unit'),
key: 'unit',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ崟浣�'
+ placeholder: t('pages.orders.transferItem.search.unitPlaceholder')
}
},
{
- label: '鏁伴噺',
+ label: t('table.quantity'),
key: 'anfme',
type: 'inputNumber',
props: {
clearable: true,
controlsPosition: 'right',
- placeholder: '璇疯緭鍏ユ暟閲�'
+ placeholder: t('pages.orders.transferItem.search.anfmePlaceholder')
}
},
{
- label: '宸插畬鎴愭暟閲�',
+ label: t('pages.orders.transferItem.search.qty'),
key: 'qty',
type: 'inputNumber',
props: {
clearable: true,
controlsPosition: 'right',
- placeholder: '璇疯緭鍏ュ凡瀹屾垚鏁伴噺'
+ placeholder: t('pages.orders.transferItem.search.qtyPlaceholder')
}
},
{
- label: '鎵ц鏁伴噺',
+ label: t('pages.orders.transferItem.search.workQty'),
key: 'workQty',
type: 'inputNumber',
props: {
clearable: true,
controlsPosition: 'right',
- placeholder: '璇疯緭鍏ユ墽琛屾暟閲�'
+ placeholder: t('pages.orders.transferItem.search.workQtyPlaceholder')
}
},
{
- label: '鎵规',
+ label: t('table.batch'),
key: 'batch',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユ壒娆�'
+ placeholder: t('pages.orders.transferItem.search.batchPlaceholder')
}
},
{
- label: '渚涘簲鍟咺D',
+ label: t('pages.orders.transferItem.search.splrId'),
key: 'splrId',
type: 'inputNumber',
props: {
clearable: true,
controlsPosition: 'right',
- placeholder: '璇疯緭鍏ヤ緵搴斿晢ID'
+ placeholder: t('pages.orders.transferItem.search.splrIdPlaceholder')
}
},
{
- label: '瑙勬牸',
+ label: t('pages.orders.transferItem.search.spec'),
key: 'spec',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヨ鏍�'
+ placeholder: t('pages.orders.transferItem.search.specPlaceholder')
}
},
{
- label: '鍨嬪彿',
+ label: t('pages.orders.transferItem.search.model'),
key: 'model',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ瀷鍙�'
+ placeholder: t('pages.orders.transferItem.search.modelPlaceholder')
}
},
{
- label: '瀛楁绱㈠紩',
+ label: t('pages.orders.transferItem.search.fieldsIndex'),
key: 'fieldsIndex',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ瓧娈电储寮�'
+ placeholder: t('pages.orders.transferItem.search.fieldsIndexPlaceholder')
}
},
{
- label: '骞冲彴琛屽彿',
+ label: t('pages.orders.transferItem.search.platItemId'),
key: 'platItemId',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ钩鍙拌鍙�'
+ placeholder: t('pages.orders.transferItem.search.platItemIdPlaceholder')
}
},
{
- label: '瀹㈡埛璁㈠崟鍙�',
+ label: t('pages.orders.transferItem.search.platOrderCode'),
key: 'platOrderCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ鎴疯鍗曞彿'
+ placeholder: t('pages.orders.transferItem.search.platOrderCodePlaceholder')
}
},
{
- label: '宸ュ崟鍙�',
+ label: t('pages.orders.transferItem.search.platWorkCode'),
key: 'platWorkCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ伐鍗曞彿'
+ placeholder: t('pages.orders.transferItem.search.platWorkCodePlaceholder')
}
},
{
- label: '椤圭洰鍙�',
+ label: t('pages.orders.transferItem.search.projectCode'),
key: 'projectCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ラ」鐩彿'
+ placeholder: t('pages.orders.transferItem.search.projectCodePlaceholder')
}
},
{
- label: '澶囨敞',
+ label: t('table.memo'),
key: 'memo',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ娉�'
+ placeholder: t('pages.orders.transferItem.search.memoPlaceholder')
}
},
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: {
clearable: true,
- options: getTransferItemStatusOptions()
+ options: getTransferItemStatusOptions(t)
}
}
])
@@ -354,12 +356,13 @@
paginationKey: getTransferItemPaginationKey(),
columnsFactory: () =>
createTransferItemTableColumns({
- handleView: openDetail
+ handleView: openDetail,
+ t
})
},
transform: {
dataTransformer: (records) =>
- Array.isArray(records) ? records.map((item) => normalizeTransferItemRow(item)) : []
+ Array.isArray(records) ? records.map((item) => normalizeTransferItemRow(item, t)) : []
}
})
@@ -368,13 +371,13 @@
detailLoading.value = true
try {
const detail = await guardRequestWithMessage(fetchTransferItemDetail(row.id), {}, {
- timeoutMessage: '璋冩嫧鏄庣粏璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.orders.transferItem.messages.detailTimeout')
})
- detailData.value = normalizeTransferItemRow(detail)
+ detailData.value = normalizeTransferItemRow(detail, t)
} catch (error) {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇璋冩嫧鏄庣粏璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.orders.transferItem.messages.detailFailed'))
} finally {
detailLoading.value = false
}
@@ -447,11 +450,11 @@
}
}),
resolvePrintRecords,
- buildPreviewRows: (records) => buildTransferItemPrintRows(records),
+ buildPreviewRows: (records) => buildTransferItemPrintRows(records, t),
buildPreviewMeta: (rows) => {
const now = new Date()
return {
- reportTitle,
+ reportTitle: reportTitle.value,
reportDate: now.toLocaleDateString('zh-CN'),
printedAt: now.toLocaleString('zh-CN', { hour12: false }),
operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -467,7 +470,8 @@
buildTransferItemReportMeta({
previewMeta: previewMeta.value,
count: previewRows.value.length,
- orientation: previewMeta.value?.reportStyle?.orientation || TRANSFER_ITEM_REPORT_STYLE.orientation
+ orientation: previewMeta.value?.reportStyle?.orientation || TRANSFER_ITEM_REPORT_STYLE.orientation,
+ t
})
)
diff --git a/rsf-design/src/views/orders/transfer-item/modules/transfer-item-detail-drawer.vue b/rsf-design/src/views/orders/transfer-item/modules/transfer-item-detail-drawer.vue
index 4a824f6..0eab81b 100644
--- a/rsf-design/src/views/orders/transfer-item/modules/transfer-item-detail-drawer.vue
+++ b/rsf-design/src/views/orders/transfer-item/modules/transfer-item-detail-drawer.vue
@@ -1,7 +1,7 @@
<template>
<ElDrawer
:model-value="visible"
- title="璋冩嫧鏄庣粏璇︽儏"
+ :title="t('pages.orders.transferItem.detail.title')"
size="72%"
destroy-on-close
append-to-body
@@ -10,46 +10,46 @@
<ElScrollbar class="h-[calc(100vh-120px)]">
<ElSkeleton :loading="loading" animated :rows="10">
<div class="flex min-h-full flex-col gap-4 pr-2">
- <ElDescriptions title="鍩虹淇℃伅" :column="3" border>
- <ElDescriptionsItem label="璋冩嫧鍗旾D">{{ displayData.transferId ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="璋冩嫧鍗曞彿">{{ displayData.transferCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">
+ <ElDescriptions :title="t('pages.orders.transferItem.detail.baseInfo')" :column="3" border>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.transferId')">{{ displayData.transferId ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.transferCode')">{{ displayData.transferCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.status')">
<ElTag :type="displayData.statusType || 'info'" effect="light">
- {{ displayData.statusText || '--' }}
+ {{ displayData.statusText || t('common.placeholder.empty') }}
</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟嗙紪鐮�">{{ displayData.splrCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟咺D">{{ displayData.splrId ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟嗗悕绉�">{{ displayData.splrName || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞" :span="3">{{ displayData.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.supplierCode')">{{ displayData.splrCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.splrId')">{{ displayData.splrId ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.supplierName')">{{ displayData.splrName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.memo')" :span="3">{{ displayData.memo || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
- <ElDescriptions title="鐗╂枡淇℃伅" :column="3" border>
- <ElDescriptionsItem label="鐗╂枡ID">{{ displayData.matnrId ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ displayData.matnrCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ displayData.maktx || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="瑙勬牸">{{ displayData.spec || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍨嬪彿">{{ displayData.model || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵规">{{ displayData.batch || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍗曚綅">{{ displayData.unit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏁伴噺">{{ displayData.anfme ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵ц鏁伴噺">{{ displayData.workQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="宸插畬鎴愭暟閲�">{{ displayData.qty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptions :title="t('pages.orders.transferItem.detail.materialInfo')" :column="3" border>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.matnrId')">{{ displayData.matnrId ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.materialCode')">{{ displayData.matnrCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.materialName')">{{ displayData.maktx || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.spec')">{{ displayData.spec || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.model')">{{ displayData.model || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.batch')">{{ displayData.batch || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.unit')">{{ displayData.unit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.quantity')">{{ displayData.anfme ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.workQty')">{{ displayData.workQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.qty')">{{ displayData.qty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
- <ElDescriptions title="骞冲彴淇℃伅" :column="3" border>
- <ElDescriptionsItem label="瀛楁绱㈠紩">{{ displayData.fieldsIndex || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="骞冲彴琛屽彿">{{ displayData.platItemId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="瀹㈡埛璁㈠崟鍙�">{{ displayData.platOrderCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="宸ュ崟鍙�">{{ displayData.platWorkCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="椤圭洰鍙�">{{ displayData.projectCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptions :title="t('pages.orders.transferItem.detail.platformInfo')" :column="3" border>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.fieldsIndex')">{{ displayData.fieldsIndex || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.platItemId')">{{ displayData.platItemId || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.platOrderCode')">{{ displayData.platOrderCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.platWorkCode')">{{ displayData.platWorkCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.projectCode')">{{ displayData.projectCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
- <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ displayData.createByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ displayData.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊浜�">{{ displayData.updateByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ displayData.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptions :title="t('pages.orders.transferItem.detail.auditInfo')" :column="2" border>
+ <ElDescriptionsItem :label="t('table.createBy')">{{ displayData.createByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{ displayData.createTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateBy')">{{ displayData.updateByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{ displayData.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
</div>
</ElSkeleton>
@@ -59,8 +59,11 @@
<script setup>
import { computed } from 'vue'
+ import { useI18n } from 'vue-i18n'
import { normalizeTransferItemRow } from '../transferItemPage.helpers.js'
+ const { t } = useI18n()
+
defineOptions({ name: 'TransferItemDetailDrawer' })
const props = defineProps({
diff --git a/rsf-design/src/views/orders/transfer-item/transferItemPage.helpers.js b/rsf-design/src/views/orders/transfer-item/transferItemPage.helpers.js
index bce45e0..4209bcb 100644
--- a/rsf-design/src/views/orders/transfer-item/transferItemPage.helpers.js
+++ b/rsf-design/src/views/orders/transfer-item/transferItemPage.helpers.js
@@ -1,4 +1,8 @@
-export const TRANSFER_ITEM_REPORT_TITLE = '璋冩嫧鏄庣粏鎶ヨ〃'
+import { $t } from '@/locales'
+
+export function getTransferItemReportTitle(t = $t) {
+ return t('pages.orders.transferItem.reportTitle')
+}
export const TRANSFER_ITEM_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
@@ -8,9 +12,11 @@
showBorder: true
}
-const STATUS_META = {
- 1: { text: '姝e父', type: 'success', bool: true },
- 0: { text: '鍐荤粨', type: 'danger', bool: false }
+function getTransferItemStatusMetaMap(t = $t) {
+ return {
+ 1: { text: t('common.status.normal'), type: 'success', bool: true },
+ 0: { text: t('common.status.frozen'), type: 'danger', bool: false }
+ }
}
function normalizeText(value, fallback = '--') {
@@ -43,10 +49,11 @@
}
}
-function getStatusMeta(status, statusText) {
+function getStatusMeta(status, statusText, t = $t) {
const numericStatus = Number(status)
- return STATUS_META[numericStatus] || {
- text: normalizeText(statusText || status || '--'),
+ const statusMetaMap = getTransferItemStatusMetaMap(t)
+ return statusMetaMap[numericStatus] || {
+ text: normalizeText(statusText || status || t('common.status.unknown')),
type: 'info',
bool: false
}
@@ -87,21 +94,22 @@
}
}
-export function getTransferItemStatusOptions() {
+export function getTransferItemStatusOptions(t = $t) {
return [
- { label: '姝e父', value: 1 },
- { label: '鍐荤粨', value: 0 }
+ { label: t('common.status.normal'), value: 1 },
+ { label: t('common.status.frozen'), value: 0 }
]
}
-export function getTransferItemStatusMeta(status) {
+export function getTransferItemStatusMeta(status, t = $t) {
+ const statusMetaMap = getTransferItemStatusMetaMap(t)
if (status === true || Number(status) === 1) {
- return STATUS_META[1]
+ return statusMetaMap[1]
}
if (status === false || Number(status) === 0) {
- return STATUS_META[0]
+ return statusMetaMap[0]
}
- return { text: '鏈煡', type: 'info', bool: false }
+ return { text: t('common.status.unknown'), type: 'info', bool: false }
}
export function buildTransferItemSearchParams(params = {}) {
@@ -141,8 +149,8 @@
}
}
-export function normalizeTransferItemRow(record = {}) {
- const statusMeta = getStatusMeta(record.statusBool ?? record.status, record['status$'] || record.statusText)
+export function normalizeTransferItemRow(record = {}, t = $t) {
+ const statusMeta = getStatusMeta(record.statusBool ?? record.status, record['status$'] || record.statusText, t)
return {
...record,
@@ -178,20 +186,21 @@
}
}
-export function buildTransferItemPrintRows(records = []) {
+export function buildTransferItemPrintRows(records = [], t = $t) {
if (!Array.isArray(records)) {
return []
}
- return records.map((record) => normalizeTransferItemRow(record))
+ return records.map((record) => normalizeTransferItemRow(record, t))
}
export function buildTransferItemReportMeta({
previewMeta = {},
count = 0,
- orientation = TRANSFER_ITEM_REPORT_STYLE.orientation
+ orientation = TRANSFER_ITEM_REPORT_STYLE.orientation,
+ t = $t
} = {}) {
return {
- reportTitle: TRANSFER_ITEM_REPORT_TITLE,
+ reportTitle: getTransferItemReportTitle(t),
reportDate: previewMeta.reportDate,
printedAt: previewMeta.printedAt,
operator: previewMeta.operator,
@@ -202,4 +211,3 @@
}
}
}
-
diff --git a/rsf-design/src/views/orders/transfer-item/transferItemTable.columns.js b/rsf-design/src/views/orders/transfer-item/transferItemTable.columns.js
index 038fdd8..367e6fc 100644
--- a/rsf-design/src/views/orders/transfer-item/transferItemTable.columns.js
+++ b/rsf-design/src/views/orders/transfer-item/transferItemTable.columns.js
@@ -1,140 +1,141 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
-export function createTransferItemTableColumns({ handleView } = {}) {
+export function createTransferItemTableColumns({ handleView, t = $t } = {}) {
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: t('table.index'), width: 72, align: 'center' },
{
prop: 'transferId',
- label: '璋冩嫧鍗旾D',
+ label: t('pages.orders.transferItem.table.transferId'),
width: 110,
align: 'right',
formatter: (row) => row.transferId ?? '--'
},
{
prop: 'transferCode',
- label: '璋冩嫧鍗曞彿',
+ label: t('pages.orders.transferItem.table.transferCode'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.transferCode || '--'
},
{
prop: 'matnrCode',
- label: '鐗╂枡缂栫爜',
+ label: t('table.materialCode'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.matnrCode || '--'
},
{
prop: 'maktx',
- label: '鐗╂枡鍚嶇О',
+ label: t('table.materialName'),
minWidth: 220,
showOverflowTooltip: true,
formatter: (row) => row.maktx || '--'
},
{
prop: 'spec',
- label: '瑙勬牸',
+ label: t('pages.orders.transferItem.table.spec'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.spec || '--'
},
{
prop: 'model',
- label: '鍨嬪彿',
+ label: t('pages.orders.transferItem.table.model'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.model || '--'
},
{
prop: 'batch',
- label: '鎵规',
+ label: t('table.batch'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.batch || '--'
},
{
prop: 'unit',
- label: '鍗曚綅',
+ label: t('table.unit'),
width: 90,
align: 'center',
formatter: (row) => row.unit || '--'
},
{
prop: 'anfme',
- label: '鏁伴噺',
+ label: t('table.quantity'),
width: 100,
align: 'right',
formatter: (row) => row.anfme ?? '--'
},
{
prop: 'workQty',
- label: '鎵ц鏁伴噺',
+ label: t('pages.orders.transferItem.table.workQty'),
width: 110,
align: 'right',
formatter: (row) => row.workQty ?? '--'
},
{
prop: 'qty',
- label: '宸插畬鎴愭暟閲�',
+ label: t('pages.orders.transferItem.table.qty'),
width: 120,
align: 'right',
formatter: (row) => row.qty ?? '--'
},
{
prop: 'splrCode',
- label: '渚涘簲鍟嗙紪鐮�',
+ label: t('pages.orders.transferItem.table.supplierCode'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.splrCode || '--'
},
{
prop: 'splrName',
- label: '渚涘簲鍟嗗悕绉�',
+ label: t('pages.orders.transferItem.table.supplierName'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.splrName || '--'
},
{
prop: 'fieldsIndex',
- label: '瀛楁绱㈠紩',
+ label: t('pages.orders.transferItem.table.fieldsIndex'),
minWidth: 130,
showOverflowTooltip: true,
formatter: (row) => row.fieldsIndex || '--'
},
{
prop: 'platItemId',
- label: '骞冲彴琛屽彿',
+ label: t('pages.orders.transferItem.table.platItemId'),
minWidth: 130,
showOverflowTooltip: true,
formatter: (row) => row.platItemId || '--'
},
{
prop: 'platOrderCode',
- label: '瀹㈡埛璁㈠崟鍙�',
+ label: t('pages.orders.transferItem.table.platOrderCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.platOrderCode || '--'
},
{
prop: 'platWorkCode',
- label: '宸ュ崟鍙�',
+ label: t('pages.orders.transferItem.table.platWorkCode'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => row.platWorkCode || '--'
},
{
prop: 'projectCode',
- label: '椤圭洰鍙�',
+ label: t('pages.orders.transferItem.table.projectCode'),
minWidth: 140,
showOverflowTooltip: true,
formatter: (row) => row.projectCode || '--'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: t('table.status'),
width: 96,
align: 'center',
formatter: (row) =>
@@ -142,14 +143,14 @@
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: t('table.updateTime'),
minWidth: 170,
showOverflowTooltip: true,
formatter: (row) => row.updateTimeText || '--'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: t('table.operation'),
width: 96,
fixed: 'right',
align: 'center',
@@ -161,4 +162,3 @@
}
]
}
-
diff --git a/rsf-design/src/views/orders/transfer/index.vue b/rsf-design/src/views/orders/transfer/index.vue
index 618f804..2088f25 100644
--- a/rsf-design/src/views/orders/transfer/index.vue
+++ b/rsf-design/src/views/orders/transfer/index.vue
@@ -106,7 +106,6 @@
import { createTransferTableColumns } from './transferTable.columns.js'
import {
TRANSFER_REPORT_STYLE,
- TRANSFER_REPORT_TITLE,
buildTransferDetailOrderQueryParams,
buildTransferDialogModel,
buildTransferPageQueryParams,
@@ -117,6 +116,7 @@
createTransferFormState,
createTransferSearchState,
getTransferPaginationKey,
+ getTransferReportTitle,
getTransferSourceOptions,
getTransferStatusOptions,
getTransferExceStatusOptions,
@@ -134,7 +134,7 @@
const router = useRouter()
const { t } = useI18n()
- const reportTitle = TRANSFER_REPORT_TITLE
+ const reportTitle = computed(() => getTransferReportTitle(t))
const searchForm = ref(createTransferSearchState())
const typeOptions = ref([])
const areaOptions = ref([])
@@ -177,7 +177,7 @@
label: t('pages.orders.transfer.search.exceStatus'),
key: 'exceStatus',
type: 'select',
- props: { clearable: true, options: getTransferExceStatusOptions() }
+ props: { clearable: true, options: getTransferExceStatusOptions(t) }
},
{ label: t('pages.orders.transfer.search.orgWareName'), key: 'orgWareName', type: 'input', props: { clearable: true, placeholder: t('pages.orders.transfer.placeholder.orgWareName') } },
{ label: t('pages.orders.transfer.search.tarWareName'), key: 'tarWareName', type: 'input', props: { clearable: true, placeholder: t('pages.orders.transfer.placeholder.tarWareName') } },
@@ -187,7 +187,7 @@
label: t('pages.orders.transfer.search.status'),
key: 'status',
type: 'select',
- props: { clearable: true, options: getTransferStatusOptions() }
+ props: { clearable: true, options: getTransferStatusOptions(t) }
},
{ label: t('pages.orders.transfer.search.memo'), key: 'memo', type: 'input', props: { clearable: true, placeholder: t('pages.orders.transfer.placeholder.memo') } }
])
@@ -205,7 +205,7 @@
{},
{ timeoutMessage: t('pages.orders.transfer.messages.detailTimeout') }
)
- detailData.value = normalizeTransferDetailRecord(response)
+ detailData.value = normalizeTransferDetailRecord(response, t)
} finally {
detailLoading.value = false
}
@@ -226,7 +226,7 @@
{ timeoutMessage: t('pages.orders.transfer.messages.ordersTimeout') }
)
const normalized = defaultResponseAdapter(response)
- detailOrderRows.value = normalized.records.map((item) => normalizeTransferOrderRow(item))
+ detailOrderRows.value = normalized.records.map((item) => normalizeTransferOrderRow(item, t))
detailOrderPagination.total = Number(normalized.total || 0)
detailOrderPagination.current = Number(normalized.current || detailOrderPagination.current || 1)
detailOrderPagination.size = Number(normalized.size || detailOrderPagination.size || 20)
@@ -349,7 +349,7 @@
columnsFactory: () => createTransferTableColumns({ handleActionClick })
},
transform: {
- dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeTransferRow(item)) : [])
+ dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeTransferRow(item, t)) : [])
}
})
@@ -454,11 +454,11 @@
}
}),
resolvePrintRecords,
- buildPreviewRows: (records) => buildTransferPrintRows(records),
+ buildPreviewRows: (records) => buildTransferPrintRows(records, t),
buildPreviewMeta: (rows) => {
const now = new Date()
return {
- reportTitle,
+ reportTitle: reportTitle.value,
reportDate: now.toLocaleDateString('zh-CN'),
printedAt: now.toLocaleString('zh-CN', { hour12: false }),
operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -478,7 +478,8 @@
buildTransferReportMeta({
previewMeta: rawPreviewMeta.value,
count: previewRows.value.length,
- orientation: rawPreviewMeta.value?.reportStyle?.orientation || TRANSFER_REPORT_STYLE.orientation
+ orientation: rawPreviewMeta.value?.reportStyle?.orientation || TRANSFER_REPORT_STYLE.orientation,
+ t
})
)
diff --git a/rsf-design/src/views/orders/transfer/transferPage.helpers.js b/rsf-design/src/views/orders/transfer/transferPage.helpers.js
index d3fdeb3..2b3200a 100644
--- a/rsf-design/src/views/orders/transfer/transferPage.helpers.js
+++ b/rsf-design/src/views/orders/transfer/transferPage.helpers.js
@@ -1,24 +1,32 @@
import { $t } from '@/locales'
-const TRANSFER_SOURCE_META = {
- 1: { text: $t('pages.orders.transfer.status.sourceErp'), type: 'info' },
- 2: { text: $t('pages.orders.transfer.status.sourceWms'), type: 'primary' },
- 3: { text: $t('pages.orders.transfer.status.sourceExcel'), type: 'warning' },
- 4: { text: $t('pages.orders.transfer.status.sourceQms'), type: 'success' }
+function getTransferSourceMetaMap(t = $t) {
+ return {
+ 1: { text: t('pages.orders.transfer.status.sourceErp'), type: 'info' },
+ 2: { text: t('pages.orders.transfer.status.sourceWms'), type: 'primary' },
+ 3: { text: t('pages.orders.transfer.status.sourceExcel'), type: 'warning' },
+ 4: { text: t('pages.orders.transfer.status.sourceQms'), type: 'success' }
+ }
}
-const TRANSFER_EXCE_STATUS_META = {
- 0: { text: $t('pages.orders.transfer.status.pending'), type: 'info' },
- 1: { text: $t('pages.orders.transfer.status.running'), type: 'warning' },
- 2: { text: $t('pages.orders.transfer.status.completed'), type: 'success' }
+function getTransferExceStatusMetaMap(t = $t) {
+ return {
+ 0: { text: t('pages.orders.transfer.status.pending'), type: 'info' },
+ 1: { text: t('pages.orders.transfer.status.running'), type: 'warning' },
+ 2: { text: t('pages.orders.transfer.status.completed'), type: 'success' }
+ }
}
-const TRANSFER_STATUS_META = {
- 1: { text: $t('pages.orders.transfer.status.normal'), type: 'success', bool: true },
- 0: { text: $t('pages.orders.transfer.status.frozen'), type: 'danger', bool: false }
+function getTransferStatusMetaMap(t = $t) {
+ return {
+ 1: { text: t('pages.orders.transfer.status.normal'), type: 'success', bool: true },
+ 0: { text: t('pages.orders.transfer.status.frozen'), type: 'danger', bool: false }
+ }
}
-export const TRANSFER_REPORT_TITLE = $t('pages.orders.transfer.reportTitle')
+export function getTransferReportTitle(t = $t) {
+ return t('pages.orders.transfer.reportTitle')
+}
export const TRANSFER_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
@@ -111,18 +119,18 @@
]
}
-export function getTransferStatusOptions() {
+export function getTransferStatusOptions(t = $t) {
return [
- { label: $t('pages.orders.transfer.status.normal'), value: 1 },
- { label: $t('pages.orders.transfer.status.frozen'), value: 0 }
+ { label: t('pages.orders.transfer.status.normal'), value: 1 },
+ { label: t('pages.orders.transfer.status.frozen'), value: 0 }
]
}
-export function getTransferExceStatusOptions() {
+export function getTransferExceStatusOptions(t = $t) {
return [
- { label: $t('pages.orders.transfer.status.pending'), value: 0 },
- { label: $t('pages.orders.transfer.status.running'), value: 1 },
- { label: $t('pages.orders.transfer.status.completed'), value: 2 }
+ { label: t('pages.orders.transfer.status.pending'), value: 0 },
+ { label: t('pages.orders.transfer.status.running'), value: 1 },
+ { label: t('pages.orders.transfer.status.completed'), value: 2 }
]
}
@@ -218,10 +226,10 @@
return normalizeText(record[`${key}WareName$`] || record[`${key}WareName`] || record[`${key}WareId$`] || record[`${key}WareId`])
}
-export function normalizeTransferRow(record = {}) {
- const statusMeta = metaByValue(record.statusBool ?? record.status, TRANSFER_STATUS_META, $t('common.status.unknown'))
- const exceStatusMeta = metaByValue(record.exceStatus, TRANSFER_EXCE_STATUS_META, record.exceStatusText)
- const sourceMeta = metaByValue(record.source, TRANSFER_SOURCE_META, record.sourceText)
+export function normalizeTransferRow(record = {}, t = $t) {
+ const statusMeta = metaByValue(record.statusBool ?? record.status, getTransferStatusMetaMap(t), t('common.status.unknown'))
+ const exceStatusMeta = metaByValue(record.exceStatus, getTransferExceStatusMetaMap(t), record.exceStatusText)
+ const sourceMeta = metaByValue(record.source, getTransferSourceMetaMap(t), record.sourceText)
return {
...record,
id: record.id ?? null,
@@ -246,13 +254,13 @@
}
}
-export function normalizeTransferDetailRecord(record = {}) {
- return normalizeTransferRow(record)
+export function normalizeTransferDetailRecord(record = {}, t = $t) {
+ return normalizeTransferRow(record, t)
}
-export function normalizeTransferOrderRow(record = {}) {
- const statusMeta = metaByValue(record.statusBool ?? record.status, TRANSFER_STATUS_META, $t('common.status.unknown'))
- const exceStatusMeta = metaByValue(record.exceStatus, TRANSFER_EXCE_STATUS_META, record.exceStatusText)
+export function normalizeTransferOrderRow(record = {}, t = $t) {
+ const statusMeta = metaByValue(record.statusBool ?? record.status, getTransferStatusMetaMap(t), t('common.status.unknown'))
+ const exceStatusMeta = metaByValue(record.exceStatus, getTransferExceStatusMetaMap(t), record.exceStatusText)
return {
...record,
id: record.id ?? null,
@@ -278,21 +286,22 @@
}
}
-export function buildTransferPrintRows(records = []) {
- return Array.isArray(records) ? records.map((record) => normalizeTransferRow(record)) : []
+export function buildTransferPrintRows(records = [], t = $t) {
+ return Array.isArray(records) ? records.map((record) => normalizeTransferRow(record, t)) : []
}
-export function buildTransferOrderPrintRows(records = []) {
- return Array.isArray(records) ? records.map((record) => normalizeTransferOrderRow(record)) : []
+export function buildTransferOrderPrintRows(records = [], t = $t) {
+ return Array.isArray(records) ? records.map((record) => normalizeTransferOrderRow(record, t)) : []
}
export function buildTransferReportMeta({
previewMeta = {},
count = 0,
- orientation = TRANSFER_REPORT_STYLE.orientation
+ orientation = TRANSFER_REPORT_STYLE.orientation,
+ t = $t
} = {}) {
return {
- reportTitle: TRANSFER_REPORT_TITLE,
+ reportTitle: getTransferReportTitle(t),
reportDate: previewMeta.reportDate,
printedAt: previewMeta.printedAt,
operator: previewMeta.operator,
diff --git a/rsf-design/src/views/orders/wave-item/index.vue b/rsf-design/src/views/orders/wave-item/index.vue
index 0271f9a..f41d644 100644
--- a/rsf-design/src/views/orders/wave-item/index.vue
+++ b/rsf-design/src/views/orders/wave-item/index.vue
@@ -45,6 +45,7 @@
<script setup>
import { computed, ref } from 'vue'
+ import { useI18n } from 'vue-i18n'
import { useUserStore } from '@/store/modules/user'
import { useTable } from '@/hooks/core/useTable'
import { usePrintExportPage } from '@/views/system/common/usePrintExportPage'
@@ -57,6 +58,7 @@
buildWaveItemReportMeta,
buildWaveItemSearchParams,
createWaveItemSearchState,
+ getWaveItemReportTitle,
normalizeWaveItemRow
} from './waveItemPage.helpers'
import { createWaveItemDetailColumns, createWaveItemTableColumns } from './waveItemTable.columns'
@@ -65,8 +67,9 @@
defineOptions({ name: 'WaveItemOrder' })
+ const { t } = useI18n()
const userStore = useUserStore()
- const reportTitle = '娉㈡鏄庣粏鎶ヨ〃'
+ const reportTitle = computed(() => getWaveItemReportTitle(t))
const searchForm = ref(createWaveItemSearchState())
const selectedRows = ref([])
const detailDrawerVisible = ref(false)
@@ -75,16 +78,16 @@
const reportQueryParams = computed(() => buildWaveItemSearchParams(searchForm.value))
const searchItems = computed(() => [
- { label: '鍏抽敭瀛�', key: 'condition', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ユ尝娆″崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О' } },
- { label: '娉㈡鍗曞彿', key: 'waveCode', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ユ尝娆″崟鍙�' } },
- { label: '鍗曟嵁缂栫爜', key: 'orderCode', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ崟鎹紪鐮�' } },
- { label: '鐗╂枡缂栫爜', key: 'matnrCode', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�' } },
- { label: '鐗╂枡鍚嶇О', key: 'maktx', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�' } },
- { label: '鎵规', key: 'batch', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ユ壒娆�' } },
- { label: '渚涘簲鍟嗘壒娆�', key: 'splrBatch', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ヤ緵搴斿晢鎵规' } },
- { label: '鍔ㄦ�佸瓧娈电储寮�', key: 'fieldsIndex', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ姩鎬佸瓧娈电储寮�' } },
- { label: '寮�濮嬫椂闂�', key: 'timeStart', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } },
- { label: '缁撴潫鏃堕棿', key: 'timeEnd', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } }
+ { label: t('pages.orders.waveItem.search.condition'), key: 'condition', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.conditionPlaceholder') } },
+ { label: t('pages.orders.waveItem.search.waveCode'), key: 'waveCode', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.waveCodePlaceholder') } },
+ { label: t('pages.orders.waveItem.search.orderCode'), key: 'orderCode', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.orderCodePlaceholder') } },
+ { label: t('pages.orders.waveItem.search.matnrCode'), key: 'matnrCode', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.matnrCodePlaceholder') } },
+ { label: t('pages.orders.waveItem.search.maktx'), key: 'maktx', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.maktxPlaceholder') } },
+ { label: t('pages.orders.waveItem.search.batch'), key: 'batch', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.batchPlaceholder') } },
+ { label: t('pages.orders.waveItem.search.splrBatch'), key: 'splrBatch', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.splrBatchPlaceholder') } },
+ { label: t('pages.orders.waveItem.search.fieldsIndex'), key: 'fieldsIndex', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.fieldsIndexPlaceholder') } },
+ { label: t('pages.orders.waveItem.search.timeStart'), key: 'timeStart', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } },
+ { label: t('pages.orders.waveItem.search.timeEnd'), key: 'timeEnd', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } }
])
async function openDetail(row) {
@@ -112,10 +115,10 @@
...searchForm.value,
pageSize: 20
}),
- columnsFactory: () => createWaveItemTableColumns({ handleActionClick: openDetail })
+ columnsFactory: () => createWaveItemTableColumns({ handleActionClick: openDetail, t })
},
transform: {
- dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeWaveItemRow(item)) : [])
+ dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeWaveItemRow(item, t)) : [])
}
})
@@ -124,8 +127,8 @@
return
}
- const detailResponse = await guardRequestWithMessage(fetchGetWaveItemDetail(activeItemId.value), {}, { timeoutMessage: '娉㈡鏄庣粏璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' })
- detailData.value = normalizeWaveItemRow(detailResponse)
+ const detailResponse = await guardRequestWithMessage(fetchGetWaveItemDetail(activeItemId.value), {}, { timeoutMessage: t('pages.orders.waveItem.messages.detailTimeout') })
+ detailData.value = normalizeWaveItemRow(detailResponse, t)
}
function handleSelectionChange(rows) {
@@ -172,11 +175,11 @@
}
}),
resolvePrintRecords,
- buildPreviewRows: (records) => buildWaveItemPrintRows(records),
+ buildPreviewRows: (records) => buildWaveItemPrintRows(records, t),
buildPreviewMeta: (rows) => {
const now = new Date()
return {
- reportTitle,
+ reportTitle: reportTitle.value,
reportDate: now.toLocaleDateString('zh-CN'),
printedAt: now.toLocaleString('zh-CN', { hour12: false }),
operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -196,7 +199,8 @@
buildWaveItemReportMeta({
previewMeta: rawPreviewMeta.value,
count: previewRows.value.length,
- orientation: rawPreviewMeta.value?.reportStyle?.orientation || 'landscape'
+ orientation: rawPreviewMeta.value?.reportStyle?.orientation || 'landscape',
+ t
})
)
</script>
diff --git a/rsf-design/src/views/orders/wave-item/modules/wave-item-detail-drawer.vue b/rsf-design/src/views/orders/wave-item/modules/wave-item-detail-drawer.vue
index a065dcc..cb9063f 100644
--- a/rsf-design/src/views/orders/wave-item/modules/wave-item-detail-drawer.vue
+++ b/rsf-design/src/views/orders/wave-item/modules/wave-item-detail-drawer.vue
@@ -1,32 +1,32 @@
<template>
<ElDrawer
:model-value="visible"
- title="娉㈡鏄庣粏璇︽儏"
+ :title="t('pages.orders.waveItem.detail.title')"
size="80%"
@update:model-value="handleVisibleChange"
>
<ElScrollbar class="wave-item-detail-scroll">
<div class="flex min-h-full flex-col gap-4 pr-2">
<ElDescriptions :column="4" border>
- <ElDescriptionsItem label="娉㈡鍗曞彿">{{ detail.waveCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍗曟嵁缂栫爜">{{ detail.orderCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵规">{{ detail.batch || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="渚涘簲鍟嗘壒娆�">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍗曚綅">{{ detail.unit || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍔ㄦ�佸瓧娈电储寮�">{{ detail.fieldsIndex || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴旈厤鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="宸查厤鏁伴噺">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撳瓨鏁伴噺">{{ detail.stockQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵ц鐘舵��">
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.waveCode')">{{ detail.waveCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.orderCode')">{{ detail.orderCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.matnrCode')">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.maktx')">{{ detail.maktx || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.batch')">{{ detail.batch || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.splrBatch')">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.unit')">{{ detail.unit || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.fieldsIndex')">{{ detail.fieldsIndex || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.anfme')">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.workQty')">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.stockQty')">{{ detail.stockQty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.exceStatus')">
<ElTag :type="detail.exceStatusTagType || 'info'" effect="light">
{{ detail.exceStatusText || '--' }}
</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="搴撲綅" :span="4">{{ detail.stockLocsText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.stockLocs')" :span="4">{{ detail.stockLocsText || '--' }}</ElDescriptionsItem>
</ElDescriptions>
</div>
</ElScrollbar>
@@ -34,7 +34,10 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
+
defineOptions({ name: 'WaveItemDetailDrawer' })
+ const { t } = useI18n()
defineProps({
visible: { type: Boolean, default: false },
diff --git a/rsf-design/src/views/orders/wave-item/waveItemPage.helpers.js b/rsf-design/src/views/orders/wave-item/waveItemPage.helpers.js
index a8f0500..1e12885 100644
--- a/rsf-design/src/views/orders/wave-item/waveItemPage.helpers.js
+++ b/rsf-design/src/views/orders/wave-item/waveItemPage.helpers.js
@@ -1,4 +1,12 @@
-export const WAVE_ITEM_REPORT_TITLE = '娉㈡鏄庣粏鎶ヨ〃'
+import { $t } from '@/locales'
+
+function translate(t, key, params) {
+ return (typeof t === 'function' ? t : $t)(key, params)
+}
+
+export function getWaveItemReportTitle(t) {
+ return translate(t, 'pages.orders.waveItem.reportTitle')
+}
export const WAVE_ITEM_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
@@ -19,22 +27,19 @@
return Number.isFinite(numericValue) ? numericValue : 0
}
-const WAVE_ITEM_STATUS_MAP = {
- 0: { label: '鏈墽琛�', tagType: 'info' },
- 1: { label: '鎵ц涓�', tagType: 'warning' },
- 2: { label: '鏆傚仠', tagType: 'warning' },
- 3: { label: '宸蹭笅鍙�', tagType: 'primary' },
- 4: { label: '浠诲姟瀹屾垚', tagType: 'success' }
+const WAVE_ITEM_STATUS_TAG_MAP = {
+ 0: 'info',
+ 1: 'warning',
+ 2: 'warning',
+ 3: 'primary',
+ 4: 'success'
}
-function getItemStatusConfig(status, statusText) {
- const fallback = WAVE_ITEM_STATUS_MAP[Number(status)] || {
- label: statusText || '-',
- tagType: 'info'
- }
+function getItemStatusConfig(status, statusText, t) {
+ const fallbackLabel = statusText || translate(t, `pages.orders.waveItem.status.exceStatus.${Number(status)}`)
return {
- label: statusText || fallback.label,
- tagType: fallback.tagType
+ label: fallbackLabel || '-',
+ tagType: WAVE_ITEM_STATUS_TAG_MAP[Number(status)] || 'info'
}
}
@@ -115,8 +120,8 @@
}
}
-export function normalizeWaveItemRow(record = {}) {
- const statusConfig = getItemStatusConfig(record.exceStatus, record['exceStatus$'])
+export function normalizeWaveItemRow(record = {}, t) {
+ const statusConfig = getItemStatusConfig(record.exceStatus, record['exceStatus$'], t)
return {
...record,
waveCode: record.waveCode || '-',
@@ -139,20 +144,21 @@
}
}
-export function buildWaveItemPrintRows(records = []) {
+export function buildWaveItemPrintRows(records = [], t) {
if (!Array.isArray(records)) {
return []
}
- return records.map((record) => normalizeWaveItemRow(record))
+ return records.map((record) => normalizeWaveItemRow(record, t))
}
export function buildWaveItemReportMeta({
previewMeta = {},
count = 0,
- orientation = WAVE_ITEM_REPORT_STYLE.orientation
+ orientation = WAVE_ITEM_REPORT_STYLE.orientation,
+ t
} = {}) {
return {
- reportTitle: WAVE_ITEM_REPORT_TITLE,
+ reportTitle: getWaveItemReportTitle(t),
reportDate: previewMeta.reportDate,
printedAt: previewMeta.printedAt,
operator: previewMeta.operator,
diff --git a/rsf-design/src/views/orders/wave-item/waveItemTable.columns.js b/rsf-design/src/views/orders/wave-item/waveItemTable.columns.js
index 4e1a373..ca44126 100644
--- a/rsf-design/src/views/orders/wave-item/waveItemTable.columns.js
+++ b/rsf-design/src/views/orders/wave-item/waveItemTable.columns.js
@@ -1,79 +1,81 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
+import { $t } from '@/locales'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
-export function createWaveItemTableColumns({ handleActionClick }) {
+export function createWaveItemTableColumns({ handleActionClick, t }) {
+ const translate = typeof t === 'function' ? t : $t
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: translate('table.index'), width: 72, align: 'center' },
{
prop: 'waveCode',
- label: '娉㈡鍗曞彿',
+ label: translate('pages.orders.waveItem.table.waveCode'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'orderCode',
- label: '鍗曟嵁缂栫爜',
+ label: translate('pages.orders.waveItem.table.orderCode'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'matnrCode',
- label: '鐗╂枡缂栫爜',
+ label: translate('pages.orders.waveItem.table.matnrCode'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'maktx',
- label: '鐗╂枡鍚嶇О',
+ label: translate('pages.orders.waveItem.table.maktx'),
minWidth: 220,
showOverflowTooltip: true
},
{
prop: 'batch',
- label: '鎵规',
+ label: translate('pages.orders.waveItem.table.batch'),
minWidth: 130,
showOverflowTooltip: true
},
{
prop: 'splrBatch',
- label: '渚涘簲鍟嗘壒娆�',
+ label: translate('pages.orders.waveItem.table.splrBatch'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'unit',
- label: '鍗曚綅',
+ label: translate('pages.orders.waveItem.table.unit'),
width: 90
},
{
prop: 'anfme',
- label: '搴旈厤鏁伴噺',
+ label: translate('pages.orders.waveItem.table.anfme'),
width: 110,
align: 'right'
},
{
prop: 'workQty',
- label: '宸查厤鏁伴噺',
+ label: translate('pages.orders.waveItem.table.workQty'),
width: 110,
align: 'right'
},
{
prop: 'stockQty',
- label: '搴撳瓨鏁伴噺',
+ label: translate('pages.orders.waveItem.table.stockQty'),
width: 110,
align: 'right'
},
{
prop: 'fieldsIndex',
- label: '鍔ㄦ�佸瓧娈电储寮�',
+ label: translate('pages.orders.waveItem.table.fieldsIndex'),
minWidth: 160,
showOverflowTooltip: true
},
{
prop: 'exceStatusText',
- label: '鎵ц鐘舵��',
+ label: translate('pages.orders.waveItem.table.exceStatus'),
width: 120,
formatter: (row) =>
h(
@@ -84,13 +86,13 @@
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: translate('pages.orders.waveItem.table.updateTime'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: translate('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
@@ -99,7 +101,7 @@
list: [
{
key: 'view',
- label: '鏌ョ湅璇︽儏',
+ label: translate('pages.orders.waveItem.actions.view'),
icon: 'ri:eye-line'
}
],
@@ -110,70 +112,71 @@
}
export function createWaveItemDetailColumns() {
+ const translate = $t
return [
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: translate('table.index'), width: 72, align: 'center' },
{
prop: 'waveCode',
- label: '娉㈡鍗曞彿',
+ label: translate('pages.orders.waveItem.table.waveCode'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'orderCode',
- label: '鍗曟嵁缂栫爜',
+ label: translate('pages.orders.waveItem.table.orderCode'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'matnrCode',
- label: '鐗╂枡缂栫爜',
+ label: translate('pages.orders.waveItem.table.matnrCode'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'maktx',
- label: '鐗╂枡鍚嶇О',
+ label: translate('pages.orders.waveItem.table.maktx'),
minWidth: 220,
showOverflowTooltip: true
},
{
prop: 'batch',
- label: '鎵规',
+ label: translate('pages.orders.waveItem.table.batch'),
minWidth: 130,
showOverflowTooltip: true
},
{
prop: 'splrBatch',
- label: '渚涘簲鍟嗘壒娆�',
+ label: translate('pages.orders.waveItem.table.splrBatch'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'unit',
- label: '鍗曚綅',
+ label: translate('pages.orders.waveItem.table.unit'),
width: 90
},
{
prop: 'anfme',
- label: '搴旈厤鏁伴噺',
+ label: translate('pages.orders.waveItem.table.anfme'),
width: 110,
align: 'right'
},
{
prop: 'workQty',
- label: '宸查厤鏁伴噺',
+ label: translate('pages.orders.waveItem.table.workQty'),
width: 110,
align: 'right'
},
{
prop: 'stockQty',
- label: '搴撳瓨鏁伴噺',
+ label: translate('pages.orders.waveItem.table.stockQty'),
width: 110,
align: 'right'
},
{
prop: 'stockLocsText',
- label: '搴撲綅',
+ label: translate('pages.orders.waveItem.table.stockLocs'),
minWidth: 220,
showOverflowTooltip: true
}
diff --git a/rsf-design/src/views/orders/wave/index.vue b/rsf-design/src/views/orders/wave/index.vue
index eaa0a3f..7b2a419 100644
--- a/rsf-design/src/views/orders/wave/index.vue
+++ b/rsf-design/src/views/orders/wave/index.vue
@@ -59,6 +59,7 @@
:columns="publicTaskColumns"
:pagination="publicTaskPagination"
:can-submit="publicTaskCanSubmit"
+ :warning-text="publicTaskWarningText"
@size-change="handlePublicTaskSizeChange"
@current-change="handlePublicTaskCurrentChange"
@submit="handleSubmitPublicTask"
@@ -69,6 +70,7 @@
<script setup>
import { computed, reactive, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
+ import { useI18n } from 'vue-i18n'
import { useUserStore } from '@/store/modules/user'
import { useTable } from '@/hooks/core/useTable'
import { usePrintExportPage } from '@/views/system/common/usePrintExportPage'
@@ -82,6 +84,7 @@
buildWaveReportMeta,
buildWaveSearchParams,
createWaveSearchState,
+ getWaveReportTitle,
normalizeWaveItemRow,
normalizeWaveRow,
WAVE_REPORT_STYLE
@@ -107,8 +110,9 @@
defineOptions({ name: 'WaveOrder' })
+ const { t } = useI18n()
const userStore = useUserStore()
- const reportTitle = '娉㈡鍗曟姤琛�'
+ const reportTitle = computed(() => getWaveReportTitle(t))
const searchForm = ref(createWaveSearchState())
const selectedRows = ref([])
const detailDrawerVisible = ref(false)
@@ -135,43 +139,71 @@
})
const reportQueryParams = computed(() => buildWaveSearchParams(searchForm.value))
- const detailColumns = computed(() => createWaveDetailItemColumns())
- const publicTaskColumns = computed(() => createWavePreviewItemColumns())
+ const detailColumns = computed(() => createWaveDetailItemColumns(t))
+ const publicTaskColumns = computed(() => createWavePreviewItemColumns(t))
const publicTaskCanSubmit = computed(
() => publicTaskRows.value.length > 0 && publicTaskRows.value.every((row) => row.stockLocsText && row.stockLocsText !== '[]')
)
+ const publicTaskWarningText = computed(() => t('pages.orders.wave.messages.publicTaskWarning'))
const searchItems = computed(() => [
- { label: '鍏抽敭瀛�', key: 'condition', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ユ尝娆″崟鍙�/澶囨敞' } },
- { label: '娉㈡鍗曞彿', key: 'code', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ユ尝娆″崟鍙�' } },
{
- label: '娉㈡绫诲瀷',
- key: 'type',
- type: 'select',
- props: { clearable: true, options: [{ label: '鎵嬪姩', value: 0 }, { label: '鑷姩', value: 1 }] }
+ label: t('pages.orders.wave.search.condition'),
+ key: 'condition',
+ type: 'input',
+ props: { clearable: true, placeholder: t('pages.orders.wave.search.conditionPlaceholder') }
},
{
- label: '娉㈡鐘舵��',
+ label: t('pages.orders.wave.search.code'),
+ key: 'code',
+ type: 'input',
+ props: { clearable: true, placeholder: t('pages.orders.wave.search.codePlaceholder') }
+ },
+ {
+ label: t('pages.orders.wave.search.type'),
+ key: 'type',
+ type: 'select',
+ props: {
+ clearable: true,
+ options: [
+ { label: t('pages.orders.wave.status.type.0'), value: 0 },
+ { label: t('pages.orders.wave.status.type.1'), value: 1 }
+ ]
+ }
+ },
+ {
+ label: t('pages.orders.wave.search.exceStatus'),
key: 'exceStatus',
type: 'select',
props: {
clearable: true,
options: [
- { label: '绛夊緟鎵ц', value: 0 },
- { label: '姝e湪鎵ц', value: 1 },
- { label: '鏆傚仠鎵ц', value: 2 },
- { label: '鎵ц瀹屾垚', value: 3 }
+ { label: t('pages.orders.wave.status.exceStatus.0'), value: 0 },
+ { label: t('pages.orders.wave.status.exceStatus.1'), value: 1 },
+ { label: t('pages.orders.wave.status.exceStatus.2'), value: 2 },
+ { label: t('pages.orders.wave.status.exceStatus.3'), value: 3 }
]
}
},
{
- label: '鐘舵��',
+ label: t('pages.orders.wave.search.status'),
key: 'status',
type: 'select',
- props: { clearable: true, options: [{ label: '姝e父', value: 1 }, { label: '绂佺敤', value: 0 }] }
+ props: {
+ clearable: true,
+ options: [
+ { label: t('common.status.normal'), value: 1 },
+ { label: t('common.status.disabled'), value: 0 }
+ ]
+ }
},
- { label: '澶囨敞', key: 'memo', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ娉�' } },
- { label: '寮�濮嬫椂闂�', key: 'timeStart', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } },
- { label: '缁撴潫鏃堕棿', key: 'timeEnd', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } }
+ {
+ label: t('pages.orders.wave.search.memo'),
+ key: 'memo',
+ type: 'input',
+ props: { clearable: true, placeholder: t('pages.orders.wave.search.memoPlaceholder') }
+ },
+ { label: t('pages.orders.wave.search.timeStart'), key: 'timeStart', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } },
+ { label: t('pages.orders.wave.search.timeEnd'), key: 'timeEnd', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } }
])
function updatePaginationState(target, response, fallbackCurrent, fallbackSize) {
@@ -188,7 +220,7 @@
}
async function openPublicTask(row) {
- publicTaskWave.value = normalizeWaveRow(row)
+ publicTaskWave.value = normalizeWaveRow(row, t)
publicTaskPagination.current = 1
publicTaskDialogVisible.value = true
await loadPublicTaskResources()
@@ -211,29 +243,29 @@
}
if (action.key === 'pause') {
await fetchPauseWave(row.id)
- ElMessage.success('娉㈡宸叉殏鍋�')
+ ElMessage.success(t('pages.orders.wave.messages.pauseSuccess'))
await refreshData()
return
}
if (action.key === 'continue') {
await fetchContinueWave(row.id)
- ElMessage.success('娉㈡宸茬户缁�')
+ ElMessage.success(t('pages.orders.wave.messages.continueSuccess'))
await refreshData()
return
}
if (action.key === 'stop') {
- await ElMessageBox.confirm(`纭畾缁堟娉㈡鍗� ${row.code || ''} 鍚楋紵`, '缁堟纭', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
+ await ElMessageBox.confirm(t('pages.orders.wave.messages.stopConfirm', { code: row.code || '' }), t('pages.orders.wave.messages.stopTitle'), {
+ confirmButtonText: t('common.confirm'),
+ cancelButtonText: t('common.cancel'),
type: 'warning'
})
await fetchStopWave(row.id)
- ElMessage.success('娉㈡宸茬粓姝�')
+ ElMessage.success(t('pages.orders.wave.messages.stopSuccess'))
await refreshData()
}
} catch (error) {
if (error === 'cancel' || error?.message === 'cancel') return
- ElMessage.error(error?.message || '娉㈡鎿嶄綔澶辫触')
+ ElMessage.error(error?.message || t('pages.orders.wave.messages.actionFailed'))
}
}
@@ -253,10 +285,10 @@
core: {
apiFn: fetchWavePage,
apiParams: buildWavePageQueryParams(searchForm.value),
- columnsFactory: () => createWaveTableColumns({ handleActionClick })
+ columnsFactory: () => createWaveTableColumns({ handleActionClick, t })
},
transform: {
- dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeWaveRow(item)) : [])
+ dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeWaveRow(item, t)) : [])
}
})
@@ -268,15 +300,15 @@
detailLoading.value = true
try {
const [detailResponse, previewResponse] = await Promise.all([
- guardRequestWithMessage(fetchGetWaveDetail(activeWaveId.value), {}, { timeoutMessage: '娉㈡鍗曡鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�' }),
+ guardRequestWithMessage(fetchGetWaveDetail(activeWaveId.value), {}, { timeoutMessage: t('pages.orders.wave.messages.detailTimeout') }),
guardRequestWithMessage(
fetchWavePreviewPage(buildWaveDetailQueryParams({ waveId: activeWaveId.value, current: detailPagination.current, pageSize: detailPagination.size })),
{ records: [], total: 0, current: detailPagination.current, size: detailPagination.size },
- { timeoutMessage: '娉㈡棰勮鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+ { timeoutMessage: t('pages.orders.wave.messages.previewTimeout') }
)
])
- detailData.value = normalizeWaveRow(detailResponse)
- detailTableData.value = Array.isArray(previewResponse?.records) ? previewResponse.records.map((item) => normalizeWaveItemRow(item)) : []
+ detailData.value = normalizeWaveRow(detailResponse, t)
+ detailTableData.value = Array.isArray(previewResponse?.records) ? previewResponse.records.map((item) => normalizeWaveItemRow(item, t)) : []
updatePaginationState(detailPagination, previewResponse, detailPagination.current, detailPagination.size)
} finally {
detailLoading.value = false
@@ -293,9 +325,9 @@
const previewResponse = await guardRequestWithMessage(
fetchWavePreviewPage(buildWaveDetailQueryParams({ waveId: publicTaskWave.value.id, current: publicTaskPagination.current, pageSize: publicTaskPagination.size })),
{ records: [], total: 0, current: publicTaskPagination.current, size: publicTaskPagination.size },
- { timeoutMessage: '娉㈡涓嬪彂棰勮鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+ { timeoutMessage: t('pages.orders.wave.messages.publicTaskTimeout') }
)
- publicTaskRows.value = Array.isArray(previewResponse?.records) ? previewResponse.records.map((item) => normalizeWaveItemRow(item)) : []
+ publicTaskRows.value = Array.isArray(previewResponse?.records) ? previewResponse.records.map((item) => normalizeWaveItemRow(item, t)) : []
updatePaginationState(publicTaskPagination, previewResponse, publicTaskPagination.current, publicTaskPagination.size)
} finally {
publicTaskLoading.value = false
@@ -311,16 +343,16 @@
})
const result = defaultResponseAdapter(response)
if (result?.code !== 200 && result?.success !== true) {
- throw new Error(result?.message || '娉㈡涓嬪彂澶辫触')
+ throw new Error(result?.message || t('pages.orders.wave.messages.publicTaskFailed'))
}
- ElMessage.success(result?.message || '娉㈡宸蹭笅鍙�')
+ ElMessage.success(result?.message || t('pages.orders.wave.messages.publicTaskSuccess'))
publicTaskDialogVisible.value = false
await refreshData()
if (detailDrawerVisible.value && activeWaveId.value === publicTaskWave.value.id) {
await loadDetailResources()
}
} catch (error) {
- ElMessage.error(error?.message || '娉㈡涓嬪彂澶辫触')
+ ElMessage.error(error?.message || t('pages.orders.wave.messages.publicTaskFailed'))
} finally {
publicTaskSubmitting.value = false
}
@@ -390,11 +422,11 @@
}
}),
resolvePrintRecords,
- buildPreviewRows: (records) => buildWavePrintRows(records),
+ buildPreviewRows: (records) => buildWavePrintRows(records, t),
buildPreviewMeta: (rows) => {
const now = new Date()
return {
- reportTitle,
+ reportTitle: reportTitle.value,
reportDate: now.toLocaleDateString('zh-CN'),
printedAt: now.toLocaleString('zh-CN', { hour12: false }),
operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -410,7 +442,8 @@
buildWaveReportMeta({
previewMeta: rawPreviewMeta.value,
count: previewRows.value.length,
- orientation: rawPreviewMeta.value?.reportStyle?.orientation || WAVE_REPORT_STYLE.orientation
+ orientation: rawPreviewMeta.value?.reportStyle?.orientation || WAVE_REPORT_STYLE.orientation,
+ t
})
)
</script>
diff --git a/rsf-design/src/views/orders/wave/modules/wave-detail-drawer.vue b/rsf-design/src/views/orders/wave/modules/wave-detail-drawer.vue
index 3009a49..c0ffe6a 100644
--- a/rsf-design/src/views/orders/wave/modules/wave-detail-drawer.vue
+++ b/rsf-design/src/views/orders/wave/modules/wave-detail-drawer.vue
@@ -1,39 +1,39 @@
<template>
<ElDrawer
:model-value="visible"
- title="娉㈡鍗曡鎯�"
+ :title="t('pages.orders.wave.detail.title')"
size="88%"
@update:model-value="handleVisibleChange"
>
<ElScrollbar class="wave-detail-scroll">
<div class="flex min-h-full flex-col gap-4 pr-2">
<ElDescriptions :column="4" border>
- <ElDescriptionsItem label="娉㈡鍗曞彿">{{ detail.code || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="娉㈡绫诲瀷">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="娉㈡鐘舵��">{{ detail.exceStatusText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.code')">{{ detail.code || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.type')">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.exceStatus')">{{ detail.exceStatusText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.status')">
<ElTag :type="Number(detail.status) === 1 ? 'success' : 'danger'" effect="light">
{{ detail.statusLabel || '--' }}
</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="搴旂洏鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵ц鏁伴噺">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="宸茬洏鏁伴噺">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍗曟嵁鏁伴噺">{{ detail.orderNum ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍝佺被鏁伴噺">{{ detail.groupQty ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐩爣浣嶇疆">{{ detail.targSite || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎸囧畾绔欑偣">{{ detail.stationId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎸囧畾搴撲綅">{{ detail.locCode || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞" :span="4">{{ detail.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.anfme')">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.workQty')">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.qty')">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.orderNum')">{{ detail.orderNum ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.groupQty')">{{ detail.groupQty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.targSite')">{{ detail.targSite || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.stationId')">{{ detail.stationId || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.locCode')">{{ detail.locCode || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.createBy')">{{ detail.createByText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.updateBy')">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.detail.memo')" :span="4">{{ detail.memo || '--' }}</ElDescriptionsItem>
</ElDescriptions>
<ElCard shadow="never" class="border border-[var(--art-border-color)]">
<template #header>
- <div class="text-sm font-medium text-[var(--art-text-gray-800)]">娉㈡棰勮鏄庣粏 - 鐗╂枡缂栫爜</div>
+ <div class="text-sm font-medium text-[var(--art-text-gray-800)]">{{ t('pages.orders.wave.detail.previewTitle') }}</div>
</template>
<ArtTable
:loading="loading"
@@ -50,7 +50,10 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
+
defineOptions({ name: 'WaveDetailDrawer' })
+ const { t } = useI18n()
defineProps({
visible: { type: Boolean, default: false },
diff --git a/rsf-design/src/views/orders/wave/modules/wave-public-task-dialog.vue b/rsf-design/src/views/orders/wave/modules/wave-public-task-dialog.vue
index 28969a6..6e2db95 100644
--- a/rsf-design/src/views/orders/wave/modules/wave-public-task-dialog.vue
+++ b/rsf-design/src/views/orders/wave/modules/wave-public-task-dialog.vue
@@ -1,17 +1,17 @@
<template>
<ElDialog
:model-value="visible"
- title="娉㈡涓嬪彂浠诲姟"
+ :title="t('pages.orders.wave.publicTask.title')"
width="88%"
destroy-on-close
@update:model-value="handleVisibleChange"
>
<div class="flex max-h-[calc(100vh-240px)] flex-col gap-4 overflow-hidden">
<ElDescriptions :column="4" border>
- <ElDescriptionsItem label="娉㈡鍗曞彿">{{ wave.code || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="娉㈡绫诲瀷">{{ wave.typeLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="娉㈡鐘舵��">{{ wave.exceStatusText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎵ц鏁伴噺">{{ wave.workQty ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.publicTask.code')">{{ wave.code || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.publicTask.type')">{{ wave.typeLabel || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.publicTask.exceStatus')">{{ wave.exceStatusText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.orders.wave.publicTask.workQty')">{{ wave.workQty ?? '--' }}</ElDescriptionsItem>
</ElDescriptions>
<ElAlert
@@ -36,9 +36,9 @@
<template #footer>
<div class="flex items-center justify-end gap-3">
- <ElButton @click="handleVisibleChange(false)">鍏抽棴</ElButton>
+ <ElButton @click="handleVisibleChange(false)">{{ t('common.close') }}</ElButton>
<ElButton type="primary" :loading="submitLoading" :disabled="!canSubmit" @click="$emit('submit')">
- 涓嬪彂浠诲姟
+ {{ t('pages.orders.wave.actions.publicTask') }}
</ElButton>
</div>
</template>
@@ -46,7 +46,10 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
+
defineOptions({ name: 'WavePublicTaskDialog' })
+ const { t } = useI18n()
defineProps({
visible: { type: Boolean, default: false },
@@ -57,7 +60,7 @@
columns: { type: Array, default: () => [] },
pagination: { type: Object, default: () => ({ current: 1, size: 20, total: 0 }) },
canSubmit: { type: Boolean, default: false },
- warningText: { type: String, default: '娉㈡棰勮鏁版嵁涓嶅彲鐢紝璇峰厛妫�鏌ュ簱浣嶉厤缃�' }
+ warningText: { type: String, default: '' }
})
const emit = defineEmits(['update:visible', 'size-change', 'current-change', 'submit'])
diff --git a/rsf-design/src/views/orders/wave/wavePage.helpers.js b/rsf-design/src/views/orders/wave/wavePage.helpers.js
index 1e3c9f6..705c383 100644
--- a/rsf-design/src/views/orders/wave/wavePage.helpers.js
+++ b/rsf-design/src/views/orders/wave/wavePage.helpers.js
@@ -1,4 +1,12 @@
-export const WAVE_REPORT_TITLE = '娉㈡鍗曟姤琛�'
+import { $t } from '@/locales'
+
+function translate(t, key, params) {
+ return (typeof t === 'function' ? t : $t)(key, params)
+}
+
+export function getWaveReportTitle(t) {
+ return translate(t, 'pages.orders.wave.reportTitle')
+}
export const WAVE_REPORT_STYLE = {
titleAlign: 'center',
titleLevel: 'strong',
@@ -7,19 +15,19 @@
showSequence: true
}
-const WAVE_STATUS_MAP = {
- 0: { label: '绛夊緟鎵ц', tagType: 'info' },
- 1: { label: '姝e湪鎵ц', tagType: 'warning' },
- 2: { label: '鏆傚仠鎵ц', tagType: 'warning' },
- 3: { label: '鎵ц瀹屾垚', tagType: 'success' }
+const WAVE_STATUS_TAG_MAP = {
+ 0: 'info',
+ 1: 'warning',
+ 2: 'warning',
+ 3: 'success'
}
-const WAVE_ITEM_STATUS_MAP = {
- 0: { label: '鏈墽琛�', tagType: 'info' },
- 1: { label: '鎵ц涓�', tagType: 'warning' },
- 2: { label: '鏆傚仠', tagType: 'warning' },
- 3: { label: '宸蹭笅鍙�', tagType: 'primary' },
- 4: { label: '浠诲姟瀹屾垚', tagType: 'success' }
+const WAVE_ITEM_STATUS_TAG_MAP = {
+ 0: 'info',
+ 1: 'warning',
+ 2: 'warning',
+ 3: 'primary',
+ 4: 'success'
}
function normalizeText(value) {
@@ -34,25 +42,21 @@
return Number.isFinite(numericValue) ? numericValue : 0
}
-function getStatusConfig(status, statusText) {
- const fallback = WAVE_STATUS_MAP[Number(status)] || {
- label: statusText || '-',
- tagType: 'info'
- }
+function getStatusConfig(status, statusText, t) {
+ const statusKey = `pages.orders.wave.status.exceStatus.${Number(status)}`
+ const fallbackLabel = statusText || translate(t, statusKey)
return {
- label: statusText || fallback.label,
- tagType: fallback.tagType
+ label: fallbackLabel || '-',
+ tagType: WAVE_STATUS_TAG_MAP[Number(status)] || 'info'
}
}
-function getItemStatusConfig(status, statusText) {
- const fallback = WAVE_ITEM_STATUS_MAP[Number(status)] || {
- label: statusText || '-',
- tagType: 'info'
- }
+function getItemStatusConfig(status, statusText, t) {
+ const statusKey = `pages.orders.waveItem.status.exceStatus.${Number(status)}`
+ const fallbackLabel = statusText || translate(t, statusKey)
return {
- label: statusText || fallback.label,
- tagType: fallback.tagType
+ label: fallbackLabel || '-',
+ tagType: WAVE_ITEM_STATUS_TAG_MAP[Number(status)] || 'info'
}
}
@@ -123,8 +127,8 @@
}
}
-export function normalizeWaveRow(record = {}) {
- const statusConfig = getStatusConfig(record.exceStatus, record['exceStatus$'])
+export function normalizeWaveRow(record = {}, t) {
+ const statusConfig = getStatusConfig(record.exceStatus, record['exceStatus$'], t)
const progress = normalizeNumber(record.anfme) > 0
? Math.min(Math.round((normalizeNumber(record.workQty) / normalizeNumber(record.anfme)) * 100), 100)
: 0
@@ -132,10 +136,14 @@
return {
...record,
code: record.code || '-',
- typeLabel: record['type$'] || record.type || '-',
+ typeLabel: record['type$'] || translate(t, `pages.orders.wave.status.type.${record.type}`) || record.type || '-',
exceStatusText: statusConfig.label,
exceStatusTagType: statusConfig.tagType,
- statusLabel: record['status$'] || record.status || '-',
+ statusLabel:
+ record['status$'] ||
+ translate(t, Number(record.status) === 1 ? 'common.status.normal' : 'common.status.disabled') ||
+ record.status ||
+ '-',
anfme: normalizeNumber(record.anfme),
qty: normalizeNumber(record.qty),
workQty: normalizeNumber(record.workQty),
@@ -157,8 +165,8 @@
}
}
-export function normalizeWaveItemRow(record = {}) {
- const statusConfig = getItemStatusConfig(record.exceStatus, record['exceStatus$'])
+export function normalizeWaveItemRow(record = {}, t) {
+ const statusConfig = getItemStatusConfig(record.exceStatus, record['exceStatus$'], t)
return {
...record,
waveCode: record.waveCode || '-',
@@ -183,20 +191,21 @@
}
}
-export function buildWavePrintRows(records = []) {
+export function buildWavePrintRows(records = [], t) {
if (!Array.isArray(records)) {
return []
}
- return records.map((record) => normalizeWaveRow(record))
+ return records.map((record) => normalizeWaveRow(record, t))
}
export function buildWaveReportMeta({
previewMeta = {},
count = 0,
- orientation = WAVE_REPORT_STYLE.orientation
+ orientation = WAVE_REPORT_STYLE.orientation,
+ t
} = {}) {
return {
- reportTitle: WAVE_REPORT_TITLE,
+ reportTitle: getWaveReportTitle(t),
reportDate: previewMeta.reportDate,
printedAt: previewMeta.printedAt,
operator: previewMeta.operator,
@@ -208,41 +217,41 @@
}
}
-export function getWaveActionList(row = {}) {
- const normalizedRow = normalizeWaveRow(row)
+export function getWaveActionList(row = {}, t) {
+ const normalizedRow = normalizeWaveRow(row, t)
return [
{
key: 'view',
- label: '鏌ョ湅璇︽儏',
+ label: translate(t, 'pages.orders.wave.actions.view'),
icon: 'ri:eye-line'
},
{
key: 'publicTask',
- label: '涓嬪彂浠诲姟',
+ label: translate(t, 'pages.orders.wave.actions.publicTask'),
icon: 'ri:play-circle-line',
disabled: !normalizedRow.canPublicTask
},
{
key: 'pause',
- label: '鏆傚仠',
+ label: translate(t, 'pages.orders.wave.actions.pause'),
icon: 'ri:pause-circle-line',
disabled: !normalizedRow.canPause
},
{
key: 'continue',
- label: '缁х画',
+ label: translate(t, 'pages.orders.wave.actions.continue'),
icon: 'ri:play-line',
disabled: !normalizedRow.canContinue
},
{
key: 'stop',
- label: '缁堟',
+ label: translate(t, 'pages.orders.wave.actions.stop'),
icon: 'ri:stop-circle-line',
disabled: !normalizedRow.canStop
},
{
key: 'print',
- label: '鎵撳嵃',
+ label: translate(t, 'pages.orders.wave.actions.print'),
icon: 'ri:printer-line'
}
]
diff --git a/rsf-design/src/views/orders/wave/waveTable.columns.js b/rsf-design/src/views/orders/wave/waveTable.columns.js
index d401112..0de06b2 100644
--- a/rsf-design/src/views/orders/wave/waveTable.columns.js
+++ b/rsf-design/src/views/orders/wave/waveTable.columns.js
@@ -1,26 +1,28 @@
import { h } from 'vue'
import { ElProgress, ElTag } from 'element-plus'
+import { $t } from '@/locales'
import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
import { getWaveActionList } from './wavePage.helpers'
-export function createWaveTableColumns({ handleActionClick }) {
+export function createWaveTableColumns({ handleActionClick, t }) {
+ const translate = typeof t === 'function' ? t : $t
return [
{ type: 'selection', width: 48, align: 'center' },
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: translate('table.index'), width: 72, align: 'center' },
{
prop: 'code',
- label: '娉㈡鍗曞彿',
+ label: translate('pages.orders.wave.table.code'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'typeLabel',
- label: '娉㈡绫诲瀷',
+ label: translate('pages.orders.wave.table.type'),
width: 110
},
{
prop: 'exceStatusText',
- label: '娉㈡鐘舵��',
+ label: translate('pages.orders.wave.table.exceStatus'),
width: 120,
formatter: (row) =>
h(
@@ -31,31 +33,31 @@
},
{
prop: 'anfme',
- label: '搴旂洏鏁伴噺',
+ label: translate('pages.orders.wave.table.anfme'),
width: 110,
align: 'right'
},
{
prop: 'workQty',
- label: '鎵ц鏁伴噺',
+ label: translate('pages.orders.wave.table.workQty'),
width: 110,
align: 'right'
},
{
prop: 'qty',
- label: '宸茬洏鏁伴噺',
+ label: translate('pages.orders.wave.table.qty'),
width: 110,
align: 'right'
},
{
prop: 'orderNum',
- label: '鍗曟嵁鏁伴噺',
+ label: translate('pages.orders.wave.table.orderNum'),
width: 110,
align: 'right'
},
{
prop: 'progress',
- label: '杩涘害',
+ label: translate('pages.orders.wave.table.progress'),
width: 160,
formatter: (row) =>
h(ElProgress, {
@@ -68,19 +70,19 @@
},
{
prop: 'createTimeText',
- label: '鍒涘缓鏃堕棿',
+ label: translate('pages.orders.wave.table.createTime'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: translate('pages.orders.wave.table.updateTime'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'statusLabel',
- label: '鐘舵��',
+ label: translate('pages.orders.wave.table.status'),
width: 100,
formatter: (row) =>
h(
@@ -91,90 +93,91 @@
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: translate('table.operation'),
width: 120,
align: 'center',
fixed: 'right',
formatter: (row) =>
h(ArtButtonMore, {
- list: getWaveActionList(row),
+ list: getWaveActionList(row, translate),
onClick: (item) => handleActionClick(item, row)
})
}
]
}
-export function createWavePreviewItemColumns() {
+export function createWavePreviewItemColumns(t) {
+ const translate = typeof t === 'function' ? t : $t
return [
- { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+ { type: 'globalIndex', label: translate('table.index'), width: 72, align: 'center' },
{
prop: 'waveCode',
- label: '娉㈡鍙�',
+ label: translate('pages.orders.wave.preview.waveCode'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'orderCode',
- label: '鍗曟嵁缂栫爜',
+ label: translate('pages.orders.wave.preview.orderCode'),
minWidth: 170,
showOverflowTooltip: true
},
{
prop: 'matnrCode',
- label: '鐗╂枡缂栫爜',
+ label: translate('pages.orders.wave.preview.matnrCode'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'maktx',
- label: '鐗╂枡鍚嶇О',
+ label: translate('pages.orders.wave.preview.maktx'),
minWidth: 220,
showOverflowTooltip: true
},
{
prop: 'batch',
- label: '鎵规',
+ label: translate('pages.orders.wave.preview.batch'),
minWidth: 130,
showOverflowTooltip: true
},
{
prop: 'unit',
- label: '鍗曚綅',
+ label: translate('pages.orders.wave.preview.unit'),
width: 90
},
{
prop: 'anfme',
- label: '搴旈厤鏁伴噺',
+ label: translate('pages.orders.wave.preview.anfme'),
width: 110,
align: 'right'
},
{
prop: 'workQty',
- label: '宸查厤鏁伴噺',
+ label: translate('pages.orders.wave.preview.workQty'),
width: 110,
align: 'right'
},
{
prop: 'stockQty',
- label: '搴撳瓨鏁伴噺',
+ label: translate('pages.orders.wave.preview.stockQty'),
width: 110,
align: 'right'
},
{
prop: 'splrBatch',
- label: '渚涘簲鍟嗘壒娆�',
+ label: translate('pages.orders.wave.preview.splrBatch'),
minWidth: 150,
showOverflowTooltip: true
},
{
prop: 'stockLocsText',
- label: '搴撲綅',
+ label: translate('pages.orders.wave.preview.stockLocs'),
minWidth: 220,
showOverflowTooltip: true
}
]
}
-export function createWaveDetailItemColumns() {
- return createWavePreviewItemColumns()
+export function createWaveDetailItemColumns(t) {
+ return createWavePreviewItemColumns(t)
}
diff --git a/rsf-design/src/views/stock/stock-transfer/stockTransferTable.columns.js b/rsf-design/src/views/stock/stock-transfer/stockTransferTable.columns.js
index 134b7dd..3442d17 100644
--- a/rsf-design/src/views/stock/stock-transfer/stockTransferTable.columns.js
+++ b/rsf-design/src/views/stock/stock-transfer/stockTransferTable.columns.js
@@ -1,4 +1,5 @@
import { h } from 'vue'
+import { $t } from '@/locales'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
export function createStockTransferTableColumns({ enabledFields = [], handleView } = {}) {
@@ -13,7 +14,7 @@
return [
{
type: 'globalIndex',
- label: '搴忓彿',
+ label: $t('table.index'),
width: 72,
align: 'center'
},
@@ -69,13 +70,13 @@
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: $t('table.operation'),
width: 100,
fixed: 'right',
formatter: (row) =>
h(ArtButtonTable, {
type: 'view',
- text: '璇︽儏',
+ text: $t('common.actions.detail'),
onClick: () => handleView?.(row)
})
}
diff --git a/rsf-design/src/views/system/ai-mcp-mount/aiMcpMountPage.helpers.js b/rsf-design/src/views/system/ai-mcp-mount/aiMcpMountPage.helpers.js
index 182c51c..b145133 100644
--- a/rsf-design/src/views/system/ai-mcp-mount/aiMcpMountPage.helpers.js
+++ b/rsf-design/src/views/system/ai-mcp-mount/aiMcpMountPage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
export function createAiMcpMountSearchState() {
return {
condition: '',
@@ -23,12 +25,12 @@
export function getAiMcpMountHealthMeta(healthStatus) {
if (healthStatus === 'HEALTHY') {
- return { text: '鍋ュ悍', type: 'success' }
+ return { text: $t('pages.system.aiMcpMount.health.healthy'), type: 'success' }
}
if (healthStatus === 'UNHEALTHY') {
- return { text: '寮傚父', type: 'danger' }
+ return { text: $t('pages.system.aiMcpMount.health.unhealthy'), type: 'danger' }
}
- return { text: '鏈祴璇�', type: 'info' }
+ return { text: $t('pages.system.aiMcpMount.health.notTested'), type: 'info' }
}
export function buildAiMcpMountSearchParams(params = {}) {
@@ -110,7 +112,7 @@
serverUrl: row.serverUrl || '',
memo: row.memo || '',
statusBool,
- statusText: statusBool ? '鍚敤' : '鍋滅敤',
+ statusText: statusBool ? $t('common.status.enabled') : $t('common.status.disabled'),
statusType: statusBool ? 'success' : 'info',
healthText: healthMeta.text,
healthType: healthMeta.type,
diff --git a/rsf-design/src/views/system/ai-mcp-mount/index.vue b/rsf-design/src/views/system/ai-mcp-mount/index.vue
index 66548a5..5f7e6ce 100644
--- a/rsf-design/src/views/system/ai-mcp-mount/index.vue
+++ b/rsf-design/src/views/system/ai-mcp-mount/index.vue
@@ -11,20 +11,18 @@
<ElCard class="art-table-card">
<div class="mb-5 flex flex-wrap items-center justify-between gap-4">
<div>
- <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">MCP 鎸傝浇</h3>
- <p class="mt-1 text-sm text-[var(--art-gray-500)]"
- >鎸変紶杈撶被鍨嬬鐞� MCP 鎸傝浇銆佽繛閫氭�у拰宸ュ叿棰勮銆�</p
- >
+ <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">{{ t('pages.system.aiMcpMount.title') }}</h3>
+ <p class="mt-1 text-sm text-[var(--art-gray-500)]">{{ t('pages.system.aiMcpMount.subtitle') }}</p>
</div>
<ElSpace wrap>
- <ElButton v-auth="'save'" @click="openCreateDialog" v-ripple>鏂板缓鎸傝浇</ElButton>
- <ElButton :loading="loading" @click="refreshData" v-ripple>鍒锋柊</ElButton>
+ <ElButton v-auth="'save'" @click="openCreateDialog" v-ripple>{{ t('pages.system.aiMcpMount.buttons.add') }}</ElButton>
+ <ElButton :loading="loading" @click="refreshData" v-ripple>{{ t('common.actions.refresh') }}</ElButton>
</ElSpace>
</div>
<div v-loading="loading" class="space-y-6">
- <ElEmpty v-if="!groupedRecords.length" description="鏆傛棤 MCP 鎸傝浇鏁版嵁" :image-size="110" />
+ <ElEmpty v-if="!groupedRecords.length" :description="t('pages.system.aiMcpMount.empty')" :image-size="110" />
<section v-for="group in groupedRecords" :key="group.key" class="space-y-4">
<div>
@@ -67,7 +65,7 @@
<div
class="rounded-2xl bg-[var(--art-main-bg-color)]/70 p-3 ring-1 ring-inset ring-[var(--art-border-color)]"
>
- <p class="text-xs text-[var(--art-gray-500)]">鐩爣鍦板潃</p>
+ <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiMcpMount.fields.target') }}</p>
<p class="mt-2 break-all text-[var(--art-gray-900)]">{{
item.targetLabel || '--'
}}</p>
@@ -75,26 +73,26 @@
<div
class="rounded-2xl bg-[var(--art-main-bg-color)]/70 p-3 ring-1 ring-inset ring-[var(--art-border-color)]"
>
- <p class="text-xs text-[var(--art-gray-500)]">鏈�杩戞祴璇�</p>
+ <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiMcpMount.fields.lastTestTime') }}</p>
<p class="mt-2 text-[var(--art-gray-900)]">{{
- item['lastTestTime$'] || '鏈祴璇�'
+ item['lastTestTime$'] || t('pages.system.aiMcpMount.health.notTested')
}}</p>
</div>
</div>
<div class="mt-4 grid gap-3 text-sm sm:grid-cols-3">
<div class="rounded-2xl bg-slate-50 px-3 py-2">
- <p class="text-xs text-[var(--art-gray-500)]">瓒呮椂</p>
+ <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiMcpMount.fields.timeoutMs') }}</p>
<p class="mt-1 font-medium text-[var(--art-gray-900)]"
>{{ item.requestTimeoutMs ?? '--' }} ms</p
>
</div>
<div class="rounded-2xl bg-slate-50 px-3 py-2">
- <p class="text-xs text-[var(--art-gray-500)]">鎺掑簭</p>
+ <p class="text-xs text-[var(--art-gray-500)]">{{ t('table.sort') }}</p>
<p class="mt-1 font-medium text-[var(--art-gray-900)]">{{ item.sort ?? '--' }}</p>
</div>
<div class="rounded-2xl bg-slate-50 px-3 py-2">
- <p class="text-xs text-[var(--art-gray-500)]">鍒濆鍖栬�楁椂</p>
+ <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiMcpMount.fields.lastInitElapsedMs') }}</p>
<p class="mt-1 font-medium text-[var(--art-gray-900)]">{{
item.lastInitElapsedMs ?? '--'
}}</p>
@@ -102,7 +100,7 @@
</div>
<div class="mt-4 rounded-2xl bg-amber-50/80 px-4 py-3">
- <p class="text-xs text-[var(--art-gray-500)]">澶囨敞</p>
+ <p class="text-xs text-[var(--art-gray-500)]">{{ t('table.remark') }}</p>
<p class="mt-2 line-clamp-3 text-sm leading-6 text-[var(--art-gray-900)]">{{
item.memo || '--'
}}</p>
@@ -116,20 +114,18 @@
}}</div>
<ElSpace wrap>
- <ElButton text @click="openDetailDialog(item)">璇︽儏</ElButton>
- <ElButton v-auth="'update'" text @click="openEditDialog(item)">缂栬緫</ElButton>
+ <ElButton text @click="openDetailDialog(item)">{{ t('common.actions.detail') }}</ElButton>
+ <ElButton v-auth="'update'" text @click="openEditDialog(item)">{{ t('common.actions.edit') }}</ElButton>
<ElButton
v-auth="'update'"
text
:loading="connectivityTestingId === item.id"
@click="handleConnectivityTest(item)"
>
- 杩為�氭�ф祴璇�
+ {{ t('pages.system.aiMcpMount.actions.connectivityTest') }}
</ElButton>
- <ElButton v-auth="'list'" text @click="openToolsDrawer(item)">宸ュ叿棰勮</ElButton>
- <ElButton v-auth="'remove'" text type="danger" @click="handleDelete(item)"
- >鍒犻櫎</ElButton
- >
+ <ElButton v-auth="'list'" text @click="openToolsDrawer(item)">{{ t('pages.system.aiMcpMount.actions.toolsPreview') }}</ElButton>
+ <ElButton v-auth="'remove'" text type="danger" @click="handleDelete(item)">{{ t('common.actions.delete') }}</ElButton>
</ElSpace>
</div>
</article>
@@ -168,6 +164,7 @@
<script setup>
import { ElMessage, ElMessageBox } from 'element-plus'
+ import { useI18n } from 'vue-i18n'
import { useTable } from '@/hooks/core/useTable'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
import {
@@ -191,6 +188,7 @@
defineOptions({ name: 'AiMcpMount' })
+ const { t } = useI18n()
const searchForm = ref(createAiMcpMountSearchState())
const dialogVisible = ref(false)
const dialogMode = ref('create')
@@ -201,16 +199,16 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('pages.system.aiMcpMount.search.condition'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ悕绉�'
+ placeholder: t('pages.system.aiMcpMount.search.conditionPlaceholder')
}
},
{
- label: '浼犺緭绫诲瀷',
+ label: t('pages.system.aiMcpMount.search.transportType'),
key: 'transportType',
type: 'select',
props: {
@@ -223,14 +221,14 @@
}
},
{
- label: '鐘舵��',
+ label: t('pages.system.aiMcpMount.search.status'),
key: 'status',
type: 'select',
props: {
clearable: true,
options: [
- { label: '鍚敤', value: 1 },
- { label: '鍋滅敤', value: 0 }
+ { label: t('common.status.enabled'), value: 1 },
+ { label: t('common.status.disabled'), value: 0 }
]
}
}
@@ -267,9 +265,9 @@
const groupedRecords = computed(() => {
const groups = [
- { key: 'BUILTIN', title: '鍐呯疆 MCP', description: '绯荤粺鍐呯疆鐨勬爣鍑� MCP 鎸傝浇銆�' },
- { key: 'SSE_HTTP', title: 'SSE / HTTP', description: '閫氳繃鏈嶅姟鍦板潃鍜� SSE 绔偣鎺ュ叆鐨� MCP銆�' },
- { key: 'STDIO', title: 'STDIO', description: '閫氳繃鏈湴鍛戒护鍚姩鐨� MCP銆�' }
+ { key: 'BUILTIN', title: t('pages.system.aiMcpMount.groups.builtin.title'), description: t('pages.system.aiMcpMount.groups.builtin.description') },
+ { key: 'SSE_HTTP', title: t('pages.system.aiMcpMount.groups.sse.title'), description: t('pages.system.aiMcpMount.groups.sse.description') },
+ { key: 'STDIO', title: t('pages.system.aiMcpMount.groups.stdio.title'), description: t('pages.system.aiMcpMount.groups.stdio.description') }
]
return groups
.map((group) => ({
@@ -321,13 +319,13 @@
try {
if (dialogMode.value === 'edit') {
await fetchUpdateAiMcpMount(payload)
- ElMessage.success('淇敼鎴愬姛')
+ ElMessage.success(t('crud.messages.updateSuccess'))
dialogVisible.value = false
await refreshUpdate()
return
}
await fetchSaveAiMcpMount(payload)
- ElMessage.success('鏂板鎴愬姛')
+ ElMessage.success(t('crud.messages.createSuccess'))
dialogVisible.value = false
await refreshCreate()
} catch {
@@ -337,17 +335,23 @@
async function handleDelete(record) {
try {
- await ElMessageBox.confirm(`纭畾瑕佸垹闄ゆ寕杞姐��${record.name || record.id}銆嶅悧锛焋, '鍒犻櫎纭', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
+ await ElMessageBox.confirm(
+ t('crud.confirm.deleteMessage', {
+ entity: t('pages.system.aiMcpMount.entity'),
+ label: record.name || record.id
+ }),
+ t('crud.confirm.deleteTitle'),
+ {
+ confirmButtonText: t('common.confirm'),
+ cancelButtonText: t('common.cancel'),
type: 'warning'
})
await fetchDeleteAiMcpMount(record.id)
- ElMessage.success('鍒犻櫎鎴愬姛')
+ ElMessage.success(t('crud.messages.deleteSuccess'))
await refreshRemove()
} catch (error) {
if (error !== 'cancel') {
- ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+ ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
}
}
}
@@ -356,12 +360,12 @@
connectivityTestingId.value = record.id
try {
const result = await guardRequestWithMessage(fetchTestAiMcpConnectivity(record.id), null, {
- timeoutMessage: '杩為�氭�ф祴璇曡秴鏃讹紝宸插仠姝㈢瓑寰�'
+ timeoutMessage: t('pages.system.aiMcpMount.messages.connectivityTimeout')
})
- ElMessage.success(result?.message || '杩為�氭�ф祴璇曟垚鍔�')
+ ElMessage.success(result?.message || t('pages.system.aiMcpMount.messages.connectivitySuccess'))
await refreshUpdate()
} catch (error) {
- ElMessage.error(error?.message || '杩為�氭�ф祴璇曞け璐�')
+ ElMessage.error(error?.message || t('pages.system.aiMcpMount.messages.connectivityFailed'))
} finally {
connectivityTestingId.value = null
}
diff --git a/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-mount-dialog.vue b/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-mount-dialog.vue
index eba8b9a..7a540ff 100644
--- a/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-mount-dialog.vue
+++ b/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-mount-dialog.vue
@@ -20,63 +20,115 @@
:disabled="isReadonly"
/>
- <div v-if="!isReadonly" class="mt-4 rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] p-4">
+ <div
+ v-if="!isReadonly"
+ class="mt-4 rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] p-4"
+ >
<div class="flex flex-wrap items-center justify-between gap-3">
<div>
- <div class="text-sm font-semibold text-[var(--art-gray-900)]">鑽夌杩為�氭�ф祴璇�</div>
- <div class="mt-1 text-xs text-[var(--art-gray-500)]">淇濆瓨鍓嶅厛鏍¢獙褰撳墠鎸傝浇閰嶇疆鏄惁鍙繛閫氥��</div>
+ <div class="text-sm font-semibold text-[var(--art-gray-900)]">
+ {{ t('pages.system.aiMcpMount.dialog.draftTestTitle') }}
+ </div>
+ <div class="mt-1 text-xs text-[var(--art-gray-500)]">
+ {{ t('pages.system.aiMcpMount.dialog.draftTestDescription') }}
+ </div>
</div>
- <ElButton :loading="draftTesting" @click="handleDraftValidate">鑽夌杩為�氭�ф祴璇�</ElButton>
+ <ElButton :loading="draftTesting" @click="handleDraftValidate">
+ {{ t('pages.system.aiMcpMount.dialog.draftTestAction') }}
+ </ElButton>
</div>
- <ElAlert v-if="draftValidateResult" class="mt-4" :type="draftValidateResult.healthStatus === 'HEALTHY' ? 'success' : 'error'" :closable="false">
+ <ElAlert
+ v-if="draftValidateResult"
+ class="mt-4"
+ :type="draftValidateResult.healthStatus === 'HEALTHY' ? 'success' : 'error'"
+ :closable="false"
+ >
<div class="space-y-1 text-sm">
- <div>{{ draftValidateResult.message || '--' }}</div>
- <div v-if="draftValidateResult.initElapsedMs !== undefined && draftValidateResult.initElapsedMs !== null">
- 鍒濆鍖栬�楁椂 {{ draftValidateResult.initElapsedMs }} ms
+ <div>{{ draftValidateResult.message || emptyText }}</div>
+ <div
+ v-if="
+ draftValidateResult.initElapsedMs !== undefined &&
+ draftValidateResult.initElapsedMs !== null
+ "
+ >
+ {{
+ t('pages.system.aiMcpMount.messages.initElapsedMs', {
+ value: draftValidateResult.initElapsedMs
+ })
+ }}
</div>
<div v-if="draftValidateResult.testedAt">{{ draftValidateResult.testedAt }}</div>
</div>
</ElAlert>
</div>
- <div class="mt-4 rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] p-4">
- <div class="text-sm font-semibold text-[var(--art-gray-900)]">杩愯鏃剁姸鎬�</div>
+ <div
+ class="mt-4 rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] p-4"
+ >
+ <div class="text-sm font-semibold text-[var(--art-gray-900)]">
+ {{ t('pages.system.aiMcpMount.dialog.runtimeTitle') }}
+ </div>
<div class="mt-4 grid gap-4 md:grid-cols-2">
<div class="rounded-xl bg-[var(--art-main-bg-color)] p-3">
- <div class="text-xs text-[var(--art-gray-500)]">鍋ュ悍鐘舵��</div>
- <div class="mt-2 text-sm text-[var(--art-gray-900)]">{{ form.healthStatus || 'NOT_TESTED' }}</div>
+ <div class="text-xs text-[var(--art-gray-500)]">
+ {{ t('pages.system.aiMcpMount.dialog.runtimeLabels.healthStatus') }}
+ </div>
+ <div class="mt-2 text-sm text-[var(--art-gray-900)]">
+ {{ form.healthStatus || 'NOT_TESTED' }}
+ </div>
</div>
<div class="rounded-xl bg-[var(--art-main-bg-color)] p-3">
- <div class="text-xs text-[var(--art-gray-500)]">鏈�杩戞祴璇曟椂闂�</div>
- <div class="mt-2 text-sm text-[var(--art-gray-900)]">{{ form['lastTestTime$'] || '--' }}</div>
+ <div class="text-xs text-[var(--art-gray-500)]">
+ {{ t('pages.system.aiMcpMount.dialog.runtimeLabels.lastTestTime') }}
+ </div>
+ <div class="mt-2 text-sm text-[var(--art-gray-900)]">
+ {{ form['lastTestTime$'] || emptyText }}
+ </div>
</div>
<div class="rounded-xl bg-[var(--art-main-bg-color)] p-3">
- <div class="text-xs text-[var(--art-gray-500)]">鏈�杩戝垵濮嬪寲鑰楁椂</div>
- <div class="mt-2 text-sm text-[var(--art-gray-900)]">{{ form.lastInitElapsedMs ?? '--' }}</div>
+ <div class="text-xs text-[var(--art-gray-500)]">
+ {{ t('pages.system.aiMcpMount.dialog.runtimeLabels.lastInitElapsedMs') }}
+ </div>
+ <div class="mt-2 text-sm text-[var(--art-gray-900)]">
+ {{ form.lastInitElapsedMs ?? emptyText }}
+ </div>
</div>
<div class="rounded-xl bg-[var(--art-main-bg-color)] p-3">
- <div class="text-xs text-[var(--art-gray-500)]">鏈�杩戞洿鏂版椂闂�</div>
- <div class="mt-2 text-sm text-[var(--art-gray-900)]">{{ form['updateTime$'] || '--' }}</div>
+ <div class="text-xs text-[var(--art-gray-500)]">
+ {{ t('pages.system.aiMcpMount.dialog.runtimeLabels.updateTime') }}
+ </div>
+ <div class="mt-2 text-sm text-[var(--art-gray-900)]">
+ {{ form['updateTime$'] || emptyText }}
+ </div>
</div>
</div>
<div class="mt-4 rounded-xl bg-[var(--art-main-bg-color)] p-3">
- <div class="text-xs text-[var(--art-gray-500)]">鏈�杩戞祴璇曚俊鎭�</div>
- <div class="mt-2 whitespace-pre-wrap break-all text-sm text-[var(--art-gray-900)]">{{ form.lastTestMessage || '--' }}</div>
+ <div class="text-xs text-[var(--art-gray-500)]">
+ {{ t('pages.system.aiMcpMount.dialog.runtimeLabels.lastTestMessage') }}
+ </div>
+ <div class="mt-2 whitespace-pre-wrap break-all text-sm text-[var(--art-gray-900)]">
+ {{ form.lastTestMessage || emptyText }}
+ </div>
</div>
</div>
<template #footer>
<span class="dialog-footer">
- <ElButton @click="handleCancel">{{ isReadonly ? '鍏抽棴' : '鍙栨秷' }}</ElButton>
- <ElButton v-if="!isReadonly" type="primary" @click="handleSubmit">纭畾</ElButton>
+ <ElButton @click="handleCancel">
+ {{ isReadonly ? t('common.actions.close') : t('common.cancel') }}
+ </ElButton>
+ <ElButton v-if="!isReadonly" type="primary" @click="handleSubmit">
+ {{ t('common.confirm') }}
+ </ElButton>
</span>
</template>
</ElDialog>
</template>
<script setup>
- import ArtForm from '@/components/core/forms/art-form/index.vue'
+ import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus'
+ import ArtForm from '@/components/core/forms/art-form/index.vue'
import { fetchValidateAiMcpDraftConnectivity } from '@/api/ai-config'
import {
buildAiMcpMountDialogModel,
@@ -91,73 +143,94 @@
})
const emit = defineEmits(['update:visible', 'submit'])
+ const { t } = useI18n()
const formRef = ref()
const form = reactive(buildAiMcpMountDialogModel())
const draftTesting = ref(false)
const draftValidateResult = ref(null)
+ const emptyText = computed(() => t('common.placeholder.empty'))
const isReadonly = computed(() => props.mode === 'show')
const dialogTitle = computed(() => {
- if (props.mode === 'edit') return '缂栬緫鎸傝浇'
- if (props.mode === 'show') return '鎸傝浇璇︽儏'
- return '鏂板缓鎸傝浇'
+ if (props.mode === 'edit') return t('pages.system.aiMcpMount.dialog.titleEdit')
+ if (props.mode === 'show') return t('pages.system.aiMcpMount.dialog.titleDetail')
+ return t('pages.system.aiMcpMount.dialog.titleCreate')
})
const rules = computed(() => ({
- name: [{ required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }],
- transportType: [{ required: true, message: '璇烽�夋嫨浼犺緭绫诲瀷', trigger: 'change' }]
+ name: [{ required: true, message: t('pages.system.aiMcpMount.dialog.validation.name'), trigger: 'blur' }],
+ transportType: [
+ {
+ required: true,
+ message: t('pages.system.aiMcpMount.dialog.validation.transportType'),
+ trigger: 'change'
+ }
+ ]
}))
const formItems = computed(() => {
const items = [
{
- label: '鍚嶇О',
+ label: t('pages.system.aiMcpMount.dialog.labels.name'),
key: 'name',
type: 'input',
- props: { clearable: true, placeholder: '璇疯緭鍏ュ悕绉�' }
+ props: { clearable: true, placeholder: t('pages.system.aiMcpMount.dialog.placeholders.name') }
},
{
- label: '浼犺緭绫诲瀷',
+ label: t('pages.system.aiMcpMount.dialog.labels.transportType'),
key: 'transportType',
type: 'select',
props: {
options: getAiMcpMountTransportOptions(),
- placeholder: '璇烽�夋嫨浼犺緭绫诲瀷'
+ placeholder: t('pages.system.aiMcpMount.dialog.placeholders.transportType')
}
}
]
if (form.transportType === 'BUILTIN') {
items.push({
- label: '鍐呯疆 MCP 缂栫爜',
+ label: t('pages.system.aiMcpMount.dialog.labels.builtinCode'),
key: 'builtinCode',
type: 'input',
span: 24,
- props: { clearable: true, placeholder: '璇疯緭鍏ュ唴缃� MCP 缂栫爜' }
+ props: {
+ clearable: true,
+ placeholder: t('pages.system.aiMcpMount.dialog.placeholders.builtinCode')
+ }
})
}
if (form.transportType === 'SSE_HTTP') {
items.push(
{
- label: '鏈嶅姟鍦板潃',
+ label: t('pages.system.aiMcpMount.dialog.labels.serverUrl'),
key: 'serverUrl',
type: 'input',
span: 24,
- props: { clearable: true, placeholder: '璇疯緭鍏ユ湇鍔″湴鍧�' }
+ props: {
+ clearable: true,
+ placeholder: t('pages.system.aiMcpMount.dialog.placeholders.serverUrl')
+ }
},
{
- label: 'SSE 绔偣',
+ label: t('pages.system.aiMcpMount.dialog.labels.endpoint'),
key: 'endpoint',
type: 'input',
- props: { clearable: true, placeholder: '璇疯緭鍏� SSE 绔偣' }
+ props: {
+ clearable: true,
+ placeholder: t('pages.system.aiMcpMount.dialog.placeholders.endpoint')
+ }
},
{
- label: '璇锋眰澶� JSON',
+ label: t('pages.system.aiMcpMount.dialog.labels.headersJson'),
key: 'headersJson',
type: 'input',
span: 24,
- props: { type: 'textarea', rows: 4, placeholder: '璇疯緭鍏ヨ姹傚ご JSON' }
+ props: {
+ type: 'textarea',
+ rows: 4,
+ placeholder: t('pages.system.aiMcpMount.dialog.placeholders.headersJson')
+ }
}
)
}
@@ -165,62 +238,84 @@
if (form.transportType === 'STDIO') {
items.push(
{
- label: '鍛戒护',
+ label: t('pages.system.aiMcpMount.dialog.labels.command'),
key: 'command',
type: 'input',
span: 24,
- props: { clearable: true, placeholder: '璇疯緭鍏ュ懡浠�' }
+ props: {
+ clearable: true,
+ placeholder: t('pages.system.aiMcpMount.dialog.placeholders.command')
+ }
},
{
- label: '鍛戒护鍙傛暟 JSON',
+ label: t('pages.system.aiMcpMount.dialog.labels.argsJson'),
key: 'argsJson',
type: 'input',
span: 24,
- props: { type: 'textarea', rows: 4, placeholder: '璇疯緭鍏ュ懡浠ゅ弬鏁� JSON' }
+ props: {
+ type: 'textarea',
+ rows: 4,
+ placeholder: t('pages.system.aiMcpMount.dialog.placeholders.argsJson')
+ }
},
{
- label: '鐜鍙橀噺 JSON',
+ label: t('pages.system.aiMcpMount.dialog.labels.envJson'),
key: 'envJson',
type: 'input',
span: 24,
- props: { type: 'textarea', rows: 4, placeholder: '璇疯緭鍏ョ幆澧冨彉閲� JSON' }
+ props: {
+ type: 'textarea',
+ rows: 4,
+ placeholder: t('pages.system.aiMcpMount.dialog.placeholders.envJson')
+ }
}
)
}
items.push(
{
- label: '璇锋眰瓒呮椂(ms)',
+ label: t('pages.system.aiMcpMount.dialog.labels.requestTimeoutMs'),
key: 'requestTimeoutMs',
type: 'number',
- props: { min: 1000, placeholder: '璇疯緭鍏ヨ姹傝秴鏃�' }
+ props: {
+ min: 1000,
+ placeholder: t('pages.system.aiMcpMount.dialog.placeholders.requestTimeoutMs')
+ }
},
{
- label: '鎺掑簭',
+ label: t('pages.system.aiMcpMount.dialog.labels.sort'),
key: 'sort',
type: 'number',
- props: { min: 0, placeholder: '璇疯緭鍏ユ帓搴�' }
+ props: {
+ min: 0,
+ placeholder: t('pages.system.aiMcpMount.dialog.placeholders.sort')
+ }
},
{
- label: '鐘舵��',
+ label: t('pages.system.aiMcpMount.dialog.labels.status'),
key: 'status',
type: 'select',
props: {
options: [
- { label: '鍚敤', value: 1 },
- { label: '鍋滅敤', value: 0 }
+ { label: t('common.status.enabled'), value: 1 },
+ { label: t('common.status.disabled'), value: 0 }
],
- placeholder: '璇烽�夋嫨鐘舵��'
+ placeholder: t('pages.system.aiMcpMount.dialog.placeholders.status')
}
},
{
- label: '澶囨敞',
+ label: t('pages.system.aiMcpMount.dialog.labels.memo'),
key: 'memo',
type: 'input',
span: 24,
- props: { type: 'textarea', rows: 3, placeholder: '璇疯緭鍏ュ娉�' }
+ props: {
+ type: 'textarea',
+ rows: 3,
+ placeholder: t('pages.system.aiMcpMount.dialog.placeholders.memo')
+ }
}
)
+
return items
})
@@ -239,11 +334,13 @@
draftTesting.value = true
try {
draftValidateResult.value = await fetchValidateAiMcpDraftConnectivity(buildAiMcpMountSavePayload(form))
- ElMessage.success(draftValidateResult.value?.message || '鑽夌杩為�氭�ф祴璇曟垚鍔�')
+ ElMessage.success(
+ draftValidateResult.value?.message || t('pages.system.aiMcpMount.messages.draftConnectivitySuccess')
+ )
} catch (error) {
draftValidateResult.value = {
healthStatus: 'UNHEALTHY',
- message: error?.message || '鑽夌杩為�氭�ф祴璇曞け璐�'
+ message: error?.message || t('pages.system.aiMcpMount.messages.draftConnectivityFailed')
}
ElMessage.error(draftValidateResult.value.message)
} finally {
diff --git a/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-tools-drawer.vue b/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-tools-drawer.vue
index ce571b0..bc99fcf 100644
--- a/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-tools-drawer.vue
+++ b/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-tools-drawer.vue
@@ -1,34 +1,61 @@
<template>
<ElDrawer
:model-value="visible"
- title="MCP 宸ュ叿棰勮"
+ :title="t('pages.system.aiMcpMount.toolsDrawer.title')"
size="760px"
@update:model-value="handleVisibleChange"
>
<div class="space-y-4">
- <div class="flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] p-4">
+ <div
+ class="flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] p-4"
+ >
<div>
- <div class="text-sm font-semibold text-[var(--art-gray-900)]">{{ mountName || '褰撳墠鎸傝浇' }}</div>
- <div class="mt-1 text-xs text-[var(--art-gray-500)]">鍙瑙堝伐鍏峰垪琛紝骞跺宸ュ叿鍏ュ弬鍋氳仈璋冩祴璇曘��</div>
+ <div class="text-sm font-semibold text-[var(--art-gray-900)]">
+ {{ mountName || t('pages.system.aiMcpMount.toolsDrawer.currentMount') }}
+ </div>
+ <div class="mt-1 text-xs text-[var(--art-gray-500)]">
+ {{ t('pages.system.aiMcpMount.toolsDrawer.description') }}
+ </div>
</div>
<ElSpace wrap>
- <ElButton :loading="toolsLoading" @click="loadTools">鍒锋柊宸ュ叿</ElButton>
- <ElButton :loading="connectivityLoading" @click="handleConnectivityTest">杩為�氭�ф祴璇�</ElButton>
+ <ElButton :loading="toolsLoading" @click="loadTools">
+ {{ t('pages.system.aiMcpMount.toolsDrawer.refreshTools') }}
+ </ElButton>
+ <ElButton :loading="connectivityLoading" @click="handleConnectivityTest">
+ {{ t('pages.system.aiMcpMount.toolsDrawer.connectivityTest') }}
+ </ElButton>
</ElSpace>
</div>
- <ElAlert v-if="connectivityResult" :type="connectivityResult.healthStatus === 'HEALTHY' ? 'success' : 'error'" :closable="false">
+ <ElAlert
+ v-if="connectivityResult"
+ :type="connectivityResult.healthStatus === 'HEALTHY' ? 'success' : 'error'"
+ :closable="false"
+ >
<div class="space-y-1 text-sm">
- <div>{{ connectivityResult.message || '--' }}</div>
- <div v-if="connectivityResult.initElapsedMs !== undefined && connectivityResult.initElapsedMs !== null">
- 鍒濆鍖栬�楁椂 {{ connectivityResult.initElapsedMs }} ms
+ <div>{{ connectivityResult.message || emptyText }}</div>
+ <div
+ v-if="
+ connectivityResult.initElapsedMs !== undefined &&
+ connectivityResult.initElapsedMs !== null
+ "
+ >
+ {{
+ t('pages.system.aiMcpMount.messages.initElapsedMs', {
+ value: connectivityResult.initElapsedMs
+ })
+ }}
</div>
<div v-if="connectivityResult.testedAt">{{ connectivityResult.testedAt }}</div>
</div>
</ElAlert>
<ElSkeleton :loading="toolsLoading" animated :rows="8">
- <ElEmpty v-if="!tools.length" description="鏆傛棤宸ュ叿淇℃伅" :image-size="100" />
+ <ElEmpty
+ v-if="!tools.length"
+ :description="t('pages.system.aiMcpMount.toolsDrawer.empty')"
+ :image-size="100"
+ />
<div v-else class="space-y-4">
<div
@@ -39,36 +66,46 @@
<div class="flex flex-wrap items-start justify-between gap-3">
<div>
<div class="text-base font-semibold text-[var(--art-gray-900)]">{{ tool.name }}</div>
- <div class="mt-1 text-sm text-[var(--art-gray-500)]">{{ tool.description || '--' }}</div>
+ <div class="mt-1 text-sm text-[var(--art-gray-500)]">{{ tool.description || emptyText }}</div>
</div>
- <ElButton :loading="testingToolName === tool.name" @click="handleToolTest(tool.name)">宸ュ叿娴嬭瘯</ElButton>
+ <ElButton :loading="testingToolName === tool.name" @click="handleToolTest(tool.name)">
+ {{ t('pages.system.aiMcpMount.toolsDrawer.toolTest') }}
+ </ElButton>
</div>
<div class="mt-4 grid gap-4 md:grid-cols-2">
<div class="space-y-2">
- <div class="text-xs text-[var(--art-gray-500)]">杈撳叆鍙傛暟 JSON</div>
+ <div class="text-xs text-[var(--art-gray-500)]">
+ {{ t('pages.system.aiMcpMount.toolsDrawer.inputJson') }}
+ </div>
<ElInput
v-model="toolInputs[tool.name]"
type="textarea"
:rows="8"
- placeholder='璇疯緭鍏� JSON锛屼緥濡� {"taskCode":"TK001"}'
+ :placeholder="t('pages.system.aiMcpMount.toolsDrawer.inputJsonPlaceholder')"
/>
</div>
<div class="space-y-2">
- <div class="text-xs text-[var(--art-gray-500)]">宸ュ叿杈撳嚭</div>
+ <div class="text-xs text-[var(--art-gray-500)]">
+ {{ t('pages.system.aiMcpMount.toolsDrawer.output') }}
+ </div>
<ElInput
:model-value="toolOutputs[tool.name] || ''"
type="textarea"
:rows="8"
readonly
- placeholder="宸ュ叿杈撳嚭浼氭樉绀哄湪杩欓噷"
+ :placeholder="t('pages.system.aiMcpMount.toolsDrawer.outputPlaceholder')"
/>
</div>
</div>
<div v-if="tool.inputSchema" class="mt-4 rounded-xl bg-[var(--art-main-bg-color)] p-3">
- <div class="text-xs text-[var(--art-gray-500)]">杈撳叆 Schema</div>
- <pre class="mt-2 whitespace-pre-wrap break-all text-xs leading-6 text-[var(--art-gray-900)]">{{ formatSchema(tool.inputSchema) }}</pre>
+ <div class="text-xs text-[var(--art-gray-500)]">
+ {{ t('pages.system.aiMcpMount.toolsDrawer.inputSchema') }}
+ </div>
+ <pre class="mt-2 whitespace-pre-wrap break-all text-xs leading-6 text-[var(--art-gray-900)]">{{
+ formatSchema(tool.inputSchema)
+ }}</pre>
</div>
</div>
</div>
@@ -78,6 +115,7 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
import { fetchPreviewAiMcpTools, fetchTestAiMcpConnectivity, fetchTestAiMcpTool } from '@/api/ai-config'
@@ -89,6 +127,7 @@
})
const emit = defineEmits(['update:visible'])
+ const { t } = useI18n()
const tools = ref([])
const toolsLoading = ref(false)
const connectivityLoading = ref(false)
@@ -96,6 +135,8 @@
const toolInputs = reactive({})
const toolOutputs = reactive({})
const testingToolName = ref('')
+
+ const emptyText = computed(() => t('common.placeholder.empty'))
function resetState() {
tools.value = []
@@ -118,12 +159,12 @@
toolsLoading.value = true
try {
const response = await guardRequestWithMessage(fetchPreviewAiMcpTools(props.mountId), [], {
- timeoutMessage: '宸ュ叿鍒楄〃鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.system.aiMcpMount.messages.toolsTimeout')
})
tools.value = Array.isArray(response) ? response : []
} catch (error) {
tools.value = []
- ElMessage.error(error?.message || '鑾峰彇宸ュ叿鍒楄〃澶辫触')
+ ElMessage.error(error?.message || t('pages.system.aiMcpMount.toolsDrawer.toolsLoadFailed'))
} finally {
toolsLoading.value = false
}
@@ -134,11 +175,13 @@
connectivityLoading.value = true
try {
connectivityResult.value = await guardRequestWithMessage(fetchTestAiMcpConnectivity(props.mountId), null, {
- timeoutMessage: '杩為�氭�ф祴璇曡秴鏃讹紝宸插仠姝㈢瓑寰�'
+ timeoutMessage: t('pages.system.aiMcpMount.messages.connectivityTimeout')
})
- ElMessage.success(connectivityResult.value?.message || '杩為�氭�ф祴璇曟垚鍔�')
+ ElMessage.success(
+ connectivityResult.value?.message || t('pages.system.aiMcpMount.messages.connectivitySuccess')
+ )
} catch (error) {
- ElMessage.error(error?.message || '杩為�氭�ф祴璇曞け璐�')
+ ElMessage.error(error?.message || t('pages.system.aiMcpMount.messages.connectivityFailed'))
} finally {
connectivityLoading.value = false
}
@@ -148,7 +191,7 @@
if (!props.mountId) return
const inputJson = toolInputs[toolName]?.trim?.() || ''
if (!inputJson) {
- ElMessage.warning('璇疯緭鍏ュ伐鍏锋祴璇曞叆鍙� JSON')
+ ElMessage.warning(t('pages.system.aiMcpMount.toolsDrawer.toolInputRequired'))
return
}
testingToolName.value = toolName
@@ -160,14 +203,14 @@
}),
null,
{
- timeoutMessage: '宸ュ叿娴嬭瘯瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.system.aiMcpMount.messages.toolTestTimeout')
}
)
toolOutputs[toolName] = result?.output || JSON.stringify(result || {}, null, 2)
- ElMessage.success('宸ュ叿娴嬭瘯鎴愬姛')
+ ElMessage.success(t('pages.system.aiMcpMount.toolsDrawer.toolTestSuccess'))
} catch (error) {
- toolOutputs[toolName] = error?.message || '宸ュ叿娴嬭瘯澶辫触'
- ElMessage.error(error?.message || '宸ュ叿娴嬭瘯澶辫触')
+ toolOutputs[toolName] = error?.message || t('pages.system.aiMcpMount.toolsDrawer.toolTestFailed')
+ ElMessage.error(error?.message || t('pages.system.aiMcpMount.toolsDrawer.toolTestFailed'))
} finally {
testingToolName.value = ''
}
diff --git a/rsf-design/src/views/system/ai-observe/aiObservePage.helpers.js b/rsf-design/src/views/system/ai-observe/aiObservePage.helpers.js
index e3a6320..7fdbe04 100644
--- a/rsf-design/src/views/system/ai-observe/aiObservePage.helpers.js
+++ b/rsf-design/src/views/system/ai-observe/aiObservePage.helpers.js
@@ -1,4 +1,10 @@
-export const AI_OBSERVE_REPORT_TITLE = 'AI 瑙傛祴鎶ヨ〃'
+export function getAiObserveReportTitle(t) {
+ return t('pages.system.aiObserve.reportTitle')
+}
+
+function translate(t, key) {
+ return typeof t === 'function' ? t(key) : key
+}
export function createAiObserveSearchState() {
return {
@@ -40,18 +46,18 @@
}
}
-export function getAiObserveStatusMeta(status) {
+export function getAiObserveStatusMeta(status, t) {
if (status === 'COMPLETED') {
- return { text: '宸插畬鎴�', type: 'success' }
+ return { text: translate(t, 'pages.system.aiObserve.status.completed'), type: 'success' }
}
if (status === 'FAILED') {
- return { text: '澶辫触', type: 'danger' }
+ return { text: translate(t, 'pages.system.aiObserve.status.failed'), type: 'danger' }
}
if (status === 'ABORTED') {
- return { text: '宸蹭腑姝�', type: 'warning' }
+ return { text: translate(t, 'pages.system.aiObserve.status.aborted'), type: 'warning' }
}
if (status === 'RUNNING') {
- return { text: '鎵ц涓�', type: 'primary' }
+ return { text: translate(t, 'pages.system.aiObserve.status.running'), type: 'primary' }
}
return { text: status || '--', type: 'info' }
}
@@ -76,8 +82,8 @@
}
}
-export function normalizeAiObserveRow(row = {}) {
- const statusMeta = getAiObserveStatusMeta(row.status)
+export function normalizeAiObserveRow(row = {}, t) {
+ const statusMeta = getAiObserveStatusMeta(row.status, t)
const userLabel = row.userLabel || row.userId$ || row.userName || (row.userId ?? '')
return {
...row,
@@ -97,12 +103,12 @@
}
}
-export function buildAiObserveDetail(detail = {}, fallback = {}) {
+export function buildAiObserveDetail(detail = {}, fallback = {}, t) {
const merged = {
...fallback,
...detail
}
- const statusMeta = getAiObserveStatusMeta(merged.status)
+ const statusMeta = getAiObserveStatusMeta(merged.status, t)
return {
requestId: merged.requestId || '',
sessionId: merged.sessionId ?? '',
@@ -135,22 +141,22 @@
}
}
-export function getAiObserveReportColumns() {
+export function getAiObserveReportColumns(t) {
return [
- { prop: 'requestId', label: '璇锋眰ID' },
+ { prop: 'requestId', label: t('pages.system.aiObserve.table.requestId') },
{ prop: 'promptLabel', label: 'Prompt' },
- { prop: 'model', label: '妯″瀷' },
- { prop: 'userLabel', label: '鐢ㄦ埛' },
- { prop: 'statusText', label: '鐘舵��' },
- { prop: 'elapsedText', label: '鎬昏�楁椂(ms)' },
- { prop: 'totalTokensText', label: '鎬� Tokens' },
- { prop: 'createTimeText', label: '鍒涘缓鏃堕棿' }
+ { prop: 'model', label: t('pages.system.aiObserve.table.model') },
+ { prop: 'userLabel', label: t('pages.system.aiObserve.table.user') },
+ { prop: 'statusText', label: t('pages.system.aiObserve.table.status') },
+ { prop: 'elapsedText', label: t('pages.system.aiObserve.table.elapsed') },
+ { prop: 'totalTokensText', label: t('pages.system.aiObserve.table.totalTokens') },
+ { prop: 'createTimeText', label: t('pages.system.aiObserve.table.createTime') }
]
}
-export function buildAiObservePrintRows(rows = []) {
+export function buildAiObservePrintRows(rows = [], t) {
return rows.map((item) => {
- const normalized = normalizeAiObserveRow(item)
+ const normalized = normalizeAiObserveRow(item, t)
return {
requestId: normalized.requestId || '--',
promptLabel: [normalized.promptName || '--', normalized.promptCode || '--'].join(' / '),
diff --git a/rsf-design/src/views/system/ai-observe/aiObserveTable.columns.js b/rsf-design/src/views/system/ai-observe/aiObserveTable.columns.js
index b8b3674..d4c5ef2 100644
--- a/rsf-design/src/views/system/ai-observe/aiObserveTable.columns.js
+++ b/rsf-design/src/views/system/ai-observe/aiObserveTable.columns.js
@@ -2,12 +2,12 @@
import { ElTag } from 'element-plus'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
-export function createAiObserveTableColumns({ handleView }) {
+export function createAiObserveTableColumns({ handleView, t }) {
return [
{ type: 'selection', width: 52, fixed: 'left' },
{
prop: 'requestId',
- label: '璇锋眰ID',
+ label: t('pages.system.aiObserve.table.requestId'),
minWidth: 210,
showOverflowTooltip: true,
formatter: (row) => row.requestId || '-'
@@ -25,44 +25,44 @@
},
{
prop: 'model',
- label: '妯″瀷',
+ label: t('pages.system.aiObserve.table.model'),
minWidth: 150,
showOverflowTooltip: true,
formatter: (row) => row.model || '-'
},
{
prop: 'userLabel',
- label: '鐢ㄦ埛',
+ label: t('pages.system.aiObserve.table.user'),
width: 110,
formatter: (row) => row.userLabel || '-'
},
{
prop: 'status',
- label: '鐘舵��',
+ label: t('pages.system.aiObserve.table.status'),
width: 100,
formatter: (row) => h(ElTag, { type: row.statusType, effect: 'light' }, () => row.statusText)
},
{
prop: 'elapsedText',
- label: '鎬昏�楁椂',
+ label: t('pages.system.aiObserve.table.elapsed'),
width: 110,
formatter: (row) => row.elapsedText || '--'
},
{
prop: 'totalTokens',
- label: '鎬� Tokens',
+ label: t('pages.system.aiObserve.table.totalTokens'),
width: 110,
formatter: (row) => row.totalTokens ?? '--'
},
{
prop: 'createTime$',
- label: '鍒涘缓鏃堕棿',
+ label: t('pages.system.aiObserve.table.createTime'),
minWidth: 170,
formatter: (row) => row['createTime$'] || '-'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: t('table.operation'),
width: 70,
align: 'right',
fixed: 'right',
diff --git a/rsf-design/src/views/system/ai-observe/index.vue b/rsf-design/src/views/system/ai-observe/index.vue
index 5833dbe..03c3338 100644
--- a/rsf-design/src/views/system/ai-observe/index.vue
+++ b/rsf-design/src/views/system/ai-observe/index.vue
@@ -30,14 +30,14 @@
<ElCard class="art-table-card">
<div class="mb-4">
- <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">AI 瑙傛祴鎽樿</h3>
- <p class="mt-1 text-sm text-[var(--art-gray-500)]">瑙傚療 AI 璋冪敤鐘舵�併�佽�楁椂銆乀okens 涓� MCP 宸ュ叿鎵ц鎯呭喌銆�</p>
+ <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">{{ t('pages.system.aiObserve.summaryTitle') }}</h3>
+ <p class="mt-1 text-sm text-[var(--art-gray-500)]">{{ t('pages.system.aiObserve.summaryDescription') }}</p>
</div>
<ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshAll">
<template #left>
<ElSpace wrap>
- <ElTag effect="plain" type="info">鏈�杩戝叡 {{ pagination.total || 0 }} 鏉¤皟鐢ㄨ褰�</ElTag>
+ <ElTag effect="plain" type="info">{{ t('common.count', { count: pagination.total || 0 }) }}</ElTag>
</ElSpace>
</template>
</ArtTableHeader>
@@ -63,6 +63,7 @@
<script setup>
import { ElMessage } from 'element-plus'
+ import { useI18n } from 'vue-i18n'
import { useTable } from '@/hooks/core/useTable'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
import {
@@ -72,11 +73,11 @@
fetchGetAiObserveStats
} from '@/api/ai-config'
import {
- AI_OBSERVE_REPORT_TITLE,
buildAiObserveDetail,
buildAiObservePageQueryParams,
buildAiObserveSearchParams,
createAiObserveSearchState,
+ getAiObserveReportTitle,
getAiObservePaginationKey,
normalizeAiObserveRow,
normalizeAiObserveStats
@@ -85,6 +86,7 @@
import AiObserveDetailDrawer from './modules/ai-observe-detail-drawer.vue'
defineOptions({ name: 'AiObserve' })
+ const { t } = useI18n()
const searchForm = ref(createAiObserveSearchState())
const selectedRows = ref([])
@@ -96,52 +98,53 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('pages.system.aiObserve.search.condition'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヨ姹侷D鎴� Prompt'
+ placeholder: t('pages.system.aiObserve.search.conditionPlaceholder')
}
},
{
- label: '璇锋眰ID',
+ label: t('pages.system.aiObserve.search.requestId'),
key: 'requestId',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ヨ姹侷D'
+ placeholder: t('pages.system.aiObserve.search.requestIdPlaceholder')
}
},
{
- label: 'Prompt 缂栫爜',
+ label: t('pages.system.aiObserve.search.promptCode'),
key: 'promptCode',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏� Prompt 缂栫爜'
+ placeholder: t('pages.system.aiObserve.search.promptCodePlaceholder')
}
},
{
- label: '鐢ㄦ埛',
+ label: t('pages.system.aiObserve.search.user'),
key: 'userId',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ敤鎴稩D'
+ placeholder: t('pages.system.aiObserve.search.userPlaceholder')
}
},
{
- label: '鐘舵��',
+ label: t('pages.system.aiObserve.search.status'),
key: 'status',
type: 'select',
props: {
clearable: true,
+ placeholder: t('pages.system.aiObserve.search.statusPlaceholder'),
options: [
- { label: '鎵ц涓�', value: 'RUNNING' },
- { label: '宸插畬鎴�', value: 'COMPLETED' },
- { label: '澶辫触', value: 'FAILED' },
- { label: '宸蹭腑姝�', value: 'ABORTED' }
+ { label: t('pages.system.aiObserve.status.running'), value: 'RUNNING' },
+ { label: t('pages.system.aiObserve.status.completed'), value: 'COMPLETED' },
+ { label: t('pages.system.aiObserve.status.failed'), value: 'FAILED' },
+ { label: t('pages.system.aiObserve.status.aborted'), value: 'ABORTED' }
]
}
}
@@ -149,33 +152,43 @@
const summaryCards = computed(() => [
{
- label: '璋冪敤娆℃暟',
+ label: t('pages.system.aiObserve.stats.callCount'),
value: stats.value.callCount,
- description: `鎴愬姛 ${stats.value.successCount} / 澶辫触 ${stats.value.failureCount}`,
+ description: t('pages.system.aiObserve.stats.successFailure', {
+ success: stats.value.successCount,
+ failure: stats.value.failureCount
+ }),
icon: 'ri:pulse-line',
iconWrapClass: 'bg-sky-50',
iconClass: 'text-sky-600'
},
{
- label: '骞冲潎鑰楁椂',
+ label: t('pages.system.aiObserve.stats.avgElapsed'),
value: `${stats.value.avgElapsedMs} ms`,
- description: `棣栧寘 ${stats.value.avgFirstTokenLatencyMs} ms`,
+ description: t('pages.system.aiObserve.stats.firstTokenLatency', {
+ value: stats.value.avgFirstTokenLatencyMs
+ }),
icon: 'ri:timer-flash-line',
iconWrapClass: 'bg-amber-50',
iconClass: 'text-amber-600'
},
{
- label: '鎬� Tokens',
+ label: t('pages.system.aiObserve.stats.totalTokens'),
value: stats.value.totalTokens,
- description: `骞冲潎 ${stats.value.avgTotalTokens.toFixed(1)} Tokens`,
+ description: t('pages.system.aiObserve.stats.avgTokens', {
+ value: stats.value.avgTotalTokens.toFixed(1)
+ }),
icon: 'ri:coin-line',
iconWrapClass: 'bg-emerald-50',
iconClass: 'text-emerald-600'
},
{
- label: '宸ュ叿鎴愬姛鐜�',
+ label: t('pages.system.aiObserve.stats.toolSuccessRate'),
value: `${stats.value.toolSuccessRate.toFixed(2)}%`,
- description: `璋冪敤 ${stats.value.toolCallCount} / 澶辫触 ${stats.value.toolFailureCount}`,
+ description: t('pages.system.aiObserve.stats.toolCallFailure', {
+ callCount: stats.value.toolCallCount,
+ failureCount: stats.value.toolFailureCount
+ }),
icon: 'ri:service-line',
iconWrapClass: 'bg-violet-50',
iconClass: 'text-violet-600'
@@ -188,10 +201,10 @@
try {
const [detail, mcpLogs] = await Promise.all([
guardRequestWithMessage(fetchGetAiCallLogDetail(row.id), null, {
- timeoutMessage: 'AI 瑙傛祴璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.system.aiObserve.messages.detailTimeout')
}),
guardRequestWithMessage(fetchGetAiCallLogMcpLogs(row.id), [], {
- timeoutMessage: 'MCP 璋冪敤鏃ュ織鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.system.aiObserve.messages.mcpLogsTimeout')
})
])
detailData.value = buildAiObserveDetail(
@@ -199,12 +212,13 @@
...detail,
mcpLogs: Array.isArray(mcpLogs) ? mcpLogs : []
},
- row
+ row,
+ t
)
} catch (error) {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇 AI 瑙傛祴璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.system.aiObserve.messages.detailFailed'))
} finally {
detailLoading.value = false
}
@@ -229,7 +243,8 @@
paginationKey: getAiObservePaginationKey(),
columnsFactory: () =>
createAiObserveTableColumns({
- handleView: openDetail
+ handleView: openDetail,
+ t
})
},
transform: {
@@ -237,7 +252,7 @@
if (!Array.isArray(records)) {
return []
}
- return records.map((item) => normalizeAiObserveRow(item))
+ return records.map((item) => normalizeAiObserveRow(item, t))
}
}
})
@@ -246,12 +261,12 @@
statsLoading.value = true
try {
const response = await guardRequestWithMessage(fetchGetAiObserveStats(), normalizeAiObserveStats(), {
- timeoutMessage: 'AI 瑙傛祴鎽樿鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.system.aiObserve.messages.statsTimeout')
})
stats.value = normalizeAiObserveStats(response)
} catch (error) {
stats.value = normalizeAiObserveStats()
- ElMessage.error(error?.message || '鑾峰彇 AI 瑙傛祴鎽樿澶辫触')
+ ElMessage.error(error?.message || t('pages.system.aiObserve.messages.statsFailed'))
} finally {
statsLoading.value = false
}
diff --git a/rsf-design/src/views/system/ai-observe/modules/ai-observe-detail-drawer.vue b/rsf-design/src/views/system/ai-observe/modules/ai-observe-detail-drawer.vue
index c1ed6fd..93f62a3 100644
--- a/rsf-design/src/views/system/ai-observe/modules/ai-observe-detail-drawer.vue
+++ b/rsf-design/src/views/system/ai-observe/modules/ai-observe-detail-drawer.vue
@@ -1,50 +1,50 @@
<template>
<ElDrawer
:model-value="visible"
- title="AI 瑙傛祴璇︽儏"
+ :title="t('pages.system.aiObserve.detail.title')"
size="720px"
@update:model-value="handleVisibleChange"
>
<ElSkeleton :loading="loading" animated :rows="14">
<div class="space-y-5">
<ElDescriptions :column="2" border>
- <ElDescriptionsItem label="璇锋眰ID">{{ displayData.requestId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="浼氳瘽ID">{{ displayData.sessionId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="Prompt">{{ displayPrompt }}</ElDescriptionsItem>
- <ElDescriptionsItem label="妯″瀷">{{ displayData.model || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐢ㄦ埛">{{ displayData.userId || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.requestId')">{{ displayData.requestId || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.sessionId')">{{ displayData.sessionId || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.prompt')">{{ displayPrompt }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.model')">{{ displayData.model || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.user')">{{ displayData.userId || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.status')">
<ElTag :type="displayData.statusType" effect="light">{{ displayData.statusText || '--' }}</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="鎸傝浇 MCP">{{ displayData.mountedMcpNames || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閰嶇疆 MCP 鏁�">{{ displayData.configuredMcpCount ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="宸ュ叿璋冪敤">{{ displayData.toolCallCount ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎴愬姛/澶辫触">
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.mountedMcp')">{{ displayData.mountedMcpNames || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.configuredMcpCount')">{{ displayData.configuredMcpCount ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.toolCallCount')">{{ displayData.toolCallCount ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.toolSuccessFailure')">
{{ displayData.toolSuccessCount ?? '--' }} / {{ displayData.toolFailureCount ?? '--' }}
</ElDescriptionsItem>
- <ElDescriptionsItem label="鎬昏�楁椂">{{ displayData.elapsedText }}</ElDescriptionsItem>
- <ElDescriptionsItem label="棣栧寘鑰楁椂">{{ displayData.firstTokenLatencyText }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.elapsed')">{{ displayData.elapsedText }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.firstTokenLatency')">{{ displayData.firstTokenLatencyText }}</ElDescriptionsItem>
<ElDescriptionsItem label="Prompt Tokens">{{ displayData.promptTokens ?? '--' }}</ElDescriptionsItem>
<ElDescriptionsItem label="Completion Tokens">{{ displayData.completionTokens ?? '--' }}</ElDescriptionsItem>
<ElDescriptionsItem label="Total Tokens">{{ displayData.totalTokens ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ displayData.createTimeText }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ displayData.updateTimeText }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閿欒鍒嗙被">{{ displayData.errorCategory || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="閿欒闃舵">{{ displayData.errorStage || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.createTime')">{{ displayData.createTimeText }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.updateTime')">{{ displayData.updateTimeText }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.errorCategory')">{{ displayData.errorCategory || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.errorStage')">{{ displayData.errorStage || '--' }}</ElDescriptionsItem>
</ElDescriptions>
<ElAlert v-if="displayData.errorMessage" type="error" :closable="false" show-icon>
- <template #title>閿欒淇℃伅</template>
+ <template #title>{{ t('pages.system.aiObserve.detail.errorMessage') }}</template>
<div class="whitespace-pre-wrap break-all text-sm">{{ displayData.errorMessage }}</div>
</ElAlert>
<div class="space-y-3">
<div class="flex items-center justify-between">
- <h4 class="text-base font-semibold text-[var(--art-gray-900)]">MCP 璋冪敤鏃ュ織</h4>
- <span class="text-sm text-[var(--art-gray-500)]">{{ displayData.mcpLogs.length }} 鏉�</span>
+ <h4 class="text-base font-semibold text-[var(--art-gray-900)]">{{ t('pages.system.aiObserve.detail.mcpLogs') }}</h4>
+ <span class="text-sm text-[var(--art-gray-500)]">{{ t('common.count', { count: displayData.mcpLogs.length }) }}</span>
</div>
- <ElEmpty v-if="!displayData.mcpLogs.length" description="鏆傛棤 MCP 璋冪敤鏃ュ織" :image-size="100" />
+ <ElEmpty v-if="!displayData.mcpLogs.length" :description="t('pages.system.aiObserve.detail.emptyMcpLogs')" :image-size="100" />
<div v-else class="space-y-3">
<div
@@ -66,13 +66,13 @@
<div class="mt-4 grid gap-3 md:grid-cols-2">
<div class="rounded-xl bg-[var(--art-main-bg-color)] p-3">
- <div class="text-xs text-[var(--art-gray-500)]">杈撳叆鎽樿</div>
+ <div class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiObserve.detail.inputSummary') }}</div>
<div class="mt-2 whitespace-pre-wrap break-all text-sm text-[var(--art-gray-900)]">
{{ item.inputSummary || '--' }}
</div>
</div>
<div class="rounded-xl bg-[var(--art-main-bg-color)] p-3">
- <div class="text-xs text-[var(--art-gray-500)]">杈撳嚭鎽樿</div>
+ <div class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiObserve.detail.outputSummary') }}</div>
<div class="mt-2 whitespace-pre-wrap break-all text-sm text-[var(--art-gray-900)]">
{{ item.outputSummary || item.errorMessage || '--' }}
</div>
@@ -87,6 +87,7 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import { buildAiObserveDetail } from '../aiObservePage.helpers'
const props = defineProps({
@@ -96,8 +97,9 @@
})
const emit = defineEmits(['update:visible'])
+ const { t } = useI18n()
- const displayData = computed(() => buildAiObserveDetail(props.detailData))
+ const displayData = computed(() => buildAiObserveDetail(props.detailData, {}, t))
const displayPrompt = computed(() => {
const name = displayData.value.promptName || '--'
const code = displayData.value.promptCode || '--'
diff --git a/rsf-design/src/views/system/ai-param/aiParamPage.helpers.js b/rsf-design/src/views/system/ai-param/aiParamPage.helpers.js
index f04e148..87622b6 100644
--- a/rsf-design/src/views/system/ai-param/aiParamPage.helpers.js
+++ b/rsf-design/src/views/system/ai-param/aiParamPage.helpers.js
@@ -1,16 +1,18 @@
-const AI_PARAM_REPORT_TITLE = 'AI 鍙傛暟鎶ヨ〃'
+import { $t } from '@/locales'
+
+const AI_PARAM_REPORT_TITLE = () => $t('pages.system.aiParam.reportTitle')
const PROVIDER_OPTIONS = [{ label: 'OPENAI_COMPATIBLE', value: 'OPENAI_COMPATIBLE' }]
const STATUS_OPTIONS = [
- { label: '榛樿', value: 1 },
- { label: '鍊欓��', value: 0 }
+ { label: () => $t('pages.system.aiParam.status.default'), value: 1 },
+ { label: () => $t('pages.system.aiParam.status.candidate'), value: 0 }
]
const VALIDATE_STATUS_META = {
- VALID: { text: '宸叉牎楠�', type: 'success' },
- INVALID: { text: '鏍¢獙澶辫触', type: 'danger' },
- NOT_TESTED: { text: '鏈牎楠�', type: 'info' }
+ VALID: { text: () => $t('pages.system.aiParam.validation.valid'), type: 'success' },
+ INVALID: { text: () => $t('pages.system.aiParam.validation.invalid'), type: 'danger' },
+ NOT_TESTED: { text: () => $t('pages.system.aiParam.validation.notTested'), type: 'info' }
}
function createAiParamSearchState() {
@@ -58,17 +60,21 @@
}
function getAiParamStatusOptions() {
- return STATUS_OPTIONS
+ return STATUS_OPTIONS.map((item) => ({ ...item, label: item.label() }))
}
function getAiParamStatusMeta(status) {
return Number(status) === 1
- ? { text: '榛樿', type: 'success' }
- : { text: '鍊欓��', type: 'info' }
+ ? { text: $t('pages.system.aiParam.status.default'), type: 'success' }
+ : { text: $t('pages.system.aiParam.status.candidate'), type: 'info' }
}
function getAiParamValidateStatusMeta(status) {
- return VALIDATE_STATUS_META[String(status || '').trim()] || { text: status || '鏈煡', type: 'info' }
+ const meta = VALIDATE_STATUS_META[String(status || '').trim()]
+ if (meta) {
+ return { text: meta.text(), type: meta.type }
+ }
+ return { text: status || $t('common.status.unknown'), type: 'info' }
}
function buildAiParamSearchParams(params = {}) {
@@ -150,7 +156,9 @@
validateStatusText: validateMeta.text,
validateStatusType: validateMeta.type,
streamingEnabled: Boolean(record.streamingEnabled),
- streamingText: record.streamingEnabled ? '娴佸紡鍝嶅簲' : '鏍囧噯鍝嶅簲',
+ streamingText: record.streamingEnabled
+ ? $t('pages.system.aiParam.streaming.enabled')
+ : $t('pages.system.aiParam.streaming.disabled'),
'createTime$': normalizeText(record['createTime$']),
'updateTime$': normalizeText(record['updateTime$']),
'lastValidateTime$': normalizeText(record['lastValidateTime$'])
@@ -175,14 +183,14 @@
function getAiParamReportColumns() {
return [
- { label: '鍚嶇О', prop: 'name' },
- { label: '鎻愪緵鏂�', prop: 'providerType' },
- { label: '妯″瀷', prop: 'model' },
- { label: '榛樿鐘舵��', prop: 'statusText' },
- { label: '鏍¢獙鐘舵��', prop: 'validateStatusText' },
- { label: '瓒呮椂鏃堕棿(ms)', prop: 'timeoutMs' },
- { label: '鏇存柊鏃堕棿', prop: 'updateTime' },
- { label: '澶囨敞', prop: 'memo' }
+ { label: $t('pages.system.aiParam.table.name'), prop: 'name' },
+ { label: $t('pages.system.aiParam.table.providerType'), prop: 'providerType' },
+ { label: $t('pages.system.aiParam.table.model'), prop: 'model' },
+ { label: $t('pages.system.aiParam.table.status'), prop: 'statusText' },
+ { label: $t('pages.system.aiParam.table.validateStatus'), prop: 'validateStatusText' },
+ { label: $t('pages.system.aiParam.table.timeoutMs'), prop: 'timeoutMs' },
+ { label: $t('table.updateTime'), prop: 'updateTime' },
+ { label: $t('table.remark'), prop: 'memo' }
]
}
diff --git a/rsf-design/src/views/system/ai-param/index.vue b/rsf-design/src/views/system/ai-param/index.vue
index 972e5ba..245d427 100644
--- a/rsf-design/src/views/system/ai-param/index.vue
+++ b/rsf-design/src/views/system/ai-param/index.vue
@@ -13,14 +13,14 @@
<ElCard class="art-table-card ai-param-list-card">
<div class="mb-5 flex flex-wrap items-center justify-between gap-4">
<div>
- <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">AI 鍙傛暟</h3>
- <p class="mt-1 text-sm text-[var(--art-gray-500)]">鎸夊崱鐗囩鐞嗗綋鍓嶇鎴风殑妯″瀷鎺ュ叆鍙傛暟涓庨粯璁ら厤缃��</p>
+ <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">{{ t('pages.system.aiParam.title') }}</h3>
+ <p class="mt-1 text-sm text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.subtitle') }}</p>
</div>
<ElSpace wrap>
- <ElButton v-auth="'add'" @click="openCreateDialog" v-ripple>鏂板缓鍙傛暟</ElButton>
- <ElButton :loading="exportLoading" @click="handleExport" v-ripple>瀵煎嚭</ElButton>
- <ElButton :loading="loading" @click="refreshData" v-ripple>鍒锋柊</ElButton>
+ <ElButton v-auth="'add'" @click="openCreateDialog" v-ripple>{{ t('pages.system.aiParam.buttons.add') }}</ElButton>
+ <ElButton :loading="exportLoading" @click="handleExport" v-ripple>{{ t('common.actions.export') }}</ElButton>
+ <ElButton :loading="loading" @click="refreshData" v-ripple>{{ t('common.actions.refresh') }}</ElButton>
</ElSpace>
</div>
@@ -59,14 +59,14 @@
<div
class="min-w-0 rounded-2xl bg-slate-50 px-3 py-2.5"
>
- <p class="text-xs text-[var(--art-gray-500)]">鍩虹鍦板潃</p>
+ <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.fields.baseUrl') }}</p>
<p class="mt-1.5 break-all text-sm leading-6 text-[var(--art-gray-900)]">{{ item.baseUrl || '--' }}</p>
</div>
<div
class="min-w-0 rounded-2xl bg-slate-50 px-3 py-2.5"
>
- <p class="text-xs text-[var(--art-gray-500)]">鏈�杩戞牎楠�</p>
- <p class="mt-1.5 text-sm text-[var(--art-gray-900)]">{{ item['lastValidateTime$'] || '鏈牎楠�' }}</p>
+ <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.fields.lastValidateTime') }}</p>
+ <p class="mt-1.5 text-sm text-[var(--art-gray-900)]">{{ item['lastValidateTime$'] || t('pages.system.aiParam.validation.notTested') }}</p>
</div>
</div>
@@ -84,25 +84,25 @@
<p class="mt-1 text-sm font-medium text-[var(--art-gray-900)]">{{ item.maxTokens ?? '--' }}</p>
</div>
<div class="min-w-0 rounded-2xl bg-slate-50 px-3 py-2">
- <p class="text-xs text-[var(--art-gray-500)]">瓒呮椂鏃堕棿</p>
+ <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.fields.timeoutMs') }}</p>
<p class="mt-1 text-sm font-medium text-[var(--art-gray-900)]">{{ item.timeoutMs ?? '--' }} ms</p>
</div>
</div>
<div class="mt-4 rounded-2xl bg-amber-50/70 px-3 py-2.5">
- <p class="text-xs text-[var(--art-gray-500)]">澶囨敞</p>
+ <p class="text-xs text-[var(--art-gray-500)]">{{ t('table.remark') }}</p>
<p class="mt-1.5 line-clamp-2 text-sm leading-6 text-[var(--art-gray-900)]">{{ item.memo || '--' }}</p>
</div>
<div class="mt-4 flex flex-wrap items-center justify-between gap-3 border-t border-[var(--art-border-color)] pt-3">
<div class="flex items-center gap-2 text-xs text-[var(--art-gray-500)]">
- <span>鏇存柊鏃堕棿</span>
+ <span>{{ t('table.updateTime') }}</span>
<span>{{ item['updateTime$'] || '--' }}</span>
</div>
<ElSpace wrap>
- <ElButton text @click="openDetailDialog(item)">璇︽儏</ElButton>
- <ElButton v-auth="'edit'" text @click="openEditDialog(item)">缂栬緫</ElButton>
+ <ElButton text @click="openDetailDialog(item)">{{ t('common.actions.detail') }}</ElButton>
+ <ElButton v-auth="'edit'" text @click="openEditDialog(item)">{{ t('common.actions.edit') }}</ElButton>
<ElButton
v-auth="'edit'"
text
@@ -110,15 +110,15 @@
:loading="defaultUpdatingId === item.id"
@click="handleSetDefault(item)"
>
- 璁句负榛樿
+ {{ t('pages.system.aiParam.actions.setDefault') }}
</ElButton>
- <ElButton v-auth="'delete'" text type="danger" @click="handleDelete(item)">鍒犻櫎</ElButton>
+ <ElButton v-auth="'delete'" text type="danger" @click="handleDelete(item)">{{ t('common.actions.delete') }}</ElButton>
</ElSpace>
</div>
</article>
</div>
- <ElEmpty v-else description="鏆傛棤 AI 鍙傛暟鏁版嵁" :image-size="110" />
+ <ElEmpty v-else :description="t('pages.system.aiParam.empty')" :image-size="110" />
</div>
<div class="mt-6 flex justify-end">
@@ -146,6 +146,7 @@
<script setup>
import { ElMessage, ElMessageBox } from 'element-plus'
+ import { useI18n } from 'vue-i18n'
import { useUserStore } from '@/store/modules/user'
import { useTable } from '@/hooks/core/useTable'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
@@ -172,6 +173,7 @@
defineOptions({ name: 'AiParam' })
+ const { t } = useI18n()
const userStore = useUserStore()
const searchForm = ref(createAiParamSearchState())
const dialogVisible = ref(false)
@@ -183,41 +185,41 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('pages.system.aiParam.search.condition'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ弬鏁板悕绉�'
+ placeholder: t('pages.system.aiParam.search.conditionPlaceholder')
}
},
{
- label: '鎻愪緵鏂�',
+ label: t('pages.system.aiParam.search.providerType'),
key: 'providerType',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユ彁渚涙柟绫诲瀷'
+ placeholder: t('pages.system.aiParam.search.providerTypePlaceholder')
}
},
{
- label: '妯″瀷',
+ label: t('pages.system.aiParam.search.model'),
key: 'model',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユā鍨嬪悕绉�'
+ placeholder: t('pages.system.aiParam.search.modelPlaceholder')
}
},
{
- label: '榛樿鐘舵��',
+ label: t('pages.system.aiParam.search.status'),
key: 'status',
type: 'select',
props: {
clearable: true,
options: [
- { label: '榛樿', value: 1 },
- { label: '鍊欓��', value: 0 }
+ { label: t('pages.system.aiParam.status.default'), value: 1 },
+ { label: t('pages.system.aiParam.status.candidate'), value: 0 }
]
}
}
@@ -282,14 +284,14 @@
try {
if (dialogMode.value === 'edit') {
await fetchUpdateAiParam(buildAiParamSavePayload(payload))
- ElMessage.success('淇敼鎴愬姛')
+ ElMessage.success(t('crud.messages.updateSuccess'))
dialogVisible.value = false
summaryRefreshSeed.value += 1
await refreshUpdate()
return
}
await fetchSaveAiParam(buildAiParamSavePayload(payload))
- ElMessage.success('鏂板鎴愬姛')
+ ElMessage.success(t('crud.messages.createSuccess'))
dialogVisible.value = false
summaryRefreshSeed.value += 1
await refreshCreate()
@@ -303,7 +305,7 @@
defaultUpdatingId.value = record.id
try {
await fetchSetAiParamDefault(record.id)
- ElMessage.success('榛樿鍙傛暟宸插垏鎹�')
+ ElMessage.success(t('pages.system.aiParam.messages.setDefaultSuccess'))
summaryRefreshSeed.value += 1
await refreshUpdate()
} catch {
@@ -315,17 +317,23 @@
async function handleDelete(record) {
try {
- await ElMessageBox.confirm(`纭畾瑕佸垹闄� AI 鍙傛暟銆�${record?.name || record?.id}銆嶅悧锛焋, '鍒犻櫎纭', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
+ await ElMessageBox.confirm(
+ t('crud.confirm.deleteMessage', {
+ entity: t('pages.system.aiParam.entity'),
+ label: record?.name || record?.id
+ }),
+ t('crud.confirm.deleteTitle'),
+ {
+ confirmButtonText: t('common.confirm'),
+ cancelButtonText: t('common.cancel'),
type: 'warning'
})
await fetchDeleteAiParam(record.id)
- ElMessage.success('鍒犻櫎鎴愬姛')
+ ElMessage.success(t('crud.messages.deleteSuccess'))
await refreshRemove()
} catch (error) {
if (error !== 'cancel') {
- ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+ ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
}
}
}
@@ -341,12 +349,12 @@
}),
null,
{
- timeoutMessage: '瀵煎嚭璇锋眰瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('message.exportTimeoutStopped')
}
)
if (!response) return
if (!response.ok) {
- throw new Error(`瀵煎嚭澶辫触 (${response.status})`)
+ throw new Error(t('crud.messages.exportFailedWithStatus', { status: response.status }))
}
const blob = await response.blob()
const url = window.URL.createObjectURL(blob)
@@ -357,9 +365,9 @@
link.click()
link.remove()
window.URL.revokeObjectURL(url)
- ElMessage.success('瀵煎嚭鎴愬姛')
+ ElMessage.success(t('crud.messages.exportSuccess'))
} catch (error) {
- ElMessage.error(error?.message || '瀵煎嚭澶辫触')
+ ElMessage.error(error?.message || t('crud.messages.exportFailed'))
} finally {
exportLoading.value = false
}
diff --git a/rsf-design/src/views/system/ai-param/modules/ai-param-dialog.vue b/rsf-design/src/views/system/ai-param/modules/ai-param-dialog.vue
index e48a405..67d71ef 100644
--- a/rsf-design/src/views/system/ai-param/modules/ai-param-dialog.vue
+++ b/rsf-design/src/views/system/ai-param/modules/ai-param-dialog.vue
@@ -19,14 +19,21 @@
:show-submit="false"
/>
- <div v-if="showRuntimeSection" class="mt-2 rounded-2xl border border-[var(--art-border-color)] px-5 py-4">
+ <div
+ v-if="showRuntimeSection"
+ class="mt-2 rounded-2xl border border-[var(--art-border-color)] px-5 py-4"
+ >
<div class="mb-3 flex items-center justify-between gap-4">
<div>
- <h4 class="text-base font-semibold text-[var(--art-gray-900)]">杩愯鏃剁姸鎬�</h4>
- <p class="mt-1 text-sm text-[var(--art-gray-500)]">淇濆瓨鍓嶅彲鍏堟墽琛岃崏绋挎牎楠岋紝杩愯鏃剁姸鎬佺敱鍚庣鐪熷疄杩斿洖銆�</p>
+ <h4 class="text-base font-semibold text-[var(--art-gray-900)]">
+ {{ t('pages.system.aiParam.dialog.runtimeTitle') }}
+ </h4>
+ <p class="mt-1 text-sm text-[var(--art-gray-500)]">
+ {{ t('pages.system.aiParam.dialog.runtimeDescription') }}
+ </p>
</div>
<ElButton v-if="!isReadonly" :loading="validateLoading" @click="handleValidateDraft">
- 鑽夌鏍¢獙
+ {{ t('pages.system.aiParam.dialog.validateDraft') }}
</ElButton>
</div>
@@ -39,14 +46,29 @@
/>
<ElDescriptions :column="2" border>
- <ElDescriptionsItem label="鏍¢獙鐘舵��">{{ form.validateStatus || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏈�杩戞牎楠岃�楁椂">
- {{ form.lastValidateElapsedMs !== null && form.lastValidateElapsedMs !== undefined ? `${form.lastValidateElapsedMs} ms` : '--' }}
+ <ElDescriptionsItem :label="t('pages.system.aiParam.dialog.labels.validateStatus')">
+ {{ form.validateStatus || '--' }}
</ElDescriptionsItem>
- <ElDescriptionsItem label="鏈�杩戞牎楠屾椂闂�">{{ form['lastValidateTime$'] || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏈�杩戞洿鏂颁汉">{{ form.updateBy || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏈�杩戞洿鏂版椂闂�" :span="2">{{ form['updateTime$'] || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏈�杩戞牎楠屼俊鎭�" :span="2">
+ <ElDescriptionsItem :label="t('pages.system.aiParam.dialog.labels.lastValidateElapsedMs')">
+ {{
+ form.lastValidateElapsedMs !== null && form.lastValidateElapsedMs !== undefined
+ ? `${form.lastValidateElapsedMs} ms`
+ : '--'
+ }}
+ </ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiParam.dialog.labels.lastValidateTime')">
+ {{ form['lastValidateTime$'] || '--' }}
+ </ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiParam.dialog.labels.updateBy')">
+ {{ form.updateBy || '--' }}
+ </ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiParam.dialog.labels.updateTime')" :span="2">
+ {{ form['updateTime$'] || '--' }}
+ </ElDescriptionsItem>
+ <ElDescriptionsItem
+ :label="t('pages.system.aiParam.dialog.labels.lastValidateMessage')"
+ :span="2"
+ >
<div class="whitespace-pre-wrap break-all text-sm leading-6 text-[var(--art-gray-700)]">
{{ form.lastValidateMessage || '--' }}
</div>
@@ -56,14 +78,19 @@
<template #footer>
<span class="dialog-footer">
- <ElButton @click="handleCancel">{{ isReadonly ? '鍏抽棴' : '鍙栨秷' }}</ElButton>
- <ElButton v-if="!isReadonly" type="primary" @click="handleSubmit">纭畾</ElButton>
+ <ElButton @click="handleCancel">
+ {{ isReadonly ? t('common.actions.close') : t('common.cancel') }}
+ </ElButton>
+ <ElButton v-if="!isReadonly" type="primary" @click="handleSubmit">
+ {{ t('common.confirm') }}
+ </ElButton>
</span>
</template>
</ElDialog>
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import ArtForm from '@/components/core/forms/art-form/index.vue'
import { fetchValidateAiParamDraft } from '@/api/ai-config'
import {
@@ -81,6 +108,7 @@
})
const emit = defineEmits(['submit', 'update:visible'])
+ const { t } = useI18n()
const formRef = ref()
const form = reactive(createAiParamFormState())
const validateLoading = ref(false)
@@ -89,9 +117,9 @@
const isReadonly = computed(() => props.mode === 'show')
const showRuntimeSection = computed(() => Boolean(form.id) || props.mode !== 'create')
const dialogTitle = computed(() => {
- if (props.mode === 'edit') return '缂栬緫 AI 鍙傛暟'
- if (props.mode === 'show') return 'AI 鍙傛暟璇︽儏'
- return '鏂板缓 AI 鍙傛暟'
+ if (props.mode === 'edit') return t('pages.system.aiParam.dialog.titleEdit')
+ if (props.mode === 'show') return t('pages.system.aiParam.dialog.titleDetail')
+ return t('pages.system.aiParam.dialog.titleCreate')
})
const validateAlertType = computed(() =>
@@ -112,69 +140,75 @@
})
const rules = computed(() => ({
- name: [{ required: true, message: '璇疯緭鍏ュ弬鏁板悕绉�', trigger: 'blur' }],
- providerType: [{ required: true, message: '璇烽�夋嫨鎻愪緵鏂圭被鍨�', trigger: 'change' }],
- baseUrl: [{ required: true, message: '璇疯緭鍏ュ熀纭�鍦板潃', trigger: 'blur' }],
- apiKey: [{ required: true, message: '璇疯緭鍏� API Key', trigger: 'blur' }],
- model: [{ required: true, message: '璇疯緭鍏ユā鍨嬪悕绉�', trigger: 'blur' }]
+ name: [{ required: true, message: t('pages.system.aiParam.dialog.validation.name'), trigger: 'blur' }],
+ providerType: [
+ {
+ required: true,
+ message: t('pages.system.aiParam.dialog.validation.providerType'),
+ trigger: 'change'
+ }
+ ],
+ baseUrl: [{ required: true, message: t('pages.system.aiParam.dialog.validation.baseUrl'), trigger: 'blur' }],
+ apiKey: [{ required: true, message: t('pages.system.aiParam.dialog.validation.apiKey'), trigger: 'blur' }],
+ model: [{ required: true, message: t('pages.system.aiParam.dialog.validation.model'), trigger: 'blur' }]
}))
const formItems = computed(() => [
{
- label: '鍙傛暟鍚嶇О',
+ label: t('pages.system.aiParam.dialog.labels.name'),
key: 'name',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ弬鏁板悕绉�',
+ placeholder: t('pages.system.aiParam.dialog.placeholders.name'),
disabled: isReadonly.value
}
},
{
- label: '鎻愪緵鏂圭被鍨�',
+ label: t('pages.system.aiParam.dialog.labels.providerType'),
key: 'providerType',
type: 'select',
props: {
options: getAiParamProviderOptions(),
disabled: isReadonly.value,
- placeholder: '璇烽�夋嫨鎻愪緵鏂圭被鍨�'
+ placeholder: t('pages.system.aiParam.dialog.placeholders.providerType')
}
},
{
- label: '鍩虹鍦板潃',
+ label: t('pages.system.aiParam.dialog.labels.baseUrl'),
key: 'baseUrl',
type: 'input',
span: 24,
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ吋瀹� OpenAI 鐨勫熀纭�鍦板潃',
+ placeholder: t('pages.system.aiParam.dialog.placeholders.baseUrl'),
disabled: isReadonly.value
}
},
{
- label: 'API Key',
+ label: t('pages.system.aiParam.dialog.labels.apiKey'),
key: 'apiKey',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏� API Key',
+ placeholder: t('pages.system.aiParam.dialog.placeholders.apiKey'),
disabled: isReadonly.value,
type: isReadonly.value ? 'text' : 'password',
showPassword: !isReadonly.value
}
},
{
- label: '妯″瀷鍚嶇О',
+ label: t('pages.system.aiParam.dialog.labels.model'),
key: 'model',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユā鍨嬪悕绉�',
+ placeholder: t('pages.system.aiParam.dialog.placeholders.model'),
disabled: isReadonly.value
}
},
{
- label: 'Temperature',
+ label: t('pages.system.aiParam.dialog.labels.temperature'),
key: 'temperature',
type: 'number',
props: {
@@ -182,12 +216,12 @@
max: 2,
step: 0.1,
precision: 2,
- placeholder: '璇疯緭鍏� temperature',
+ placeholder: t('pages.system.aiParam.dialog.placeholders.temperature'),
disabled: isReadonly.value
}
},
{
- label: 'Top P',
+ label: t('pages.system.aiParam.dialog.labels.topP'),
key: 'topP',
type: 'number',
props: {
@@ -195,54 +229,54 @@
max: 1,
step: 0.1,
precision: 2,
- placeholder: '璇疯緭鍏� topP',
+ placeholder: t('pages.system.aiParam.dialog.placeholders.topP'),
disabled: isReadonly.value
}
},
{
- label: '鏈�澶� Token',
+ label: t('pages.system.aiParam.dialog.labels.maxTokens'),
key: 'maxTokens',
type: 'number',
props: {
min: 1,
step: 1,
- placeholder: '璇疯緭鍏ユ渶澶� token',
+ placeholder: t('pages.system.aiParam.dialog.placeholders.maxTokens'),
disabled: isReadonly.value
}
},
{
- label: '瓒呮椂鏃堕棿(ms)',
+ label: t('pages.system.aiParam.dialog.labels.timeoutMs'),
key: 'timeoutMs',
type: 'number',
props: {
min: 1000,
step: 1000,
- placeholder: '璇疯緭鍏ヨ秴鏃舵椂闂�',
+ placeholder: t('pages.system.aiParam.dialog.placeholders.timeoutMs'),
disabled: isReadonly.value
}
},
{
- label: '娴佸紡鍝嶅簲',
+ label: t('pages.system.aiParam.dialog.labels.streamingEnabled'),
key: 'streamingEnabled',
type: 'switch',
props: {
disabled: isReadonly.value,
- activeText: '寮�鍚�',
- inactiveText: '鍏抽棴'
+ activeText: t('common.status.enabled'),
+ inactiveText: t('common.status.disabled')
}
},
{
- label: '榛樿鐘舵��',
+ label: t('pages.system.aiParam.dialog.labels.status'),
key: 'status',
type: 'select',
props: {
disabled: isReadonly.value,
options: getAiParamStatusOptions(),
- placeholder: '璇烽�夋嫨榛樿鐘舵��'
+ placeholder: t('pages.system.aiParam.dialog.placeholders.status')
}
},
{
- label: '澶囨敞',
+ label: t('pages.system.aiParam.dialog.labels.memo'),
key: 'memo',
type: 'input',
span: 24,
@@ -250,7 +284,7 @@
disabled: isReadonly.value,
type: 'textarea',
rows: 3,
- placeholder: '璇疯緭鍏ュ娉�'
+ placeholder: t('pages.system.aiParam.dialog.placeholders.memo')
}
}
])
diff --git a/rsf-design/src/views/system/ai-param/modules/ai-param-runtime-summary.vue b/rsf-design/src/views/system/ai-param/modules/ai-param-runtime-summary.vue
index cf200ff..66e616f 100644
--- a/rsf-design/src/views/system/ai-param/modules/ai-param-runtime-summary.vue
+++ b/rsf-design/src/views/system/ai-param/modules/ai-param-runtime-summary.vue
@@ -2,10 +2,10 @@
<ElCard class="art-table-card ai-param-runtime-summary-card !mb-5" shadow="never">
<div class="mb-3 flex items-start justify-between gap-4">
<div>
- <h3 class="text-base font-semibold text-[var(--art-gray-900)]">杩愯鏃舵憳瑕�</h3>
- <p class="mt-0.5 text-xs text-[var(--art-gray-500)]">褰撳墠鐢熸晥鐨勬ā鍨嬨�丳rompt 涓� MCP 鎸傝浇姒傚喌</p>
+ <h3 class="text-base font-semibold text-[var(--art-gray-900)]">{{ t('pages.system.aiParam.summary.title') }}</h3>
+ <p class="mt-0.5 text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.summary.subtitle') }}</p>
</div>
- <ElButton text :loading="loading" @click="loadSummary">鍒锋柊鎽樿</ElButton>
+ <ElButton text :loading="loading" @click="loadSummary">{{ t('pages.system.aiParam.summary.refresh') }}</ElButton>
</div>
<ElAlert
@@ -23,7 +23,7 @@
<ArtSvgIcon icon="ri:robot-2-line" class="text-base" />
</div>
<div class="min-w-0 flex-1">
- <p class="text-[11px] text-[var(--art-gray-500)]">褰撳墠妯″瀷</p>
+ <p class="text-[11px] text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.summary.activeModel') }}</p>
<h4 class="truncate text-sm font-semibold text-[var(--art-gray-900)]">
{{ summary.activeModel || '--' }}
</h4>
@@ -35,7 +35,7 @@
{{ validateMeta.text }}
</ElTag>
</div>
- <p class="mt-1 text-[11px] text-[var(--art-gray-500)]">{{ summary.activeParamValidatedAt || '鏈牎楠�' }}</p>
+ <p class="mt-1 text-[11px] text-[var(--art-gray-500)]">{{ summary.activeParamValidatedAt || t('pages.system.aiParam.validation.notTested') }}</p>
</div>
<div class="rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] px-3 py-3">
@@ -44,7 +44,7 @@
<ArtSvgIcon icon="ri:lightbulb-flash-line" class="text-base" />
</div>
<div class="min-w-0 flex-1">
- <p class="text-[11px] text-[var(--art-gray-500)]">褰撳墠 Prompt</p>
+ <p class="text-[11px] text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.summary.activePrompt') }}</p>
<h4 class="truncate text-sm font-semibold text-[var(--art-gray-900)]">
{{ summary.promptName || '--' }}
</h4>
@@ -54,7 +54,7 @@
{{ [summary.promptCode, summary.promptScene].filter(Boolean).join(' / ') || '--' }}
</p>
<p class="mt-1 text-[11px] text-[var(--art-gray-500)]">
- 鏈�杩戞洿鏂版椂闂� {{ summary.activePromptUpdatedAt || '--' }}
+ {{ t('pages.system.aiParam.summary.lastPromptUpdate', { value: summary.activePromptUpdatedAt || '--' }) }}
</p>
</div>
@@ -64,9 +64,9 @@
<ArtSvgIcon icon="ri:plug-2-line" class="text-base" />
</div>
<div class="min-w-0 flex-1">
- <p class="text-[11px] text-[var(--art-gray-500)]">宸插惎鐢� MCP</p>
+ <p class="text-[11px] text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.summary.enabledMcp') }}</p>
<h4 class="text-sm font-semibold text-[var(--art-gray-900)]">
- {{ summary.enabledMcpCount ?? 0 }} 涓�
+ {{ t('pages.system.aiParam.summary.enabledMcpCount', { count: summary.enabledMcpCount ?? 0 }) }}
</h4>
</div>
</div>
@@ -79,7 +79,7 @@
>
{{ name }}
</ElTag>
- <span v-if="!enabledMcpNames.length" class="text-xs text-[var(--art-gray-500)]">鏆傛棤鎸傝浇</span>
+ <span v-if="!enabledMcpNames.length" class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.summary.noMcp') }}</span>
</div>
</div>
</div>
@@ -88,6 +88,7 @@
<script setup>
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
+ import { useI18n } from 'vue-i18n'
import { fetchGetAiConfigSummary } from '@/api/ai-config'
import { getAiParamValidateStatusMeta } from '../aiParamPage.helpers'
@@ -98,6 +99,7 @@
const loading = ref(false)
const summary = ref({})
const errorMessage = ref('')
+ const { t } = useI18n()
const validateMeta = computed(() =>
getAiParamValidateStatusMeta(summary.value?.activeParamValidateStatus)
@@ -114,12 +116,12 @@
fetchGetAiConfigSummary(props.promptCode),
null,
{
- timeoutMessage: '杩愯鏃舵憳瑕佸姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�'
+ timeoutMessage: t('pages.system.aiParam.messages.summaryTimeout')
}
)
loading.value = false
if (!data) {
- errorMessage.value = '杩愯鏃舵憳瑕佹殏鏃朵笉鍙敤'
+ errorMessage.value = t('pages.system.aiParam.messages.summaryUnavailable')
summary.value = {}
return
}
diff --git a/rsf-design/src/views/system/ai-prompt/aiPromptPage.helpers.js b/rsf-design/src/views/system/ai-prompt/aiPromptPage.helpers.js
index 5f22a4c..888f588 100644
--- a/rsf-design/src/views/system/ai-prompt/aiPromptPage.helpers.js
+++ b/rsf-design/src/views/system/ai-prompt/aiPromptPage.helpers.js
@@ -1,8 +1,10 @@
-const AI_PROMPT_REPORT_TITLE = 'Prompt 绠$悊鎶ヨ〃'
+import { $t } from '@/locales'
+
+const AI_PROMPT_REPORT_TITLE = () => $t('pages.system.aiPrompt.reportTitle')
const STATUS_OPTIONS = [
- { label: '鍚敤', value: 1 },
- { label: '鍋滅敤', value: 0 }
+ { label: () => $t('common.status.enabled'), value: 1 },
+ { label: () => $t('common.status.disabled'), value: 0 }
]
function createAiPromptSearchState() {
@@ -37,13 +39,13 @@
}
function getAiPromptStatusOptions() {
- return STATUS_OPTIONS
+ return STATUS_OPTIONS.map((item) => ({ ...item, label: item.label() }))
}
function getAiPromptStatusMeta(status) {
return Number(status) === 1
- ? { text: '鍚敤', type: 'success' }
- : { text: '鍋滅敤', type: 'info' }
+ ? { text: $t('common.status.enabled'), type: 'success' }
+ : { text: $t('common.status.disabled'), type: 'info' }
}
function buildAiPromptSearchParams(params = {}) {
@@ -138,13 +140,13 @@
function getAiPromptReportColumns() {
return [
- { label: '鍚嶇О', prop: 'name' },
- { label: '缂栫爜', prop: 'code' },
- { label: '鍦烘櫙', prop: 'scene' },
- { label: '鐘舵��', prop: 'statusText' },
- { label: '绯荤粺鎻愮ず璇�', prop: 'systemPrompt' },
- { label: '鐢ㄦ埛鎻愮ず璇嶆ā鏉�', prop: 'userPromptTemplate' },
- { label: '鏇存柊鏃堕棿', prop: 'updateTime' }
+ { label: $t('pages.system.aiPrompt.table.name'), prop: 'name' },
+ { label: $t('pages.system.aiPrompt.table.code'), prop: 'code' },
+ { label: $t('pages.system.aiPrompt.table.scene'), prop: 'scene' },
+ { label: $t('pages.system.aiPrompt.table.status'), prop: 'statusText' },
+ { label: $t('pages.system.aiPrompt.table.systemPrompt'), prop: 'systemPrompt' },
+ { label: $t('pages.system.aiPrompt.table.userPromptTemplate'), prop: 'userPromptTemplate' },
+ { label: $t('table.updateTime'), prop: 'updateTime' }
]
}
diff --git a/rsf-design/src/views/system/ai-prompt/index.vue b/rsf-design/src/views/system/ai-prompt/index.vue
index aa0ab7e..747d64a 100644
--- a/rsf-design/src/views/system/ai-prompt/index.vue
+++ b/rsf-design/src/views/system/ai-prompt/index.vue
@@ -11,14 +11,14 @@
<ElCard class="art-table-card">
<div class="mb-5 flex flex-wrap items-center justify-between gap-4">
<div>
- <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">Prompt 绠$悊</h3>
- <p class="mt-1 text-sm text-[var(--art-gray-500)]">鎸夊崱鐗囩淮鎶� Prompt 妯℃澘銆佸満鏅紪鐮佸拰杩愯鏃堕瑙堛��</p>
+ <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">{{ t('pages.system.aiPrompt.title') }}</h3>
+ <p class="mt-1 text-sm text-[var(--art-gray-500)]">{{ t('pages.system.aiPrompt.subtitle') }}</p>
</div>
<ElSpace wrap>
- <ElButton v-auth="'add'" @click="openCreateDialog" v-ripple>鏂板缓 Prompt</ElButton>
- <ElButton :loading="exportLoading" @click="handleExport" v-ripple>瀵煎嚭</ElButton>
- <ElButton :loading="loading" @click="refreshData" v-ripple>鍒锋柊</ElButton>
+ <ElButton v-auth="'add'" @click="openCreateDialog" v-ripple>{{ t('pages.system.aiPrompt.buttons.add') }}</ElButton>
+ <ElButton :loading="exportLoading" @click="handleExport" v-ripple>{{ t('common.actions.export') }}</ElButton>
+ <ElButton :loading="loading" @click="refreshData" v-ripple>{{ t('common.actions.refresh') }}</ElButton>
</ElSpace>
</div>
@@ -46,18 +46,18 @@
</div>
<div class="mt-4 flex flex-wrap gap-2">
- <ElTag size="small" effect="plain">鍦烘櫙 {{ item.scene || '--' }}</ElTag>
+ <ElTag size="small" effect="plain">{{ t('pages.system.aiPrompt.fields.sceneTag', { value: item.scene || '--' }) }}</ElTag>
</div>
<div class="mt-5 rounded-2xl bg-[var(--art-main-bg-color)]/70 p-4 ring-1 ring-inset ring-[var(--art-border-color)]">
- <p class="text-xs text-[var(--art-gray-500)]">绯荤粺鎻愮ず璇�</p>
+ <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiPrompt.fields.systemPrompt') }}</p>
<p class="mt-2 line-clamp-4 whitespace-pre-wrap text-sm leading-6 text-[var(--art-gray-900)]">
{{ item.systemPrompt || '--' }}
</p>
</div>
<div class="mt-4 rounded-2xl bg-amber-50/80 px-4 py-3">
- <p class="text-xs text-[var(--art-gray-500)]">鐢ㄦ埛鎻愮ず璇嶆ā鏉�</p>
+ <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiPrompt.fields.userPromptTemplate') }}</p>
<p class="mt-2 line-clamp-4 whitespace-pre-wrap text-sm leading-6 text-[var(--art-gray-900)]">
{{ item.userPromptTemplate || '--' }}
</p>
@@ -65,20 +65,20 @@
<div class="mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-[var(--art-border-color)] pt-4">
<div class="flex items-center gap-2 text-xs text-[var(--art-gray-500)]">
- <span>鏇存柊鏃堕棿</span>
+ <span>{{ t('table.updateTime') }}</span>
<span>{{ item['updateTime$'] || '--' }}</span>
</div>
<ElSpace wrap>
- <ElButton text @click="openDetailDialog(item)">璇︽儏</ElButton>
- <ElButton v-auth="'edit'" text @click="openEditDialog(item)">缂栬緫</ElButton>
- <ElButton v-auth="'delete'" text type="danger" @click="handleDelete(item)">鍒犻櫎</ElButton>
+ <ElButton text @click="openDetailDialog(item)">{{ t('common.actions.detail') }}</ElButton>
+ <ElButton v-auth="'edit'" text @click="openEditDialog(item)">{{ t('common.actions.edit') }}</ElButton>
+ <ElButton v-auth="'delete'" text type="danger" @click="handleDelete(item)">{{ t('common.actions.delete') }}</ElButton>
</ElSpace>
</div>
</article>
</div>
- <ElEmpty v-else description="鏆傛棤 Prompt 鏁版嵁" :image-size="110" />
+ <ElEmpty v-else :description="t('pages.system.aiPrompt.empty')" :image-size="110" />
</div>
<div class="mt-6 flex justify-end">
@@ -106,6 +106,7 @@
<script setup>
import { ElMessage, ElMessageBox } from 'element-plus'
+ import { useI18n } from 'vue-i18n'
import { useUserStore } from '@/store/modules/user'
import { useTable } from '@/hooks/core/useTable'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
@@ -130,6 +131,7 @@
defineOptions({ name: 'AiPrompt' })
+ const { t } = useI18n()
const userStore = useUserStore()
const searchForm = ref(createAiPromptSearchState())
const dialogVisible = ref(false)
@@ -139,41 +141,41 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('pages.system.aiPrompt.search.condition'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏� Prompt 鍚嶇О'
+ placeholder: t('pages.system.aiPrompt.search.conditionPlaceholder')
}
},
{
- label: '缂栫爜',
+ label: t('pages.system.aiPrompt.search.code'),
key: 'code',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏� Prompt 缂栫爜'
+ placeholder: t('pages.system.aiPrompt.search.codePlaceholder')
}
},
{
- label: '鍦烘櫙',
+ label: t('pages.system.aiPrompt.search.scene'),
key: 'scene',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ満鏅爣璇�'
+ placeholder: t('pages.system.aiPrompt.search.scenePlaceholder')
}
},
{
- label: '鐘舵��',
+ label: t('pages.system.aiPrompt.search.status'),
key: 'status',
type: 'select',
props: {
clearable: true,
options: [
- { label: '鍚敤', value: 1 },
- { label: '鍋滅敤', value: 0 }
+ { label: t('common.status.enabled'), value: 1 },
+ { label: t('common.status.disabled'), value: 0 }
]
}
}
@@ -238,13 +240,13 @@
try {
if (dialogMode.value === 'edit') {
await fetchUpdateAiPrompt(buildAiPromptSavePayload(payload))
- ElMessage.success('淇敼鎴愬姛')
+ ElMessage.success(t('crud.messages.updateSuccess'))
dialogVisible.value = false
await refreshUpdate()
return
}
await fetchSaveAiPrompt(buildAiPromptSavePayload(payload))
- ElMessage.success('鏂板鎴愬姛')
+ ElMessage.success(t('crud.messages.createSuccess'))
dialogVisible.value = false
await refreshCreate()
} catch {
@@ -254,17 +256,23 @@
async function handleDelete(record) {
try {
- await ElMessageBox.confirm(`纭畾瑕佸垹闄� Prompt銆�${record?.name || record?.id}銆嶅悧锛焋, '鍒犻櫎纭', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
+ await ElMessageBox.confirm(
+ t('crud.confirm.deleteMessage', {
+ entity: t('pages.system.aiPrompt.entity'),
+ label: record?.name || record?.id
+ }),
+ t('crud.confirm.deleteTitle'),
+ {
+ confirmButtonText: t('common.confirm'),
+ cancelButtonText: t('common.cancel'),
type: 'warning'
})
await fetchDeleteAiPrompt(record.id)
- ElMessage.success('鍒犻櫎鎴愬姛')
+ ElMessage.success(t('crud.messages.deleteSuccess'))
await refreshRemove()
} catch (error) {
if (error !== 'cancel') {
- ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+ ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
}
}
}
@@ -280,12 +288,12 @@
}),
null,
{
- timeoutMessage: '瀵煎嚭璇锋眰瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('message.exportTimeoutStopped')
}
)
if (!response) return
if (!response.ok) {
- throw new Error(`瀵煎嚭澶辫触 (${response.status})`)
+ throw new Error(t('crud.messages.exportFailedWithStatus', { status: response.status }))
}
const blob = await response.blob()
const url = window.URL.createObjectURL(blob)
@@ -296,9 +304,9 @@
link.click()
link.remove()
window.URL.revokeObjectURL(url)
- ElMessage.success('瀵煎嚭鎴愬姛')
+ ElMessage.success(t('crud.messages.exportSuccess'))
} catch (error) {
- ElMessage.error(error?.message || '瀵煎嚭澶辫触')
+ ElMessage.error(error?.message || t('crud.messages.exportFailed'))
} finally {
exportLoading.value = false
}
diff --git a/rsf-design/src/views/system/ai-prompt/modules/ai-prompt-dialog.vue b/rsf-design/src/views/system/ai-prompt/modules/ai-prompt-dialog.vue
index 67211b6..bb45774 100644
--- a/rsf-design/src/views/system/ai-prompt/modules/ai-prompt-dialog.vue
+++ b/rsf-design/src/views/system/ai-prompt/modules/ai-prompt-dialog.vue
@@ -22,10 +22,16 @@
<div class="mt-2 rounded-2xl border border-[var(--art-border-color)] px-5 py-4">
<div class="mb-3 flex items-center justify-between gap-4">
<div>
- <h4 class="text-base font-semibold text-[var(--art-gray-900)]">娓叉煋棰勮</h4>
- <p class="mt-1 text-sm text-[var(--art-gray-500)]">杈撳叆绀轰緥鍐呭鍜� metadata锛岀洿鎺ラ瑙堟渶缁堟覆鏌撶粨鏋溿��</p>
+ <h4 class="text-base font-semibold text-[var(--art-gray-900)]">
+ {{ t('pages.system.aiPrompt.dialog.previewTitle') }}
+ </h4>
+ <p class="mt-1 text-sm text-[var(--art-gray-500)]">
+ {{ t('pages.system.aiPrompt.dialog.previewDescription') }}
+ </p>
</div>
- <ElButton v-if="!isReadonly" :loading="previewLoading" @click="handlePreview">娓叉煋棰勮</ElButton>
+ <ElButton v-if="!isReadonly" :loading="previewLoading" @click="handlePreview">
+ {{ t('pages.system.aiPrompt.dialog.previewAction') }}
+ </ElButton>
</div>
<div class="grid gap-4 lg:grid-cols-2">
@@ -35,14 +41,14 @@
type="textarea"
:rows="4"
:disabled="isReadonly"
- placeholder="璇疯緭鍏ョず渚嬭緭鍏ュ唴瀹�"
+ :placeholder="t('pages.system.aiPrompt.dialog.placeholders.previewInput')"
/>
<ElInput
v-model="metadataText"
type="textarea"
:rows="4"
:disabled="isReadonly"
- placeholder='璇疯緭鍏� JSON metadata锛屼緥濡� {"path":"/system/aiPrompt"}'
+ :placeholder="t('pages.system.aiPrompt.dialog.placeholders.metadata')"
/>
</div>
@@ -57,44 +63,59 @@
v-else-if="previewResult"
type="success"
:closable="false"
- :title="`宸茶В鏋愬彉閲忥細${resolvedVariablesText}`"
+ :title="
+ t('pages.system.aiPrompt.dialog.previewResolvedVariables', {
+ value: resolvedVariablesText
+ })
+ "
/>
<ElInput
:model-value="previewResult?.renderedSystemPrompt || ''"
type="textarea"
:rows="5"
readonly
- placeholder="绯荤粺鎻愮ず璇嶆覆鏌撶粨鏋�"
+ :placeholder="t('pages.system.aiPrompt.dialog.placeholders.renderedSystemPrompt')"
/>
<ElInput
:model-value="previewResult?.renderedUserPrompt || ''"
type="textarea"
:rows="5"
readonly
- placeholder="鐢ㄦ埛鎻愮ず璇嶆覆鏌撶粨鏋�"
+ :placeholder="t('pages.system.aiPrompt.dialog.placeholders.renderedUserPrompt')"
/>
</div>
</div>
</div>
<div v-if="showRuntimeSection" class="mt-5 rounded-2xl border border-[var(--art-border-color)] px-5 py-4">
- <h4 class="text-base font-semibold text-[var(--art-gray-900)]">杩愯鏃剁姸鎬�</h4>
+ <h4 class="text-base font-semibold text-[var(--art-gray-900)]">
+ {{ t('pages.system.aiPrompt.dialog.runtimeTitle') }}
+ </h4>
<ElDescriptions class="mt-4" :column="2" border>
- <ElDescriptionsItem label="鏈�杩戞洿鏂颁汉">{{ form.updateBy || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏈�杩戞洿鏂版椂闂�">{{ form['updateTime$'] || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiPrompt.dialog.labels.updateBy')">
+ {{ form.updateBy || emptyText }}
+ </ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.aiPrompt.dialog.labels.updateTime')">
+ {{ form['updateTime$'] || emptyText }}
+ </ElDescriptionsItem>
</ElDescriptions>
</div>
<template #footer>
<span class="dialog-footer">
- <ElButton @click="handleCancel">{{ isReadonly ? '鍏抽棴' : '鍙栨秷' }}</ElButton>
- <ElButton v-if="!isReadonly" type="primary" @click="handleSubmit">纭畾</ElButton>
+ <ElButton @click="handleCancel">
+ {{ isReadonly ? t('common.actions.close') : t('common.cancel') }}
+ </ElButton>
+ <ElButton v-if="!isReadonly" type="primary" @click="handleSubmit">
+ {{ t('common.confirm') }}
+ </ElButton>
</span>
</template>
</ElDialog>
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import ArtForm from '@/components/core/forms/art-form/index.vue'
import { fetchRenderAiPromptPreview } from '@/api/ai-config'
import {
@@ -105,9 +126,6 @@
getAiPromptStatusOptions
} from '../aiPromptPage.helpers'
- const DEFAULT_PREVIEW_INPUT = '璇锋牴鎹綋鍓嶈緭鍏ョ粰鍑烘憳瑕�'
- const DEFAULT_METADATA_TEXT = '{"path":"/system/aiPrompt"}'
-
const props = defineProps({
visible: { type: Boolean, default: false },
mode: { type: String, default: 'create' },
@@ -115,112 +133,124 @@
})
const emit = defineEmits(['submit', 'update:visible'])
+ const { t } = useI18n()
const formRef = ref()
const form = reactive(createAiPromptFormState())
- const previewInput = ref(DEFAULT_PREVIEW_INPUT)
- const metadataText = ref(DEFAULT_METADATA_TEXT)
+ const previewInput = ref('')
+ const metadataText = ref('')
const previewLoading = ref(false)
const previewResult = ref(null)
const previewErrorMessage = ref('')
+ const emptyText = computed(() => t('common.placeholder.empty'))
+ const defaultPreviewInput = computed(() => t('pages.system.aiPrompt.dialog.defaultPreviewInput'))
+ const defaultMetadataText = computed(() => '{"path":"/system/aiPrompt"}')
const isReadonly = computed(() => props.mode === 'show')
const showRuntimeSection = computed(() => Boolean(form.id) || props.mode !== 'create')
const dialogTitle = computed(() => {
- if (props.mode === 'edit') return '缂栬緫 Prompt'
- if (props.mode === 'show') return 'Prompt 璇︽儏'
- return '鏂板缓 Prompt'
+ if (props.mode === 'edit') return t('pages.system.aiPrompt.dialog.titleEdit')
+ if (props.mode === 'show') return t('pages.system.aiPrompt.dialog.titleDetail')
+ return t('pages.system.aiPrompt.dialog.titleCreate')
})
const resolvedVariablesText = computed(() => {
if (!Array.isArray(previewResult.value?.resolvedVariables) || !previewResult.value.resolvedVariables.length) {
- return '鏃�'
+ return t('pages.system.aiPrompt.dialog.previewNoVariables')
}
- return previewResult.value.resolvedVariables.join('銆�')
+ return previewResult.value.resolvedVariables.join(t('common.listSeparator'))
})
const rules = computed(() => ({
- name: [{ required: true, message: '璇疯緭鍏� Prompt 鍚嶇О', trigger: 'blur' }],
- code: [{ required: true, message: '璇疯緭鍏� Prompt 缂栫爜', trigger: 'blur' }],
- scene: [{ required: true, message: '璇疯緭鍏ュ満鏅爣璇�', trigger: 'blur' }],
- systemPrompt: [{ required: true, message: '璇疯緭鍏ョ郴缁熸彁绀鸿瘝', trigger: 'blur' }],
- userPromptTemplate: [{ required: true, message: '璇疯緭鍏ョ敤鎴锋彁绀鸿瘝妯℃澘', trigger: 'blur' }]
+ name: [{ required: true, message: t('pages.system.aiPrompt.dialog.validation.name'), trigger: 'blur' }],
+ code: [{ required: true, message: t('pages.system.aiPrompt.dialog.validation.code'), trigger: 'blur' }],
+ scene: [{ required: true, message: t('pages.system.aiPrompt.dialog.validation.scene'), trigger: 'blur' }],
+ systemPrompt: [
+ { required: true, message: t('pages.system.aiPrompt.dialog.validation.systemPrompt'), trigger: 'blur' }
+ ],
+ userPromptTemplate: [
+ {
+ required: true,
+ message: t('pages.system.aiPrompt.dialog.validation.userPromptTemplate'),
+ trigger: 'blur'
+ }
+ ]
}))
const formItems = computed(() => [
{
- label: 'Prompt 鍚嶇О',
+ label: t('pages.system.aiPrompt.dialog.labels.name'),
key: 'name',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏� Prompt 鍚嶇О',
+ placeholder: t('pages.system.aiPrompt.dialog.placeholders.name'),
disabled: isReadonly.value
}
},
{
- label: 'Prompt 缂栫爜',
+ label: t('pages.system.aiPrompt.dialog.labels.code'),
key: 'code',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏� Prompt 缂栫爜',
+ placeholder: t('pages.system.aiPrompt.dialog.placeholders.code'),
disabled: isReadonly.value
}
},
{
- label: '鍦烘櫙鏍囪瘑',
+ label: t('pages.system.aiPrompt.dialog.labels.scene'),
key: 'scene',
type: 'input',
span: 24,
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ満鏅爣璇�',
+ placeholder: t('pages.system.aiPrompt.dialog.placeholders.scene'),
disabled: isReadonly.value
}
},
{
- label: '绯荤粺鎻愮ず璇�',
+ label: t('pages.system.aiPrompt.dialog.labels.systemPrompt'),
key: 'systemPrompt',
type: 'input',
span: 24,
props: {
type: 'textarea',
rows: 6,
- placeholder: '璇疯緭鍏ョ郴缁熸彁绀鸿瘝',
+ placeholder: t('pages.system.aiPrompt.dialog.placeholders.systemPrompt'),
disabled: isReadonly.value
}
},
{
- label: '鐢ㄦ埛鎻愮ず璇嶆ā鏉�',
+ label: t('pages.system.aiPrompt.dialog.labels.userPromptTemplate'),
key: 'userPromptTemplate',
type: 'input',
span: 24,
props: {
type: 'textarea',
rows: 5,
- placeholder: '璇疯緭鍏ョ敤鎴锋彁绀鸿瘝妯℃澘',
+ placeholder: t('pages.system.aiPrompt.dialog.placeholders.userPromptTemplate'),
disabled: isReadonly.value
}
},
{
- label: '鐘舵��',
+ label: t('pages.system.aiPrompt.dialog.labels.status'),
key: 'status',
type: 'select',
props: {
options: getAiPromptStatusOptions(),
- placeholder: '璇烽�夋嫨鐘舵��',
+ placeholder: t('pages.system.aiPrompt.dialog.placeholders.status'),
disabled: isReadonly.value
}
},
{
- label: '澶囨敞',
+ label: t('pages.system.aiPrompt.dialog.labels.memo'),
key: 'memo',
type: 'input',
span: 24,
props: {
type: 'textarea',
rows: 3,
- placeholder: '璇疯緭鍏ュ娉�',
+ placeholder: t('pages.system.aiPrompt.dialog.placeholders.memo'),
disabled: isReadonly.value
}
}
@@ -228,8 +258,8 @@
function resetForm() {
Object.assign(form, createAiPromptFormState())
- previewInput.value = DEFAULT_PREVIEW_INPUT
- metadataText.value = DEFAULT_METADATA_TEXT
+ previewInput.value = defaultPreviewInput.value
+ metadataText.value = defaultMetadataText.value
previewResult.value = null
previewErrorMessage.value = ''
formRef.value?.clearValidate?.()
@@ -237,6 +267,8 @@
function loadFormData() {
Object.assign(form, buildAiPromptDialogModel(props.aiPromptData))
+ previewInput.value = defaultPreviewInput.value
+ metadataText.value = defaultMetadataText.value
previewResult.value = null
previewErrorMessage.value = ''
}
@@ -256,7 +288,7 @@
)
} catch (error) {
previewResult.value = null
- previewErrorMessage.value = error?.message || '娓叉煋棰勮澶辫触'
+ previewErrorMessage.value = error?.message || t('pages.system.aiPrompt.messages.previewFailed')
} finally {
previewLoading.value = false
}
diff --git a/rsf-design/src/views/system/config/configPage.helpers.js b/rsf-design/src/views/system/config/configPage.helpers.js
index 4564433..02c3ff6 100644
--- a/rsf-design/src/views/system/config/configPage.helpers.js
+++ b/rsf-design/src/views/system/config/configPage.helpers.js
@@ -1,9 +1,9 @@
const CONFIG_TYPE_OPTIONS = [
- { label: 'boolean', value: 1 },
- { label: 'number', value: 2 },
- { label: 'string', value: 3 },
- { label: 'json', value: 4 },
- { label: 'date', value: 5 }
+ { labelKey: 'pages.system.config.types.boolean', fallback: 'boolean', value: 1 },
+ { labelKey: 'pages.system.config.types.number', fallback: 'number', value: 2 },
+ { labelKey: 'pages.system.config.types.string', fallback: 'string', value: 3 },
+ { labelKey: 'pages.system.config.types.json', fallback: 'json', value: 4 },
+ { labelKey: 'pages.system.config.types.date', fallback: 'date', value: 5 }
]
export function createConfigSearchState() {
@@ -36,19 +36,28 @@
}
}
-export function getConfigTypeOptions() {
- return CONFIG_TYPE_OPTIONS
+export function getConfigTypeOptions(t) {
+ return CONFIG_TYPE_OPTIONS.map((item) => ({
+ label: typeof t === 'function' ? t(item.labelKey) : item.fallback,
+ value: item.value
+ }))
}
export function getConfigTypeMeta(type) {
const normalizedType = Number(type)
- return CONFIG_TYPE_OPTIONS.find((item) => item.value === normalizedType) || { label: '-', value: normalizedType || '' }
+ return (
+ CONFIG_TYPE_OPTIONS.find((item) => item.value === normalizedType) || {
+ labelKey: 'common.placeholder.empty',
+ fallback: '--',
+ value: normalizedType || ''
+ }
+ )
}
export function getConfigStatusMeta(status) {
return Number(status) === 1
- ? { text: '姝e父', type: 'success', bool: true }
- : { text: '鍐荤粨', type: 'danger', bool: false }
+ ? { textKey: 'common.status.normal', fallback: 'Normal', type: 'success', bool: true }
+ : { textKey: 'common.status.frozen', fallback: 'Frozen', type: 'danger', bool: false }
}
export function buildConfigSearchParams(params = {}) {
@@ -100,6 +109,7 @@
}
export function normalizeConfigListRow(record = {}) {
+ const typeMeta = getConfigTypeMeta(record.type)
const statusMeta = getConfigStatusMeta(record.status)
return {
...record,
@@ -109,8 +119,10 @@
val: record.val || '',
content: record.content || '',
memo: record.memo || '',
- typeText: record['type$'] || getConfigTypeMeta(record.type).label,
- statusText: record['status$'] || statusMeta.text,
+ typeTextKey: typeMeta.labelKey,
+ typeText: typeMeta.fallback,
+ statusTextKey: statusMeta.textKey,
+ statusText: statusMeta.fallback,
statusType: statusMeta.type,
statusBool: record.statusBool ?? statusMeta.bool,
updateTimeText: record['updateTime$'] || record.updateTime || '',
diff --git a/rsf-design/src/views/system/config/configTable.columns.js b/rsf-design/src/views/system/config/configTable.columns.js
index f61a9e4..aef347a 100644
--- a/rsf-design/src/views/system/config/configTable.columns.js
+++ b/rsf-design/src/views/system/config/configTable.columns.js
@@ -2,54 +2,57 @@
import { ElTag } from 'element-plus'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
-export function createConfigTableColumns({ handleView, handleEdit, handleDelete }) {
+export function createConfigTableColumns({ t, handleView, handleEdit, handleDelete }) {
return [
{
prop: 'uuid',
- label: '缂栧彿',
+ label: t('table.code'),
minWidth: 140,
showOverflowTooltip: true
},
{
prop: 'name',
- label: '鍚嶇О',
+ label: t('table.name'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'flag',
- label: '鏍囪瘑',
+ label: t('pages.system.config.table.flag'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'typeText',
- label: '绫诲瀷',
+ label: t('pages.system.config.table.type'),
width: 110,
- formatter: (row) => row.typeText || '-'
+ formatter: (row) => t(row.typeTextKey || 'common.placeholder.empty')
},
{
prop: 'val',
- label: '鍊�',
+ label: t('pages.system.config.table.value'),
minWidth: 180,
showOverflowTooltip: true,
- formatter: (row) => row.val || '-'
+ formatter: (row) => row.val || t('common.placeholder.empty')
},
{
prop: 'status',
- label: '鐘舵��',
+ label: t('table.status'),
width: 100,
- formatter: (row) => h(ElTag, { type: row.statusType, effect: 'light' }, () => row.statusText || '-')
+ formatter: (row) =>
+ h(ElTag, { type: row.statusType, effect: 'light' }, () =>
+ t(row.statusTextKey || 'common.placeholder.empty')
+ )
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: t('table.updateTime'),
minWidth: 180,
- formatter: (row) => row.updateTimeText || '-'
+ formatter: (row) => row.updateTimeText || t('common.placeholder.empty')
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: t('table.operation'),
width: handleDelete ? 160 : 120,
align: 'right',
formatter: (row) => {
diff --git a/rsf-design/src/views/system/config/index.vue b/rsf-design/src/views/system/config/index.vue
index a879fe6..9d591b9 100644
--- a/rsf-design/src/views/system/config/index.vue
+++ b/rsf-design/src/views/system/config/index.vue
@@ -12,7 +12,9 @@
<ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
<template #left>
<ElSpace wrap>
- <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>鏂板閰嶇疆</ElButton>
+ <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>
+ {{ t('pages.system.config.buttons.add') }}
+ </ElButton>
<ElButton
v-auth="'delete'"
type="danger"
@@ -20,7 +22,7 @@
@click="handleBatchDelete"
v-ripple
>
- 鎵归噺鍒犻櫎
+ {{ t('common.actions.batchDelete') }}
</ElButton>
</ElSpace>
</template>
@@ -53,6 +55,7 @@
<script setup>
import { ElMessage } from 'element-plus'
+ import { useI18n } from 'vue-i18n'
import { useAuth } from '@/hooks/core/useAuth'
import { useTable } from '@/hooks/core/useTable'
import { useCrudPage } from '@/views/system/common/useCrudPage'
@@ -79,6 +82,7 @@
defineOptions({ name: 'Config' })
+ const { t } = useI18n()
const { hasAuth } = useAuth()
const searchForm = ref(createConfigSearchState())
const detailDrawerVisible = ref(false)
@@ -88,41 +92,42 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('table.keyword'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ラ厤缃悕绉�'
+ placeholder: t('pages.system.config.search.conditionPlaceholder')
}
},
{
- label: '鏍囪瘑',
+ label: t('pages.system.config.table.flag'),
key: 'flag',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ラ厤缃爣璇�'
+ placeholder: t('pages.system.config.search.flagPlaceholder')
}
},
{
- label: '绫诲瀷',
+ label: t('pages.system.config.table.type'),
key: 'type',
type: 'select',
props: {
clearable: true,
- options: getConfigTypeOptions()
+ placeholder: t('pages.system.config.placeholders.type'),
+ options: getConfigTypeOptions(t)
}
},
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: {
clearable: true,
options: [
- { label: '姝e父', value: 1 },
- { label: '鍐荤粨', value: 0 }
+ { label: t('common.status.normal'), value: 1 },
+ { label: t('common.status.frozen'), value: 0 }
]
}
}
@@ -136,7 +141,7 @@
} catch (error) {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇閰嶇疆璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.system.config.messages.detailFailed'))
} finally {
detailLoading.value = false
}
@@ -148,7 +153,7 @@
dialogVisible.value = true
dialogType.value = 'edit'
} catch (error) {
- ElMessage.error(error?.message || '鑾峰彇閰嶇疆璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.system.config.messages.detailFailed'))
}
}
@@ -174,6 +179,7 @@
paginationKey: getConfigPaginationKey(),
columnsFactory: () =>
createConfigTableColumns({
+ t,
handleView: openDetail,
handleEdit: openEditDialog,
handleDelete: hasAuth('delete') ? (row) => handleDeleteAction?.(row) : null
@@ -206,7 +212,7 @@
saveRequest: fetchSaveConfig,
updateRequest: fetchUpdateConfig,
deleteRequest: fetchDeleteConfig,
- entityName: '閰嶇疆',
+ entityName: t('pages.system.config.entity'),
resolveRecordLabel: (record) => record?.name || record?.flag || record?.id,
refreshCreate,
refreshUpdate,
diff --git a/rsf-design/src/views/system/config/modules/config-detail-drawer.vue b/rsf-design/src/views/system/config/modules/config-detail-drawer.vue
index 0e7105d..af86445 100644
--- a/rsf-design/src/views/system/config/modules/config-detail-drawer.vue
+++ b/rsf-design/src/views/system/config/modules/config-detail-drawer.vue
@@ -1,30 +1,35 @@
<template>
<ElDrawer
:model-value="visible"
- title="閰嶇疆璇︽儏"
+ :title="t('pages.system.config.dialog.titleDetail')"
size="560px"
@update:model-value="handleVisibleChange"
>
<ElSkeleton :loading="loading" animated :rows="10">
<ElDescriptions :column="1" border>
- <ElDescriptionsItem label="缂栧彿">{{ displayData.uuid || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍚嶇О">{{ displayData.name || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏍囪瘑">{{ displayData.flag || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="绫诲瀷">{{ displayData.typeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍊�">{{ displayData.val || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏂囨湰">{{ displayData.content || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">
- <ElTag :type="displayData.statusType" effect="light">{{ displayData.statusText || '--' }}</ElTag>
+ <ElDescriptionsItem :label="t('table.code')">{{ displayData.uuid || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.name')">{{ displayData.name || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.config.table.flag')">{{ displayData.flag || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.config.table.type')">
+ {{ t(displayData.typeTextKey || 'common.placeholder.empty') }}
</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ displayData.updateTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ displayData.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞">{{ displayData.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.config.table.value')">{{ displayData.val || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.config.table.content')">{{ displayData.content || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.status')">
+ <ElTag :type="displayData.statusType" effect="light">
+ {{ t(displayData.statusTextKey || 'common.placeholder.empty') }}
+ </ElTag>
+ </ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{ displayData.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{ displayData.createTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.memo')">{{ displayData.memo || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
</ElSkeleton>
</ElDrawer>
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import { normalizeConfigListRow } from '../configPage.helpers'
const props = defineProps({
@@ -34,6 +39,7 @@
})
const emit = defineEmits(['update:visible'])
+ const { t } = useI18n()
const displayData = computed(() => normalizeConfigListRow(props.detailData))
function handleVisibleChange(visible) {
diff --git a/rsf-design/src/views/system/config/modules/config-dialog.vue b/rsf-design/src/views/system/config/modules/config-dialog.vue
index bb56df3..535f503 100644
--- a/rsf-design/src/views/system/config/modules/config-dialog.vue
+++ b/rsf-design/src/views/system/config/modules/config-dialog.vue
@@ -21,8 +21,8 @@
<template #footer>
<span class="dialog-footer">
- <ElButton @click="handleCancel">鍙栨秷</ElButton>
- <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+ <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+ <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
</span>
</template>
</ElDialog>
@@ -30,6 +30,7 @@
<script setup>
import ArtForm from '@/components/core/forms/art-form/index.vue'
+ import { useI18n } from 'vue-i18n'
import { buildConfigDialogModel, createConfigFormState, getConfigTypeOptions } from '../configPage.helpers'
const props = defineProps({
@@ -38,95 +39,98 @@
})
const emit = defineEmits(['update:visible', 'submit'])
+ const { t } = useI18n()
const formRef = ref()
const form = reactive(createConfigFormState())
const isEdit = computed(() => Boolean(form.id))
- const dialogTitle = computed(() => (isEdit.value ? '缂栬緫閰嶇疆' : '鏂板閰嶇疆'))
+ const dialogTitle = computed(() =>
+ isEdit.value ? t('pages.system.config.dialog.titleEdit') : t('pages.system.config.dialog.titleCreate')
+ )
const rules = computed(() => ({
- name: [{ required: true, message: '璇疯緭鍏ラ厤缃悕绉�', trigger: 'blur' }],
- flag: [{ required: true, message: '璇疯緭鍏ラ厤缃爣璇�', trigger: 'blur' }]
+ name: [{ required: true, message: t('pages.system.config.validation.name'), trigger: 'blur' }],
+ flag: [{ required: true, message: t('pages.system.config.validation.flag'), trigger: 'blur' }]
}))
const formItems = computed(() => [
{
- label: '缂栧彿',
+ label: t('table.code'),
key: 'uuid',
type: 'input',
props: {
disabled: true,
- placeholder: '鏂板鍚庤嚜鍔ㄧ敓鎴�'
+ placeholder: t('pages.system.config.placeholders.uuid')
}
},
{
- label: '鍚嶇О',
+ label: t('table.name'),
key: 'name',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ラ厤缃悕绉�'
+ placeholder: t('pages.system.config.placeholders.name')
}
},
{
- label: '鏍囪瘑',
+ label: t('pages.system.config.table.flag'),
key: 'flag',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ラ厤缃爣璇�'
+ placeholder: t('pages.system.config.placeholders.flag')
}
},
{
- label: '绫诲瀷',
+ label: t('pages.system.config.table.type'),
key: 'type',
type: 'select',
props: {
- options: getConfigTypeOptions(),
- placeholder: '璇烽�夋嫨绫诲瀷'
+ options: getConfigTypeOptions(t),
+ placeholder: t('pages.system.config.placeholders.type')
}
},
{
- label: '鍊�',
+ label: t('pages.system.config.table.value'),
key: 'val',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ラ厤缃��'
+ placeholder: t('pages.system.config.placeholders.value')
}
},
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: {
options: [
- { label: '姝e父', value: 1 },
- { label: '鍐荤粨', value: 0 }
+ { label: t('common.status.normal'), value: 1 },
+ { label: t('common.status.frozen'), value: 0 }
],
- placeholder: '璇烽�夋嫨鐘舵��'
+ placeholder: t('pages.system.config.placeholders.status')
}
},
{
- label: '鏂囨湰',
+ label: t('pages.system.config.table.content'),
key: 'content',
type: 'input',
span: 24,
props: {
type: 'textarea',
rows: 3,
- placeholder: '璇疯緭鍏ラ厤缃枃鏈�'
+ placeholder: t('pages.system.config.placeholders.content')
}
},
{
- label: '澶囨敞',
+ label: t('table.memo'),
key: 'memo',
type: 'input',
span: 24,
props: {
type: 'textarea',
rows: 3,
- placeholder: '璇疯緭鍏ュ娉�'
+ placeholder: t('pages.system.config.placeholders.memo')
}
}
])
diff --git a/rsf-design/src/views/system/dept/deptPage.helpers.js b/rsf-design/src/views/system/dept/deptPage.helpers.js
index 47fad23..de51afe 100644
--- a/rsf-design/src/views/system/dept/deptPage.helpers.js
+++ b/rsf-design/src/views/system/dept/deptPage.helpers.js
@@ -35,7 +35,8 @@
sort: normalizeDeptNumber(item?.sort, 0),
status: normalizeDeptNumber(item?.status, 1),
statusBool: normalizeDeptNumber(item?.status, 1) === 1,
- statusText: normalizeDeptNumber(item?.status, 1) === 1 ? '姝e父' : '绂佺敤',
+ statusTextKey: normalizeDeptNumber(item?.status, 1) === 1 ? 'common.status.normal' : 'common.status.disabled',
+ statusText: normalizeDeptNumber(item?.status, 1) === 1 ? 'Normal' : 'Disabled',
statusType: normalizeDeptNumber(item?.status, 1) === 1 ? 'success' : 'danger',
updateTimeText: item?.updateTime$ || item?.updateTime || '-',
createTimeText: item?.createTime$ || item?.createTime || '-',
diff --git a/rsf-design/src/views/system/dept/deptTable.columns.js b/rsf-design/src/views/system/dept/deptTable.columns.js
index 001815e..266df24 100644
--- a/rsf-design/src/views/system/dept/deptTable.columns.js
+++ b/rsf-design/src/views/system/dept/deptTable.columns.js
@@ -2,55 +2,57 @@
import { ElTag } from 'element-plus'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
-export function createDeptTableColumns({ handleEdit, handleDelete }) {
+export function createDeptTableColumns({ t, handleEdit, handleDelete }) {
return [
{
prop: 'name',
- label: '閮ㄩ棬鍚嶇О',
+ label: t('pages.system.dept.table.name'),
minWidth: 220,
showOverflowTooltip: true
},
{
prop: 'fullName',
- label: '閮ㄩ棬鍏ㄧО',
+ label: t('pages.system.dept.table.fullName'),
minWidth: 220,
showOverflowTooltip: true,
- formatter: (row) => row.fullName || '-'
+ formatter: (row) => row.fullName || t('common.placeholder.empty')
},
{
prop: 'leader',
- label: '璐熻矗浜�',
+ label: t('pages.system.dept.table.leader'),
minWidth: 140,
- formatter: (row) => row.leader || '-'
+ formatter: (row) => row.leader || t('common.placeholder.empty')
},
{
prop: 'sort',
- label: '鎺掑簭',
+ label: t('table.sort'),
width: 90
},
{
prop: 'status',
- label: '鐘舵��',
+ label: t('table.status'),
width: 100,
formatter: (row) =>
- h(ElTag, { type: row.statusType, effect: 'light' }, () => row.statusText || '-')
+ h(ElTag, { type: row.statusType, effect: 'light' }, () =>
+ t(row.statusTextKey || 'common.placeholder.empty')
+ )
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: t('table.updateTime'),
minWidth: 180,
- formatter: (row) => row.updateTimeText || '-'
+ formatter: (row) => row.updateTimeText || t('common.placeholder.empty')
},
{
prop: 'memo',
- label: '澶囨敞',
+ label: t('table.memo'),
minWidth: 180,
showOverflowTooltip: true,
- formatter: (row) => row.memo || '-'
+ formatter: (row) => row.memo || t('common.placeholder.empty')
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: t('table.operation'),
width: 140,
align: 'right',
formatter: (row) =>
diff --git a/rsf-design/src/views/system/dept/index.vue b/rsf-design/src/views/system/dept/index.vue
index 2dbb5b6..d77b852 100644
--- a/rsf-design/src/views/system/dept/index.vue
+++ b/rsf-design/src/views/system/dept/index.vue
@@ -17,9 +17,9 @@
>
<template #left>
<ElSpace wrap>
- <ElButton v-auth="'add'" @click="handleAdd" v-ripple>鏂板閮ㄩ棬</ElButton>
+ <ElButton v-auth="'add'" @click="handleAdd" v-ripple>{{ t('pages.system.dept.buttons.add') }}</ElButton>
<ElButton @click="toggleExpand" v-ripple>
- {{ isExpanded ? '鏀惰捣' : '灞曞紑' }}
+ {{ isExpanded ? t('common.actions.collapse') : t('common.actions.expand') }}
</ElButton>
</ElSpace>
</template>
@@ -48,6 +48,7 @@
<script setup>
import { ElMessage, ElMessageBox } from 'element-plus'
+ import { useI18n } from 'vue-i18n'
import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
import { useTableColumns } from '@/hooks/core/useTableColumns'
import {
@@ -70,6 +71,7 @@
defineOptions({ name: 'Dept' })
+ const { t } = useI18n()
const loading = ref(false)
const isExpanded = ref(false)
const tableRef = ref()
@@ -83,18 +85,19 @@
const searchItems = computed(() => [
{
- label: '閮ㄩ棬鍚嶇О',
+ label: t('pages.system.dept.table.name'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ラ儴闂ㄥ悕绉�'
+ placeholder: t('pages.system.dept.search.conditionPlaceholder')
}
}
])
const { columnChecks, columns } = useTableColumns(() =>
createDeptTableColumns({
+ t,
handleEdit: handleEdit,
handleDelete: handleDelete
})
@@ -111,7 +114,7 @@
fetchGetDeptTree(buildDeptSearchParams(searchForm)),
[],
{
- timeoutMessage: '閮ㄩ棬鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+ timeoutMessage: t('pages.system.dept.messages.pageTimeout')
}
)
const normalizedRows = normalizeDeptTreeRows(tree || [])
@@ -148,23 +151,30 @@
deptTreeOptions.value = buildDeptTreeOptions(tableData.value, row.id)
dialogVisible.value = true
} catch (error) {
- ElMessage.error(error?.message || '鑾峰彇閮ㄩ棬璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.system.dept.messages.detailFailed'))
}
}
async function handleDelete(row) {
try {
- await ElMessageBox.confirm(`纭畾瑕佸垹闄ら儴闂ㄣ��${row.name || row.id}銆嶅悧锛焋, '鍒犻櫎纭', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- })
+ await ElMessageBox.confirm(
+ t('crud.confirm.deleteMessage', {
+ entity: t('pages.system.dept.entity'),
+ label: row.name || row.id
+ }),
+ t('crud.confirm.deleteTitle'),
+ {
+ confirmButtonText: t('common.confirm'),
+ cancelButtonText: t('common.cancel'),
+ type: 'warning'
+ }
+ )
await fetchDeleteDept(row.id)
- ElMessage.success('鍒犻櫎鎴愬姛')
+ ElMessage.success(t('crud.messages.deleteSuccess'))
await loadDeptTree()
} catch (error) {
if (error !== 'cancel') {
- ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+ ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
}
}
}
@@ -172,23 +182,23 @@
async function handleDialogSubmit(formData) {
const payload = buildDeptSavePayload(formData)
if (payload.id && payload.id === payload.parentId) {
- ElMessage.error('涓婄骇閮ㄩ棬涓嶈兘閫夋嫨褰撳墠閮ㄩ棬')
+ ElMessage.error(t('pages.system.dept.messages.parentSelfInvalid'))
return
}
try {
if (payload.id) {
await fetchUpdateDept(payload)
- ElMessage.success('淇敼鎴愬姛')
+ ElMessage.success(t('crud.messages.updateSuccess'))
} else {
await fetchSaveDept(payload)
- ElMessage.success('鏂板鎴愬姛')
+ ElMessage.success(t('crud.messages.createSuccess'))
}
dialogVisible.value = false
currentDeptData.value = buildDeptDialogModel()
await loadDeptTree()
} catch (error) {
- ElMessage.error(error?.message || '鎻愪氦澶辫触')
+ ElMessage.error(error?.message || t('crud.messages.submitFailed'))
}
}
diff --git a/rsf-design/src/views/system/dept/modules/dept-dialog.vue b/rsf-design/src/views/system/dept/modules/dept-dialog.vue
index 650083b..3504d51 100644
--- a/rsf-design/src/views/system/dept/modules/dept-dialog.vue
+++ b/rsf-design/src/views/system/dept/modules/dept-dialog.vue
@@ -21,8 +21,8 @@
<template #footer>
<span class="dialog-footer">
- <ElButton @click="handleCancel">鍙栨秷</ElButton>
- <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+ <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+ <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
</span>
</template>
</ElDialog>
@@ -30,6 +30,7 @@
<script setup>
import ArtForm from '@/components/core/forms/art-form/index.vue'
+ import { useI18n } from 'vue-i18n'
import { buildDeptDialogModel, createDeptFormState } from '../deptPage.helpers'
const props = defineProps({
@@ -39,19 +40,22 @@
})
const emit = defineEmits(['update:visible', 'submit'])
+ const { t } = useI18n()
const formRef = ref()
const form = reactive(createDeptFormState())
const isEdit = computed(() => Boolean(form.id))
- const dialogTitle = computed(() => (isEdit.value ? '缂栬緫閮ㄩ棬' : '鏂板閮ㄩ棬'))
+ const dialogTitle = computed(() =>
+ isEdit.value ? t('pages.system.dept.dialog.titleEdit') : t('pages.system.dept.dialog.titleCreate')
+ )
const rules = computed(() => ({
- name: [{ required: true, message: '璇疯緭鍏ラ儴闂ㄥ悕绉�', trigger: 'blur' }]
+ name: [{ required: true, message: t('pages.system.dept.validation.name'), trigger: 'blur' }]
}))
const formItems = computed(() => [
{
- label: '涓婄骇閮ㄩ棬',
+ label: t('pages.system.dept.table.parent'),
key: 'parentId',
type: 'treeselect',
span: 24,
@@ -62,41 +66,41 @@
value: 'value',
children: 'children'
},
- placeholder: '璇烽�夋嫨涓婄骇閮ㄩ棬',
+ placeholder: t('pages.system.dept.placeholders.parentId'),
clearable: false,
checkStrictly: true,
defaultExpandAll: true
}
},
{
- label: '閮ㄩ棬鍚嶇О',
+ label: t('pages.system.dept.table.name'),
key: 'name',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ラ儴闂ㄥ悕绉�',
+ placeholder: t('pages.system.dept.placeholders.name'),
clearable: true
}
},
{
- label: '閮ㄩ棬鍏ㄧО',
+ label: t('pages.system.dept.table.fullName'),
key: 'fullName',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ラ儴闂ㄥ叏绉�',
+ placeholder: t('pages.system.dept.placeholders.fullName'),
clearable: true
}
},
{
- label: '璐熻矗浜�',
+ label: t('pages.system.dept.table.leader'),
key: 'leader',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ヨ礋璐d汉',
+ placeholder: t('pages.system.dept.placeholders.leader'),
clearable: true
}
},
{
- label: '鎺掑簭',
+ label: t('table.sort'),
key: 'sort',
type: 'number',
props: {
@@ -106,26 +110,26 @@
}
},
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: {
- placeholder: '璇烽�夋嫨鐘舵��',
+ placeholder: t('pages.system.dept.placeholders.status'),
options: [
- { label: '姝e父', value: 1 },
- { label: '绂佺敤', value: 0 }
+ { label: t('common.status.normal'), value: 1 },
+ { label: t('common.status.disabled'), value: 0 }
]
}
},
{
- label: '澶囨敞',
+ label: t('table.memo'),
key: 'memo',
type: 'input',
span: 24,
props: {
type: 'textarea',
rows: 3,
- placeholder: '璇疯緭鍏ュ娉�',
+ placeholder: t('pages.system.dept.placeholders.memo'),
clearable: true
}
}
diff --git a/rsf-design/src/views/system/dict-type/dictTypePage.helpers.js b/rsf-design/src/views/system/dict-type/dictTypePage.helpers.js
index a141bdc..752260e 100644
--- a/rsf-design/src/views/system/dict-type/dictTypePage.helpers.js
+++ b/rsf-design/src/views/system/dict-type/dictTypePage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
export function createDictTypeSearchState() {
return {
condition: '',
@@ -25,10 +27,10 @@
}
}
-export function getDictTypeStatusMeta(status) {
+export function getDictTypeStatusMeta(status, t = $t) {
return Number(status) === 1
- ? { text: '姝e父', type: 'success', bool: true }
- : { text: '鍐荤粨', type: 'danger', bool: false }
+ ? { text: t('common.status.normal'), type: 'success', bool: true }
+ : { text: t('common.status.frozen'), type: 'danger', bool: false }
}
export function buildDictTypeSearchParams(params = {}) {
@@ -73,8 +75,8 @@
}
}
-export function normalizeDictTypeListRow(record = {}) {
- const statusMeta = getDictTypeStatusMeta(record.status)
+export function normalizeDictTypeListRow(record = {}, t = $t) {
+ const statusMeta = getDictTypeStatusMeta(record.status, t)
return {
...record,
code: record.code || '',
diff --git a/rsf-design/src/views/system/dict-type/dictTypeTable.columns.js b/rsf-design/src/views/system/dict-type/dictTypeTable.columns.js
index 5426adc..a0c5190 100644
--- a/rsf-design/src/views/system/dict-type/dictTypeTable.columns.js
+++ b/rsf-design/src/views/system/dict-type/dictTypeTable.columns.js
@@ -1,51 +1,53 @@
import { h } from 'vue'
import { ElTag } from 'element-plus'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
-export function createDictTypeTableColumns({ handleView, handleEdit, handleDelete }) {
+export function createDictTypeTableColumns({ handleView, handleEdit, handleDelete, t = $t }) {
return [
{
prop: 'code',
- label: '缂栫爜',
+ label: t('table.code'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'name',
- label: '鍚嶇О',
+ label: t('table.name'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'description',
- label: '鎻忚堪',
+ label: t('pages.system.dictType.table.description'),
minWidth: 220,
showOverflowTooltip: true,
- formatter: (row) => row.description || '-'
+ formatter: (row) => row.description || t('common.placeholder.empty')
},
{
prop: 'status',
- label: '鐘舵��',
+ label: t('table.status'),
width: 100,
- formatter: (row) => h(ElTag, { type: row.statusType, effect: 'light' }, () => row.statusText || '-')
+ formatter: (row) =>
+ h(ElTag, { type: row.statusType, effect: 'light' }, () => row.statusText || t('common.placeholder.empty'))
},
{
prop: 'updateByLabel',
- label: '鏇存柊浜�',
+ label: t('table.updateBy'),
width: 120,
- formatter: (row) => row.updateByLabel || '-'
+ formatter: (row) => row.updateByLabel || t('common.placeholder.empty')
},
{
prop: 'updateTimeText',
- label: '鏇存柊鏃堕棿',
+ label: t('table.updateTime'),
minWidth: 180,
- formatter: (row) => row.updateTimeText || '-'
+ formatter: (row) => row.updateTimeText || t('common.placeholder.empty')
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: t('table.operation'),
width: handleDelete ? 160 : 120,
- align: 'right',
+ align: 'center',
formatter: (row) => {
const buttons = [
h(ArtButtonTable, {
@@ -67,7 +69,7 @@
)
}
- return h('div', { class: 'flex justify-end' }, buttons)
+ return h('div', { class: 'flex justify-center' }, buttons)
}
}
]
diff --git a/rsf-design/src/views/system/dict-type/index.vue b/rsf-design/src/views/system/dict-type/index.vue
index b346aad..cdba2f6 100644
--- a/rsf-design/src/views/system/dict-type/index.vue
+++ b/rsf-design/src/views/system/dict-type/index.vue
@@ -12,7 +12,7 @@
<ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
<template #left>
<ElSpace wrap>
- <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>鏂板鏁版嵁瀛楀吀</ElButton>
+ <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>{{ t('pages.system.dictType.buttons.add') }}</ElButton>
<ElButton
v-auth="'delete'"
type="danger"
@@ -20,7 +20,7 @@
@click="handleBatchDelete"
v-ripple
>
- 鎵归噺鍒犻櫎
+ {{ t('common.actions.batchDelete') }}
</ElButton>
</ElSpace>
</template>
@@ -52,6 +52,7 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus'
import { useAuth } from '@/hooks/core/useAuth'
import { useTable } from '@/hooks/core/useTable'
@@ -78,6 +79,7 @@
defineOptions({ name: 'DictType' })
+ const { t } = useI18n()
const { hasAuth } = useAuth()
const searchForm = ref(createDictTypeSearchState())
const detailDrawerVisible = ref(false)
@@ -87,41 +89,41 @@
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('table.keyword'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ョ紪鐮佹垨鍚嶇О'
+ placeholder: t('pages.system.dictType.search.conditionPlaceholder')
}
},
{
- label: '缂栫爜',
+ label: t('table.code'),
key: 'code',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ瓧鍏哥紪鐮�'
+ placeholder: t('pages.system.dictType.search.codePlaceholder')
}
},
{
- label: '鍚嶇О',
+ label: t('table.name'),
key: 'name',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ瓧鍏稿悕绉�'
+ placeholder: t('pages.system.dictType.search.namePlaceholder')
}
},
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: {
clearable: true,
options: [
- { label: '姝e父', value: 1 },
- { label: '鍐荤粨', value: 0 }
+ { label: t('common.status.normal'), value: 1 },
+ { label: t('common.status.frozen'), value: 0 }
]
}
}
@@ -131,11 +133,11 @@
detailDrawerVisible.value = true
detailLoading.value = true
try {
- detailData.value = normalizeDictTypeListRow(await fetchGetDictTypeDetail(row.id))
+ detailData.value = normalizeDictTypeListRow(await fetchGetDictTypeDetail(row.id), t)
} catch (error) {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇鏁版嵁瀛楀吀璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.system.dictType.messages.detailFailed'))
} finally {
detailLoading.value = false
}
@@ -147,7 +149,7 @@
dialogVisible.value = true
dialogType.value = 'edit'
} catch (error) {
- ElMessage.error(error?.message || '鑾峰彇鏁版嵁瀛楀吀璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.system.dictType.messages.detailFailed'))
}
}
@@ -175,7 +177,8 @@
createDictTypeTableColumns({
handleView: openDetail,
handleEdit: openEditDialog,
- handleDelete: hasAuth('delete') ? (row) => handleDeleteAction?.(row) : null
+ handleDelete: hasAuth('delete') ? (row) => handleDeleteAction?.(row) : null,
+ t
})
},
transform: {
@@ -183,7 +186,7 @@
if (!Array.isArray(records)) {
return []
}
- return records.map((item) => normalizeDictTypeListRow(item))
+ return records.map((item) => normalizeDictTypeListRow(item, t))
}
}
})
@@ -205,7 +208,7 @@
saveRequest: fetchSaveDictType,
updateRequest: fetchUpdateDictType,
deleteRequest: fetchDeleteDictType,
- entityName: '鏁版嵁瀛楀吀',
+ entityName: t('pages.system.dictType.entity'),
resolveRecordLabel: (record) => record?.name || record?.code || record?.id,
refreshCreate,
refreshUpdate,
diff --git a/rsf-design/src/views/system/dict-type/modules/dict-type-detail-drawer.vue b/rsf-design/src/views/system/dict-type/modules/dict-type-detail-drawer.vue
index 9863bb3..06f6f09 100644
--- a/rsf-design/src/views/system/dict-type/modules/dict-type-detail-drawer.vue
+++ b/rsf-design/src/views/system/dict-type/modules/dict-type-detail-drawer.vue
@@ -1,29 +1,30 @@
<template>
<ElDrawer
:model-value="visible"
- title="鏁版嵁瀛楀吀璇︽儏"
+ :title="t('pages.system.dictType.dialog.titleDetail')"
size="560px"
@update:model-value="handleVisibleChange"
>
<ElSkeleton :loading="loading" animated :rows="10">
<ElDescriptions :column="1" border>
- <ElDescriptionsItem label="缂栫爜">{{ displayData.code || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍚嶇О">{{ displayData.name || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎻忚堪">{{ displayData.description || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鐘舵��">
- <ElTag :type="displayData.statusType" effect="light">{{ displayData.statusText || '--' }}</ElTag>
+ <ElDescriptionsItem :label="t('table.code')">{{ displayData.code || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.name')">{{ displayData.name || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.dictType.table.description')">{{ displayData.description || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.status')">
+ <ElTag :type="displayData.statusType" effect="light">{{ displayData.statusText || t('common.placeholder.empty') }}</ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊浜�">{{ displayData.updateByLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ displayData.updateTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓浜�">{{ displayData.createByLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ displayData.createTimeText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞">{{ displayData.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateBy')">{{ displayData.updateByLabel || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.updateTime')">{{ displayData.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createBy')">{{ displayData.createByLabel || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.createTime')">{{ displayData.createTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.memo')">{{ displayData.memo || t('common.placeholder.empty') }}</ElDescriptionsItem>
</ElDescriptions>
</ElSkeleton>
</ElDrawer>
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import { normalizeDictTypeListRow } from '../dictTypePage.helpers'
const props = defineProps({
@@ -33,7 +34,8 @@
})
const emit = defineEmits(['update:visible'])
- const displayData = computed(() => normalizeDictTypeListRow(props.detailData))
+ const { t } = useI18n()
+ const displayData = computed(() => normalizeDictTypeListRow(props.detailData, t))
function handleVisibleChange(visible) {
emit('update:visible', visible)
diff --git a/rsf-design/src/views/system/dict-type/modules/dict-type-dialog.vue b/rsf-design/src/views/system/dict-type/modules/dict-type-dialog.vue
index 22abb74..178ddc0 100644
--- a/rsf-design/src/views/system/dict-type/modules/dict-type-dialog.vue
+++ b/rsf-design/src/views/system/dict-type/modules/dict-type-dialog.vue
@@ -21,14 +21,15 @@
<template #footer>
<span class="dialog-footer">
- <ElButton @click="handleCancel">鍙栨秷</ElButton>
- <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+ <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+ <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
</span>
</template>
</ElDialog>
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import ArtForm from '@/components/core/forms/art-form/index.vue'
import { buildDictTypeDialogModel, createDictTypeFormState } from '../dictTypePage.helpers'
@@ -40,66 +41,69 @@
const emit = defineEmits(['update:visible', 'submit'])
const formRef = ref()
const form = reactive(createDictTypeFormState())
+ const { t } = useI18n()
const isEdit = computed(() => Boolean(form.id))
- const dialogTitle = computed(() => (isEdit.value ? '缂栬緫鏁版嵁瀛楀吀' : '鏂板鏁版嵁瀛楀吀'))
+ const dialogTitle = computed(() =>
+ isEdit.value ? t('pages.system.dictType.dialog.titleEdit') : t('pages.system.dictType.dialog.titleCreate')
+ )
const rules = computed(() => ({
- code: [{ required: true, message: '璇疯緭鍏ュ瓧鍏哥紪鐮�', trigger: 'blur' }],
- name: [{ required: true, message: '璇疯緭鍏ュ瓧鍏稿悕绉�', trigger: 'blur' }]
+ code: [{ required: true, message: t('pages.system.dictType.validation.code'), trigger: 'blur' }],
+ name: [{ required: true, message: t('pages.system.dictType.validation.name'), trigger: 'blur' }]
}))
const formItems = computed(() => [
{
- label: '缂栫爜',
+ label: t('table.code'),
key: 'code',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ瓧鍏哥紪鐮�'
+ placeholder: t('pages.system.dictType.placeholders.code')
}
},
{
- label: '鍚嶇О',
+ label: t('table.name'),
key: 'name',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ瓧鍏稿悕绉�'
+ placeholder: t('pages.system.dictType.placeholders.name')
}
},
{
- label: '鐘舵��',
+ label: t('table.status'),
key: 'status',
type: 'select',
props: {
options: [
- { label: '姝e父', value: 1 },
- { label: '鍐荤粨', value: 0 }
+ { label: t('common.status.normal'), value: 1 },
+ { label: t('common.status.frozen'), value: 0 }
],
- placeholder: '璇烽�夋嫨鐘舵��'
+ placeholder: t('pages.system.dictType.placeholders.status')
}
},
{
- label: '鎻忚堪',
+ label: t('pages.system.dictType.table.description'),
key: 'description',
type: 'input',
span: 24,
props: {
type: 'textarea',
rows: 3,
- placeholder: '璇疯緭鍏ュ瓧鍏告弿杩�'
+ placeholder: t('pages.system.dictType.placeholders.description')
}
},
{
- label: '澶囨敞',
+ label: t('table.memo'),
key: 'memo',
type: 'input',
span: 24,
props: {
type: 'textarea',
rows: 3,
- placeholder: '璇疯緭鍏ュ娉�'
+ placeholder: t('pages.system.dictType.placeholders.memo')
}
}
])
diff --git a/rsf-design/src/views/system/menu/index.vue b/rsf-design/src/views/system/menu/index.vue
index 3a06c1b..ea98983 100644
--- a/rsf-design/src/views/system/menu/index.vue
+++ b/rsf-design/src/views/system/menu/index.vue
@@ -116,7 +116,7 @@
return
}
tableData.value = Array.isArray(list) ? list : []
- menuTreeOptions.value = buildMenuTreeOptions(tableData.value, formatMenuTitle)
+ menuTreeOptions.value = buildMenuTreeOptions(tableData.value, formatMenuTitle, t)
} catch (error) {
ElMessage.error(error?.message || t('pages.system.menu.messages.loadFailed'))
} finally {
@@ -130,6 +130,7 @@
const { columnChecks, columns } = useTableColumns(() =>
createMenuTableColumns({
+ t,
titleFormatter: formatMenuTitle,
handleAddAuth,
handleEditAuth,
diff --git a/rsf-design/src/views/system/menu/menuPage.helpers.js b/rsf-design/src/views/system/menu/menuPage.helpers.js
index 642991e..03d60e3 100644
--- a/rsf-design/src/views/system/menu/menuPage.helpers.js
+++ b/rsf-design/src/views/system/menu/menuPage.helpers.js
@@ -45,16 +45,16 @@
return 'primary'
}
-export function getMenuTypeText(row = {}) {
- if (row.meta?.isAuthButton || Number(row.type) === 1) return $t('pages.system.menu.types.button')
- if (hasNestedMenus(row)) return $t('pages.system.menu.types.directory')
- return $t('pages.system.menu.types.menu')
+export function getMenuTypeText(row = {}, t = $t) {
+ if (row.meta?.isAuthButton || Number(row.type) === 1) return t('pages.system.menu.types.button')
+ if (hasNestedMenus(row)) return t('pages.system.menu.types.directory')
+ return t('pages.system.menu.types.menu')
}
-export function getMenuStatusMeta(status) {
+export function getMenuStatusMeta(status, t = $t) {
return normalizeMenuNumber(status, 1) === 1
- ? { text: $t('common.status.enabled'), type: 'success' }
- : { text: $t('common.status.disabled'), type: 'danger' }
+ ? { text: t('common.status.enabled'), type: 'success' }
+ : { text: t('common.status.disabled'), type: 'danger' }
}
export function normalizeMenuTreeOptions(nodes = [], titleFormatter = defaultMenuTitleFormatter) {
@@ -69,10 +69,10 @@
}))
}
-export function buildMenuTreeOptions(tree = [], titleFormatter = defaultMenuTitleFormatter) {
+export function buildMenuTreeOptions(tree = [], titleFormatter = defaultMenuTitleFormatter, t = $t) {
return [
{
- label: $t('table.topLevelMenu'),
+ label: t('table.topLevelMenu'),
value: 0,
children: normalizeMenuTreeOptions(tree, titleFormatter)
}
diff --git a/rsf-design/src/views/system/menu/menuTable.columns.js b/rsf-design/src/views/system/menu/menuTable.columns.js
index 74ee2bc..e038694 100644
--- a/rsf-design/src/views/system/menu/menuTable.columns.js
+++ b/rsf-design/src/views/system/menu/menuTable.columns.js
@@ -17,18 +17,19 @@
handleEditAuth,
handleDeleteAuth,
handleEditMenu,
- handleDeleteMenu
+ handleDeleteMenu,
+ t = $t
}) {
return [
{
prop: 'meta.title',
- label: $t('pages.system.menu.search.name'),
+ label: t('pages.system.menu.search.name'),
minWidth: 180,
formatter: (row) => getMenuDisplayTitle(row, titleFormatter)
},
{
prop: 'meta.icon',
- label: $t('table.iconPreview'),
+ label: t('table.iconPreview'),
width: 96,
align: 'center',
formatter: (row) => {
@@ -48,14 +49,14 @@
},
{
prop: 'type',
- label: $t('table.menuType'),
+ label: t('table.menuType'),
width: 110,
formatter: (row) =>
- h(ElTag, { type: getMenuTypeTag(row), effect: 'light' }, () => getMenuTypeText(row))
+ h(ElTag, { type: getMenuTypeTag(row), effect: 'light' }, () => getMenuTypeText(row, t))
},
{
prop: 'route',
- label: $t('pages.system.menu.search.route'),
+ label: t('pages.system.menu.search.route'),
minWidth: 180,
formatter: (row) => {
if (row.meta?.isAuthButton) return ''
@@ -64,7 +65,7 @@
},
{
prop: 'component',
- label: $t('table.componentKey'),
+ label: t('table.componentKey'),
minWidth: 160,
showOverflowTooltip: true,
formatter: (row) => {
@@ -74,48 +75,48 @@
},
{
prop: 'authority',
- label: $t('table.permissionKey'),
+ label: t('table.permissionKey'),
minWidth: 180,
formatter: (row) => {
if (row.meta?.isAuthButton) {
return row.authority || row.meta?.authMark || ''
}
if (!row.meta?.authList?.length) return row.authority || ''
- return $t('pages.system.menu.messages.authCount', {
+ return t('pages.system.menu.messages.authCount', {
count: row.meta.authList.length
})
}
},
{
prop: 'sort',
- label: $t('table.sort'),
+ label: t('table.sort'),
width: 90
},
{
prop: 'id',
- label: $t('table.id'),
+ label: t('table.id'),
width: 96,
align: 'center'
},
{
prop: 'status',
- label: $t('table.status'),
+ label: t('table.status'),
width: 100,
formatter: (row) => {
- const statusMeta = getMenuStatusMeta(row.status)
+ const statusMeta = getMenuStatusMeta(row.status, t)
return h(ElTag, { type: statusMeta.type, effect: 'light' }, () => statusMeta.text)
}
},
{
prop: 'memo',
- label: $t('table.remark'),
+ label: t('table.remark'),
minWidth: 180,
showOverflowTooltip: true,
formatter: (row) => row.memo || '-'
},
{
prop: 'operation',
- label: $t('table.operation'),
+ label: t('table.operation'),
width: 180,
align: 'center',
formatter: (row) => {
@@ -136,7 +137,7 @@
h(ArtButtonTable, {
type: 'add',
onClick: () => handleAddAuth(row),
- title: $t('pages.system.menu.actions.addAuth')
+ title: t('pages.system.menu.actions.addAuth')
}),
h(ArtButtonTable, {
type: 'edit',
diff --git a/rsf-design/src/views/system/operation-record/index.vue b/rsf-design/src/views/system/operation-record/index.vue
index b8005c6..5103f6b 100644
--- a/rsf-design/src/views/system/operation-record/index.vue
+++ b/rsf-design/src/views/system/operation-record/index.vue
@@ -52,6 +52,7 @@
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useUserStore } from '@/store/modules/user'
import { useAuth } from '@/hooks/core/useAuth'
@@ -73,15 +74,16 @@
createOperationRecordSearchState,
getOperationRecordPaginationKey,
getOperationRecordReportColumns,
+ getOperationRecordReportTitle,
mergeOperationRecordDetail,
- normalizeOperationRecordRow,
- OPERATION_RECORD_REPORT_TITLE
+ normalizeOperationRecordRow
} from './operationRecordPage.helpers'
import { createOperationRecordTableColumns } from './operationRecordTable.columns'
import OperationRecordDetailDrawer from './modules/operation-record-detail-drawer.vue'
defineOptions({ name: 'OperationRecord' })
+ const { t } = useI18n()
const userStore = useUserStore()
const { hasAuth } = useAuth()
@@ -90,52 +92,52 @@
const detailLoading = ref(false)
const detailData = ref({})
const selectedRows = ref([])
- const reportTitle = OPERATION_RECORD_REPORT_TITLE
+ const reportTitle = computed(() => getOperationRecordReportTitle(t))
const reportQueryParams = computed(() => buildOperationRecordSearchParams(searchForm.value))
- const reportColumns = getOperationRecordReportColumns()
+ const reportColumns = computed(() => getOperationRecordReportColumns(t))
const searchItems = computed(() => [
{
- label: '鍏抽敭瀛�',
+ label: t('table.keyword'),
key: 'condition',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ悕绉扮┖闂�'
+ placeholder: t('pages.system.operationRecord.search.conditionPlaceholder')
}
},
{
- label: '鎺ュ彛鍦板潃',
+ label: t('pages.system.operationRecord.table.url'),
key: 'url',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ユ帴鍙e湴鍧�'
+ placeholder: t('pages.system.operationRecord.search.urlPlaceholder')
}
},
{
- label: '瀹㈡埛绔疘P',
+ label: t('pages.system.operationRecord.table.clientIp'),
key: 'clientIp',
type: 'input',
props: {
clearable: true,
- placeholder: '璇疯緭鍏ュ鎴风IP'
+ placeholder: t('pages.system.operationRecord.search.clientIpPlaceholder')
}
},
{
- label: '缁撴灉',
+ label: t('pages.system.operationRecord.table.result'),
key: 'result',
type: 'select',
props: {
clearable: true,
options: [
- { label: '鎴愬姛', value: 1 },
- { label: '澶辫触', value: 0 }
+ { label: t('pages.system.operationRecord.result.success'), value: 1 },
+ { label: t('pages.system.operationRecord.result.failed'), value: 0 }
]
}
},
{
- label: '寮�濮嬫棩鏈�',
+ label: t('pages.system.operationRecord.search.timeStart'),
key: 'timeStart',
type: 'date',
props: {
@@ -145,7 +147,7 @@
}
},
{
- label: '缁撴潫鏃ユ湡',
+ label: t('pages.system.operationRecord.search.timeEnd'),
key: 'timeEnd',
type: 'date',
props: {
@@ -163,17 +165,24 @@
async function handleDelete(row) {
try {
- await ElMessageBox.confirm(`纭畾瑕佸垹闄ゆ搷浣滄棩蹇椼��${row.namespace || row.id}銆嶅悧锛焋, '鍒犻櫎纭', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- })
+ await ElMessageBox.confirm(
+ t('crud.confirm.deleteMessage', {
+ entity: t('pages.system.operationRecord.entity'),
+ label: row.namespace || row.id
+ }),
+ t('crud.confirm.deleteTitle'),
+ {
+ confirmButtonText: t('common.confirm'),
+ cancelButtonText: t('common.cancel'),
+ type: 'warning'
+ }
+ )
await fetchDeleteOperationRecord(row.id)
- ElMessage.success('鍒犻櫎鎴愬姛')
+ ElMessage.success(t('crud.messages.deleteSuccess'))
await refreshRemove()
} catch (error) {
if (error !== 'cancel') {
- ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+ ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
}
}
}
@@ -198,6 +207,7 @@
paginationKey: getOperationRecordPaginationKey(),
columnsFactory: () =>
createOperationRecordTableColumns({
+ t,
handleView: openDetail,
handleDelete: hasAuth('delete') ? handleDelete : null
})
@@ -243,7 +253,7 @@
resolvePrintRecords,
buildPreviewRows: (records) => buildOperationRecordPrintRows(records),
buildPreviewMeta: (rows) => ({
- reportTitle,
+ reportTitle: reportTitle.value,
reportDate: new Date().toLocaleDateString('zh-CN'),
printedAt: new Date().toLocaleString('zh-CN', { hour12: false }),
operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -259,7 +269,7 @@
} catch (error) {
detailDrawerVisible.value = false
detailData.value = {}
- ElMessage.error(error?.message || '鑾峰彇鎿嶄綔鏃ュ織璇︽儏澶辫触')
+ ElMessage.error(error?.message || t('pages.system.operationRecord.messages.detailFailed'))
} finally {
detailLoading.value = false
}
diff --git a/rsf-design/src/views/system/operation-record/modules/operation-record-detail-drawer.vue b/rsf-design/src/views/system/operation-record/modules/operation-record-detail-drawer.vue
index 98ab2c1..1f1d29b 100644
--- a/rsf-design/src/views/system/operation-record/modules/operation-record-detail-drawer.vue
+++ b/rsf-design/src/views/system/operation-record/modules/operation-record-detail-drawer.vue
@@ -1,40 +1,43 @@
<template>
<ElDrawer
:model-value="visible"
- title="鎿嶄綔鏃ュ織璇︽儏"
+ :title="t('pages.system.operationRecord.dialog.titleDetail')"
size="640px"
@update:model-value="handleVisibleChange"
>
<ElSkeleton :loading="loading" animated :rows="12">
<ElDescriptions :column="1" border>
- <ElDescriptionsItem label="鍚嶇О绌洪棿">{{ displayData.namespace || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎺ュ彛鍦板潃">{{ displayData.url || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="骞冲彴瀵嗛挜">{{ displayData.appkey || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎿嶄綔鐢ㄦ埛">{{ displayData.userLabel || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="瀹㈡埛绔疘P">{{ displayData.clientIp || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="缁撴灉">
- <ElTag :type="displayData.resultType" effect="light">{{ displayData.resultText || '--' }}</ElTag>
+ <ElDescriptionsItem :label="t('pages.system.operationRecord.table.namespace')">{{ displayData.namespace || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.operationRecord.table.url')">{{ displayData.url || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.operationRecord.detail.appkey')">{{ displayData.appkey || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.operationRecord.table.user')">{{ displayData.userLabel || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.operationRecord.table.clientIp')">{{ displayData.clientIp || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.operationRecord.table.result')">
+ <ElTag :type="displayData.resultType" effect="light">
+ {{ displayData.resultTextKey ? t(displayData.resultTextKey) : displayData.resultText || '--' }}
+ </ElTag>
</ElDescriptionsItem>
- <ElDescriptionsItem label="鑰楁椂(ms)">{{ displayData.spendTime ?? '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="鎿嶄綔鏃堕棿">{{ displayData.timestampText || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="寮傚父淇℃伅">{{ displayData.err || '--' }}</ElDescriptionsItem>
- <ElDescriptionsItem label="璇锋眰鍐呭">
+ <ElDescriptionsItem :label="t('pages.system.operationRecord.table.spendTime')">{{ displayData.spendTime ?? '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.operationRecord.table.timestamp')">{{ displayData.timestampText || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.operationRecord.detail.error')">{{ displayData.err || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('pages.system.operationRecord.detail.request')">
<pre class="whitespace-pre-wrap break-all rounded-lg bg-[var(--art-main-bg-color)] p-3 text-xs leading-6 text-g-700">{{
displayData.request || '--'
}}</pre>
</ElDescriptionsItem>
- <ElDescriptionsItem label="鍝嶅簲鍐呭">
+ <ElDescriptionsItem :label="t('pages.system.operationRecord.detail.response')">
<pre class="whitespace-pre-wrap break-all rounded-lg bg-[var(--art-main-bg-color)] p-3 text-xs leading-6 text-g-700">{{
displayData.response || '--'
}}</pre>
</ElDescriptionsItem>
- <ElDescriptionsItem label="澶囨敞">{{ displayData.memo || '--' }}</ElDescriptionsItem>
+ <ElDescriptionsItem :label="t('table.remark')">{{ displayData.memo || '--' }}</ElDescriptionsItem>
</ElDescriptions>
</ElSkeleton>
</ElDrawer>
</template>
<script setup>
+ import { useI18n } from 'vue-i18n'
import { mergeOperationRecordDetail } from '../operationRecordPage.helpers'
const props = defineProps({
@@ -44,6 +47,7 @@
})
const emit = defineEmits(['update:visible'])
+ const { t } = useI18n()
const displayData = computed(() => mergeOperationRecordDetail(props.detailData))
diff --git a/rsf-design/src/views/system/operation-record/operationRecordPage.helpers.js b/rsf-design/src/views/system/operation-record/operationRecordPage.helpers.js
index fb55e27..b891ab2 100644
--- a/rsf-design/src/views/system/operation-record/operationRecordPage.helpers.js
+++ b/rsf-design/src/views/system/operation-record/operationRecordPage.helpers.js
@@ -1,9 +1,11 @@
const OPERATION_RESULT_META = {
- 1: { text: '鎴愬姛', type: 'success' },
- 0: { text: '澶辫触', type: 'danger' }
+ 1: { textKey: 'pages.system.operationRecord.result.success', fallback: 'Success', type: 'success' },
+ 0: { textKey: 'pages.system.operationRecord.result.failed', fallback: 'Failed', type: 'danger' }
}
-export const OPERATION_RECORD_REPORT_TITLE = '鎿嶄綔鏃ュ織鎶ヨ〃'
+export function getOperationRecordReportTitle(t) {
+ return typeof t === 'function' ? t('pages.system.operationRecord.reportTitle') : 'Operation Record Report'
+}
export function createOperationRecordSearchState() {
return {
@@ -47,7 +49,13 @@
}
export function getOperationResultMeta(value) {
- return OPERATION_RESULT_META[Number(value)] || { text: '-', type: 'info' }
+ return (
+ OPERATION_RESULT_META[Number(value)] || {
+ textKey: 'common.placeholder.empty',
+ fallback: '--',
+ type: 'info'
+ }
+ )
}
export function formatOperationTimestamp(value) {
@@ -83,7 +91,8 @@
userLabel: record['userId$'] || record.userLabel || (record.userId ? String(record.userId) : ''),
timestampText: formatOperationTimestamp(record.timestamp),
createTimeText: record['createTime$'] || record.createTime || '',
- resultText: resultMeta.text,
+ resultTextKey: resultMeta.textKey,
+ resultText: resultMeta.fallback,
resultType: resultMeta.type
}
}
@@ -95,15 +104,15 @@
})
}
-export function getOperationRecordReportColumns() {
+export function getOperationRecordReportColumns(t) {
return [
- { prop: 'namespace', label: '鍚嶇О绌洪棿' },
- { prop: 'url', label: '鎺ュ彛鍦板潃' },
- { prop: 'userLabel', label: '鎿嶄綔鐢ㄦ埛' },
- { prop: 'clientIp', label: '瀹㈡埛绔疘P' },
- { prop: 'spendTimeText', label: '鑰楁椂(ms)' },
- { prop: 'resultText', label: '缁撴灉' },
- { prop: 'timestampText', label: '鎿嶄綔鏃堕棿' }
+ { prop: 'namespace', label: typeof t === 'function' ? t('pages.system.operationRecord.table.namespace') : 'Namespace' },
+ { prop: 'url', label: typeof t === 'function' ? t('pages.system.operationRecord.table.url') : 'API URL' },
+ { prop: 'userLabel', label: typeof t === 'function' ? t('pages.system.operationRecord.table.user') : 'User' },
+ { prop: 'clientIp', label: typeof t === 'function' ? t('pages.system.operationRecord.table.clientIp') : 'Client IP' },
+ { prop: 'spendTimeText', label: typeof t === 'function' ? t('pages.system.operationRecord.table.spendTime') : 'Latency (ms)' },
+ { prop: 'resultText', label: typeof t === 'function' ? t('pages.system.operationRecord.table.result') : 'Result' },
+ { prop: 'timestampText', label: typeof t === 'function' ? t('pages.system.operationRecord.table.timestamp') : 'Operation Time' }
]
}
diff --git a/rsf-design/src/views/system/operation-record/operationRecordTable.columns.js b/rsf-design/src/views/system/operation-record/operationRecordTable.columns.js
index 24f270f..1e7799a 100644
--- a/rsf-design/src/views/system/operation-record/operationRecordTable.columns.js
+++ b/rsf-design/src/views/system/operation-record/operationRecordTable.columns.js
@@ -2,56 +2,59 @@
import { ElTag } from 'element-plus'
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
-export function createOperationRecordTableColumns({ handleView, handleDelete }) {
+export function createOperationRecordTableColumns({ t, handleView, handleDelete }) {
return [
{
prop: 'namespace',
- label: '鍚嶇О绌洪棿',
+ label: t('pages.system.operationRecord.table.namespace'),
minWidth: 180,
showOverflowTooltip: true
},
{
prop: 'url',
- label: '鎺ュ彛鍦板潃',
+ label: t('pages.system.operationRecord.table.url'),
minWidth: 240,
showOverflowTooltip: true,
formatter: (row) => row.url || '-'
},
{
prop: 'userLabel',
- label: '鎿嶄綔鐢ㄦ埛',
+ label: t('pages.system.operationRecord.table.user'),
minWidth: 140,
formatter: (row) => row.userLabel || '-'
},
{
prop: 'clientIp',
- label: '瀹㈡埛绔疘P',
+ label: t('pages.system.operationRecord.table.clientIp'),
minWidth: 140,
formatter: (row) => row.clientIp || '-'
},
{
prop: 'spendTime',
- label: '鑰楁椂(ms)',
+ label: t('pages.system.operationRecord.table.spendTime'),
width: 110,
formatter: (row) => row.spendTime ?? '-'
},
{
prop: 'result',
- label: '缁撴灉',
+ label: t('pages.system.operationRecord.table.result'),
width: 100,
- formatter: (row) => h(ElTag, { type: row.resultType, effect: 'light' }, () => row.resultText || '-')
+ formatter: (row) =>
+ h(ElTag, { type: row.resultType, effect: 'light' }, () =>
+ row.resultTextKey ? t(row.resultTextKey) : row.resultText || '-'
+ )
},
{
prop: 'timestampText',
- label: '鎿嶄綔鏃堕棿',
+ label: t('pages.system.operationRecord.table.timestamp'),
minWidth: 180,
formatter: (row) => row.timestampText || '-'
},
{
prop: 'operation',
- label: '鎿嶄綔',
+ label: t('table.operation'),
width: handleDelete ? 120 : 70,
- align: 'right',
+ align: 'center',
formatter: (row) => {
const buttons = [
h(ArtButtonTable, {
@@ -69,7 +72,7 @@
)
}
- return h('div', { class: 'flex justify-end' }, buttons)
+ return h('div', { class: 'flex justify-center' }, buttons)
}
}
]
diff --git a/rsf-design/src/views/system/user-login/index.vue b/rsf-design/src/views/system/user-login/index.vue
index 140143d..f571cd8 100644
--- a/rsf-design/src/views/system/user-login/index.vue
+++ b/rsf-design/src/views/system/user-login/index.vue
@@ -27,15 +27,17 @@
import { fetchGetUserLoginList } from '@/api/system-manage'
import { useTable } from '@/hooks/core/useTable'
import { ElTag } from 'element-plus'
+ import { useI18n } from 'vue-i18n'
import { createUserLoginApiParams, userLoginPaginationKey } from './userLoginTable.config'
defineOptions({ name: 'UserLogin' })
+ const { t } = useI18n()
const LOGIN_TYPE_MAP = {
- 0: { label: '鐧诲綍鎴愬姛', type: 'success' },
- 1: { label: '鐧诲綍澶辫触', type: 'danger' },
- 2: { label: '閫�鍑虹櫥褰�', type: 'info' },
- 3: { label: 'token 缁', type: 'warning' }
+ 0: { labelKey: 'pages.system.userLogin.types.loginSuccess', type: 'success' },
+ 1: { labelKey: 'pages.system.userLogin.types.loginFailed', type: 'danger' },
+ 2: { labelKey: 'pages.system.userLogin.types.logout', type: 'info' },
+ 3: { labelKey: 'pages.system.userLogin.types.tokenRenew', type: 'warning' }
}
const initialSearchForm = {
@@ -49,41 +51,41 @@
const searchItems = computed(() => [
{
- label: 'Token',
+ label: t('pages.system.userLogin.search.token'),
key: 'token',
type: 'input',
props: {
- placeholder: '璇疯緭鍏� token',
+ placeholder: t('pages.system.userLogin.search.tokenPlaceholder'),
clearable: true
}
},
{
- label: 'IP',
+ label: t('pages.system.userLogin.search.ip'),
key: 'ip',
type: 'input',
props: {
- placeholder: '璇疯緭鍏� IP',
+ placeholder: t('pages.system.userLogin.search.ipPlaceholder'),
clearable: true
}
},
{
- label: '绯荤粺',
+ label: t('pages.system.userLogin.search.system'),
key: 'system',
type: 'input',
props: {
- placeholder: '璇疯緭鍏ョ郴缁熸爣璇�',
+ placeholder: t('pages.system.userLogin.search.systemPlaceholder'),
clearable: true
}
},
{
- label: '绫诲瀷',
+ label: t('pages.system.userLogin.search.type'),
key: 'type',
type: 'select',
props: {
- placeholder: '璇烽�夋嫨绫诲瀷',
+ placeholder: t('pages.system.userLogin.search.typePlaceholder'),
clearable: true,
options: Object.entries(LOGIN_TYPE_MAP).map(([value, item]) => ({
- label: item.label,
+ label: t(item.labelKey),
value: Number(value)
}))
}
@@ -93,7 +95,7 @@
const getLoginTypeConfig = (type) => {
return (
LOGIN_TYPE_MAP[type] || {
- label: type ?? '-',
+ label: type ?? t('common.placeholder.empty'),
type: 'info'
}
)
@@ -121,32 +123,32 @@
apiParams: createUserLoginApiParams(searchForm.value),
paginationKey: userLoginPaginationKey,
columnsFactory: () => [
- { type: 'index', width: 60, label: '搴忓彿' },
- { prop: 'id', label: 'ID', minWidth: 90 },
+ { type: 'index', width: 60, label: t('table.index') },
+ { prop: 'id', label: t('table.id'), minWidth: 90 },
{
prop: 'userDisplayName',
- label: '鐢ㄦ埛',
+ label: t('pages.system.userLogin.table.user'),
minWidth: 140,
formatter: (row) => getUserDisplayName(row)
},
- { prop: 'token', label: 'Token', minWidth: 260, showOverflowTooltip: true },
- { prop: 'ip', label: 'IP', minWidth: 140 },
+ { prop: 'token', label: t('pages.system.userLogin.table.token'), minWidth: 260, showOverflowTooltip: true },
+ { prop: 'ip', label: t('pages.system.userLogin.table.ip'), minWidth: 140 },
{
prop: 'type',
- label: '绫诲瀷',
+ label: t('pages.system.userLogin.search.type'),
width: 120,
formatter: (row) => {
const config = getLoginTypeConfig(row.type)
- return h(ElTag, { type: config.type }, () => config.label)
+ return h(ElTag, { type: config.type }, () => config.labelKey ? t(config.labelKey) : config.label)
}
},
- { prop: 'system', label: '绯荤粺', minWidth: 140 },
+ { prop: 'system', label: t('pages.system.userLogin.table.system'), minWidth: 140 },
{
prop: 'createTime',
- label: '鍒涘缓鏃堕棿',
+ label: t('table.createTime'),
minWidth: 180,
sortable: true,
- formatter: (row) => row.createTime$ || row.createTime || '-'
+ formatter: (row) => row.createTime$ || row.createTime || t('common.placeholder.empty')
}
]
}
--
Gitblit v1.9.1