| {{ t('equip.th.serial') }} | {{ t('equip.th.model') }} | {{ t('equip.th.region') }} | {{ t('equip.th.country') }} | {{ t('equip.th.ship') }} | {{ t('equip.th.bom') }} | {{ t('equip.th.op') }} |
|---|---|---|---|---|---|---|
| {{ r.serial }} | {{ r.model }} | {{ r.customer_code }} | {{ loc(r.region2) }} | {{ r.ship_date }} | {{ r.has_bom==='是' ? t('common.yes') : t('common.no') }} | |
| {{ t('common.nodata') }} | ||||||
{{ t('pager.page', { cur: eq.page, total: Math.ceil(eq.total/eq.pageSize) }) }}
{{ t('equip.detailTitle', { serial: detail.serial }) }}
{{ detail.model }}
{{ detail.resource_no }}
{{ detail.customer_code }}
{{ detail.manager }}
{{ detail.region2 || detail.region }}
{{ detail.ship_date }}
{{ detail.order_no }}
{{ detail.qty }}
{{ t('equip.bomStruct') }}
{{ detail.matched_bom_id }}
{{ t('equip.noBom') }}
{{ t('equip.serviceHead', { n: detail.service_history.length }) }}
| {{ t('equip.th.date') }} | {{ t('equip.th.type') }} | {{ t('equip.th.doc') }} | {{ t('equip.th.matcode') }} | {{ t('equip.th.matname') }} | {{ t('equip.th.spec') }} | {{ t('equip.th.qty') }} | {{ t('equip.th.wh') }} |
|---|---|---|---|---|---|---|---|
| {{ h.date }} | {{ h.out_type }} | {{ h.doc_no }} | {{ h.material_code }} | {{ h.material_name }} | {{ h.spec }} | {{ h.qty_out }} | {{ h.warehouse }} |
{{ t('equip.noService') }}
| {{ t('parts.th.code') }} | {{ t('parts.th.name') }} | {{ t('parts.th.nameEn') }} | {{ t('parts.th.spec') }} | {{ t('parts.th.unit') }} | {{ t('parts.th.cat') }} | {{ t('partspec.th.w') }} | {{ t('partspec.th.l') }} | {{ t('partspec.th.wd') }} | {{ t('partspec.th.h') }} | {{ t('parts.th.price') }} | {{ t('orders.th.op') }} |
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ r.code }} | {{ r.name }}{{ t('parts.badgeRep') }} | {{ r.name_en || '—' }} | {{ r.spec }} | {{ r.unit }} | {{ r.group_name }}{{ t('parts.badgeMaint') }} | {{ r.weight!=null ? r.weight : '—' }} | {{ r.length!=null ? r.length : '—' }} | {{ r.width!=null ? r.width : '—' }} | {{ r.height!=null ? r.height : '—' }} | {{ r.price!=null ? (r.price + ' ' + r.currency) : '' }} | |
| {{ t('common.nodata') }} | |||||||||||
{{ t('pager.page', { cur: parts.page, total: Math.ceil(parts.total/parts.pageSize) }) }}
| {{ t('maint.th.bom') }} | {{ t('maint.th.engine') }} | {{ t('maint.th.code') }} | {{ t('maint.th.name') }} | {{ t('parts.th.nameEn') }} | {{ t('maint.th.spec') }} | {{ t('maint.th.model') }} | {{ t('maint.th.w') }} | {{ t('maint.th.l') }} | {{ t('maint.th.wd') }} | {{ t('maint.th.h') }} | {{ t('parts.th.price') }} | {{ t('maint.th.op') }} |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ r.engine_supply }} | {{ r.engine_code }} | {{ r.part_code }} | {{ r.name }}{{ t('parts.badgeRep') }} | {{ r.name_en || '—' }} | {{ r.spec }} | {{ r.model_name }} | {{ r.weight!=null ? r.weight : '—' }} | {{ r.length!=null ? r.length : '—' }} | {{ r.width!=null ? r.width : '—' }} | {{ r.height!=null ? r.height : '—' }} | {{ r.price!=null ? (r.price + ' ' + r.currency) : '' }} | |
| {{ t('common.nodata') }} | ||||||||||||
{{ t('pager.page', { cur: maint.page, total: Math.ceil(maint.total/maint.pageSize) }) }}
| {{ t('maint.th.bom') }} | {{ t('maint.th.code') }} | {{ t('maint.th.engine') }} | {{ t('maint.th.name') }} | {{ t('parts.th.nameEn') }} | {{ t('maint.th.spec') }} | {{ t('maint.th.w') }} | {{ t('maint.th.l') }} | {{ t('maint.th.wd') }} | {{ t('maint.th.h') }} | {{ t('parts.th.price') }} | {{ t('orders.th.op') }} |
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ r.engine_supply }} | {{ r.part_code }} | {{ r.engine_code }} | {{ r.name }}{{ t('parts.badgeRep') }} | {{ r.name_en || '—' }} | {{ r.spec }} | {{ r.weight!=null ? r.weight : '—' }} | {{ r.length!=null ? r.length : '—' }} | {{ r.width!=null ? r.width : '—' }} | {{ r.height!=null ? r.height : '—' }} | {{ r.price!=null ? (r.price + ' ' + r.currency) : '' }} | |
| {{ t('maint.noMatch') }} | |||||||||||
{{ t('pager.page', { cur: maintMachine.page, total: Math.ceil(maintMachine.total/maintMachine.pageSize) }) }}
{{ t('ordercheck.bomResolved', { n: orderCheck.bomTotal }) }}
{{ t('ordercheck.summary', { n: orderCheck.total, m: orderCheck.matched, u: orderCheck.unmatched }) }}
| {{ t('ordercheck.th.seq') }} | {{ t('ordercheck.th.code') }} | {{ t('ordercheck.th.name') }} | {{ t('ordercheck.th.nameEn') }} | {{ t('ordercheck.th.spec') }} | {{ t('ordercheck.th.qty') }} | {{ t('ordercheck.th.result') }} |
|---|---|---|---|---|---|---|
| {{ r.seq }} | {{ r.code }} | {{ r.name || '—' }} | {{ r.std_name_en || r.name_en || '—' }} | {{ r.spec || '—' }} | {{ r.qty || '—' }} | {{ r.result }} |
{{ t('ordercheck.noData') }}
{{ t('cat.tabCustom') }}
{{ t('cat.tabPdf') }}
{{ t('cat.legendHead') }}
{{ co.callout_no }}
{{ co.bom_code }} · {{ co.bom_name || t('cat.unrecog') }}
{{ co.label || t('cat.noPart') }}
{{ user.role==='admin' ? t('cat.noCalloutAdmin') : t('cat.noCalloutCust') }}
{{ t('cat.pickImg') }}
{{ t('cat.partsHead', { n: albumParts.length }) }}
{{ t('cat.matched', { n: albumParts.filter(p=>p.matched_code).length }) }}
| {{ t('cat.th.no') }} | {{ t('cat.th.code') }} | {{ t('cat.th.name') }} | {{ t('cat.th.qty') }} | {{ t('cat.th.remark') }} | {{ t('cat.th.match') }} | {{ t('orders.th.op') }} |
|---|---|---|---|---|---|---|
| {{ p.label }} | {{ p.code }} | {{ p.name }} | {{ p.qty }} | {{ p.remark }} | {{ p.matched_code }}— |
{{ t('cat.noParts') }}
{{ t('cat.emptyAdmin1') }}
{{ t('cat.emptyCust') }}{{ t('cat.searching') }}
{{ t('cat.pageNo', { n: p.page }) }}
{{ p.snippet }}
{{ t('cat.noResult') }}
{{ t('cat.hint') }}
{{ t('cat.newTitle') }}
{{ t('cat.fBomHead') }}
{{ t('cat.importTitle') }}
{{ t('cat.selected', { n: importFile.name }) }}
{{ t('cat.linkedBomHead') }}
{{ t('cat.mapTip') }}
{{ importMsg }}
{{ t('cat.importPdfTitle') }}
{{ t('cat.selected', { n: pdfImportFile.name }) }}
{{ t('cat.linkedBomHead') }}
{{ t('cat.pdfTip') }}
{{ pdfImportMsg }}
{{ t('cat.editBomTitle', { key: bomEditKey }) }}
{{ t('cat.pkgBomTitle', { name: pkgBomName }) }}
{{ a.album_key }}
{{ a.title }}
{{ bid }}
{{ t('cat.notLinkedBom') }}
{{ t('cat.batchTitle') }}
{{ t('cat.mapFormat') }}
{{ mapMsg }}
{{ t('cat.editCalloutTitle', { name: coImageName }) }}
{{ a.callout_no }}
{{ a.bom_code || t('cat.notLinked') }}
{{ a.done ? t('cat.alignDone') : (i===coAlignCur ? t('cat.alignClick') : t('cat.alignPending')) }}
| {{ t('cat.imp.th.no') }} | {{ t('cat.imp.th.code') }} | {{ t('cat.imp.th.name') }} | {{ t('cat.imp.th.x') }} | {{ t('cat.imp.th.y') }} |
|---|---|---|---|---|
| {{ r.callout_no }} | {{ r.bom_code || '' }} | {{ r.label || '' }} | {{ r.x==null ? '—' : r.x }} | {{ r.y==null ? '—' : r.y }} |
{{ coImportMsg }}
{{ t('cat.coHint') }}
{{ co.callout_no }}
{{ co.bom_code || t('cat.notLinked') }}
{{ t('cat.noCallouts') }}
{{ t('bomtree.empty') }}
{{ t('bomtree.hint') }}
| {{ t('orders.th.no') }} | {{ t('orders.th.customer') }} | {{ t('orders.th.created') }} | {{ t('orders.th.by') }} | {{ t('orders.th.status') }} | {{ t('orders.th.op') }} |
|---|---|---|---|---|---|
| {{ o.order_no }} | {{ o.customer_code }} | {{ o.created_at }} | {{ o.created_by }} | {{ o.status }} | |
| {{ t('orders.empty') }} | |||||
{{ t('pager.page', { cur: ord.page, total: Math.ceil(ord.total/ord.pageSize) }) }}
{{ t('orders.detailTitle', { no: ordDetail.order_no }) }}
{{ ordDetail.customer_code }}
{{ ordDetail.created_by }}
{{ ordDetail.created_at }}
{{ ordDetail.status }}
{{ ordDetail.remark }}
{{ t('orders.itemsHead', { n: (ordDetail.items||[]).length }) }}
| {{ t('orders.th.partcode') }} | {{ t('orders.th.partname') }} | {{ t('orders.th.spec') }} | {{ t('orders.th.unit') }} | {{ t('orders.th.qty') }} | {{ t('orders.th.remark') }} |
|---|---|---|---|---|---|
| {{ it.part_code }} | {{ it.part_name }} | {{ it.spec }} | {{ it.unit }} | {{ it.qty }} | {{ it.remark }} |
| {{ t('common.nodata') }} | |||||
| {{ t('svc.th.no') }} | {{ t('svc.th.serial') }} | {{ t('svc.th.cust') }} | {{ t('svc.th.fbdate') }} | {{ t('svc.th.country') }} | {{ t('svc.th.fault') }} | {{ t('svc.th.warranty') }} | {{ t('svc.th.status') }} | {{ t('svc.th.track') }} | {{ t('svc.th.created') }} | {{ t('svc.th.op') }} |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ r.ticket_no }} | {{ r.serial || '—' }} | {{ r.customer_code }} | {{ r.feedback_date || '—' }}
{{ r.use_hours }} h
|
{{ r.sale_country || '—' }} | {{ svcFaultLabel(r.fault_type) }} |
{{ svcWarrLabel(r.warranty_status) }}
{{ r.warranty_end }}
|
{{ svcStLabel(r.status) }} | {{ r.tracking_no || '—' }} | {{ r.created_at }} | |
| {{ t('svc.empty') }} | ||||||||||
{{ t('pager.page', { cur: svc.page, total: Math.ceil(svc.total/svc.pageSize) }) }}
{{ svcStats.total }}
{{ t('svc.stat.total') }}
{{ svcStats.shipped }}
{{ t('svc.stat.shipped') }}
{{ svcStats.by_warranty.in_warranty || 0 }}
{{ t('svc.stat.inwarr') }}
{{ svcStats.by_warranty.out_warranty || 0 }}
{{ t('svc.stat.outwarr') }}
{{ t('svc.stat.byStatus') }}
| {{ lang==='en' ? s.en : s.zh }} | {{ svcStats.by_status[s.key] || 0 }} |
{{ t('svc.stat.faultTop') }}
| {{ svcFaultLabel(f.fault_type) }} | {{ f.n }} |
| {{ t('common.nodata') }} | |
{{ t('svc.stat.partTop') }}
| {{ p.part_code }} | {{ p.part_name }} | {{ p.q }} |
| {{ t('common.nodata') }} | ||
{{ t('svc.rule.title') }}
{{ t('svc.rule.hint') }}
| {{ t('svc.rule.scope') }} | {{ t('svc.rule.value') }} | {{ t('svc.rule.months') }} | {{ t('svc.th.op') }} |
|---|---|---|---|
| {{ t('svc.rule.' + r.scope) }} | {{ r.scope_value || '—' }} | {{ r.months }} | |
| {{ t('common.nodata') }} | |||
{{ t('svc.rule.add') }}
{{ t('svc.newTitle') }}
{{ t('svc.f.parts') }}
| {{ t('svc.f.partPh') }} | {{ t('svc.th.qty') }} | — |
|---|---|---|
{{ t('svc.pickTitle') }}
| {{ t('svc.th.serial') }} | {{ t('svc.th.model') }} | {{ t('equip.th.ship') }} | {{ t('svc.th.warranty') }} | — |
|---|---|---|---|---|
| {{ r.serial }} | {{ r.model }} | {{ r.ship_date }} |
{{ svcWarrLabel(r.status) }}
{{ r.warranty_end }}
|
|
| {{ t('svc.eqNone') }} | ||||
{{ t('svc.detailTitle', { no: svcDetail.ticket_no }) }}
{{ svcDetail.customer_code }} {{ svcDetail.customer_name }}
{{ svcDetail.serial || '—' }}
{{ svcDetail.model || '—' }}
{{ svcFaultLabel(svcDetail.fault_type) }}
{{ svcDetail.sale_country || '—' }}
{{ svcDetail.feedback_date || '—' }}
{{ svcDetail.use_hours !== null && svcDetail.use_hours !== undefined ? svcDetail.use_hours + ' h' : '—' }}
{{ svcDetail.ship_date || '—' }}
{{ svcWarrLabel(svcDetail.warranty_status) }}
{{ svcWarrDays(svcDetail) }}
{{ svcStLabel(svcDetail.status) }}
{{ svcDetail.created_at }}
{{ svcDetail.handler }}
{{ svcDetail.handle_note }}
{{ svcDetail.fault_desc }}
{{ t('svc.logi') }}
{{ svcDetail.carrier || '—' }}
{{ svcDetail.tracking_no || '—' }}
{{ svcDetail.ship_at || '—' }}
{{ svcDetail.eta || '—' }}
{{ svcCusLabel(svcDetail.customs_status) }}
{{ t('common.nodata') }}
{{ t('svc.itemsHead', { n: (svcDetail.items||[]).length }) }}
| {{ t('orders.th.partcode') }} | {{ t('svc.th.name') }} | {{ t('svc.th.spec') }} | {{ t('svc.th.qty') }} | {{ t('svc.th.price') }} | {{ t('svc.th.charge') }} |
|---|---|---|---|---|---|
| {{ it.part_code }} | {{ lang==='en' && it.name_en ? it.name_en : it.part_name }} | {{ it.spec }} | {{ it.qty }} {{ it.unit }} | {{ it.price!=null ? it.currency + ' ' + it.price : '—' }} | {{ t('svc.charge.' + (it.charge_type||'paid')) }} |
| {{ t('common.nodata') }} | |||||
{{ t('svc.logHead') }}
| {{ t('svc.th.created') }} | {{ t('svc.logi') }} | {{ t('svc.th.status') }} | {{ t('svc.kv.handler') }} | {{ t('svc.note') }} |
|---|---|---|---|---|
| {{ l.created_at }} | {{ l.action }} | {{ l.from_status ? svcStLabel(l.from_status) + ' → ' + svcStLabel(l.to_status) : svcStLabel(l.to_status) }} | {{ l.operator }} | {{ l.note }} |
| {{ t('common.nodata') }} | ||||
{{ t('svc.noNext') }}
{{ t('svc.review') }}
{{ t('svc.itemsHead', { n: svcReviewForm.items.length }) }}
| {{ t('orders.th.partcode') }} | {{ t('svc.th.qty') }} | {{ t('svc.th.charge') }} |
|---|---|---|
| {{ it.part_code }} {{ it.part_name }} |
{{ t('svc.logiTitle') }}
{{ t('svc.addPartTitle') }}
| {{ t('svc.f.partPh') }} | {{ t('svc.th.qty') }} | {{ t('svc.th.charge') }} | — |
|---|---|---|---|
{{ t('bulk.title') }}
{{ t('bulk.hint') }}
{{ t('bulk.missing') }} {{ bulkImp.missing.join(', ') }}
🤖
🤖 {{ t('ai.title') }}
{{ t('ai.welcome') }}
{{ t('ai.eg1') }}
{{ t('ai.eg2') }}
{{ t('ai.eg3') }}
{{ m.content }}
{{ t('ai.autoSearch') }}
{{ h.label }} {{ h.n }}
{{ t('ai.hitNone') }}
{{ aiTableTitle(tb.key) }}({{ tb.rows.length }})
| {{ c.label }} | {{ t('orders.th.op') }} |
|---|---|
| {{ aiCell(r,c) }} | — |
{{ t('ai.thinking') }}
{{ chat.err }}
{{ t('ai.noConfig') }}
{{ tr.err }}
{{ tr.result }}
{{ invStats.counts.total || 0 }}
{{ t('inv.kpi.total') }}
{{ invStats.counts.maintained || 0 }}
{{ t('inv.kpi.maintained') }}
{{ invStats.counts.unset || 0 }}
{{ t('inv.kpi.unset') }}
{{ invStats.alert_count || 0 }}
{{ t('inv.kpi.alert') }}
{{ invStats.counts.dormant || 0 }}
{{ t('inv.kpi.dormant') }}
{{ invMoney(invStats.amount) }}
{{ t('inv.kpi.amount') }}
| {{ t('inv.th.code') }} | {{ t('inv.th.name') }} | {{ t('inv.th.spec') }} | {{ t('inv.th.stock') }} | {{ t('inv.th.safety') }} | {{ t('inv.th.state') }} | {{ t('inv.th.avg') }} | {{ t('inv.th.lastOut') }} | {{ t('inv.th.price') }} | {{ t('inv.th.amount') }} | {{ t('inv.th.suggest') }} | {{ t('inv.th.op') }} |
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ r.code }} | {{ lang==='en' ? (r.name_en || r.name) : r.name }} | {{ r.spec }} | {{ invNum(r.stock) }} | {{ r.safety }} | {{ invStLabel(r.state) }} | {{ r.avg_month }} | {{ r.last_out || t('inv.na') }} | {{ invMoney(r.price) }} | {{ invMoney(r.amount) }} | {{ r.suggest }}{{ t('inv.na') }} | |
| {{ invTab==='alerts' ? t('inv.emptyAlert') : t('inv.empty') }} | |||||||||||
{{ t('pager.page', { cur: invList.page, total: Math.ceil(invList.total/invList.pageSize) }) }}
| {{ t('inv.th.time') }} | {{ t('inv.th.code') }} | {{ t('inv.th.name') }} | {{ t('inv.th.type') }} | {{ t('inv.th.qty') }} | {{ t('inv.th.before') }} | {{ t('inv.th.after') }} | {{ t('inv.th.reason') }} | {{ t('inv.th.ref') }} | {{ t('inv.th.operator') }} |
|---|---|---|---|---|---|---|---|---|---|
| {{ r.created_at }} | {{ r.part_code }} | {{ lang==='en' ? (r.name_en || r.name) : r.name }} | {{ invTypeLabel(r.change_type) }} | {{ r.qty }} | {{ r.before_qty }} | {{ r.after_qty }} | {{ r.reason }} | {{ r.ref_no }} | {{ r.operator }} |
| {{ t('inv.empty') }} | |||||||||
{{ t('pager.page', { cur: invLogs.page, total: Math.ceil(invLogs.total/invLogs.pageSize) }) }}
{{ t('inv.cfg.hint') }}
{{ rptNum(rptOv.current.doc_count) }}
{{ t('rpt.kpi.doc') }}
{{ t('rpt.vsPrev') }} {{ rptDelta(rptOv.delta.doc_count) }}
{{ rptNum(rptOv.current.qty) }}
{{ t('rpt.kpi.qty') }}
{{ t('rpt.vsPrev') }} {{ rptDelta(rptOv.delta.qty) }}
{{ rptMoney(rptOv.current.amount) }}
{{ t('rpt.kpi.amount') }}
{{ t('rpt.vsPrev') }} {{ rptDelta(rptOv.delta.amount) }}
{{ rptNum(rptOv.current.customers) }}
{{ t('rpt.kpi.cust') }}
{{ rptNum(rptOv.current.parts) }}
{{ t('rpt.kpi.part') }}
{{ rptNum(rptOv.current.countries) }}
{{ t('rpt.kpi.country') }}
{{ t('rpt.prevRange', { f: rptOv.prev_range.from, t: rptOv.prev_range.to }) }}
{{ t('rpt.trend') }}
{{ t('rpt.groupMonth') }}
{{ t('rpt.groupQuarter') }}
{{ t('rpt.groupYear') }}
{{ t('rpt.top') }}
{{ rptTop.total_groups }} {{ lang==='en' ? 'groups' : '个分组' }}
| {{ t('rpt.th.rank') }} | {{ t('rpt.th.item') }} | {{ t('rpt.th.orders') }} | {{ t('rpt.th.qty') }} | {{ t('rpt.th.amount') }} | {{ t('rpt.th.share') }} | {{ t('inv.th.op') }} |
|---|---|---|---|---|---|---|
| {{ i+1 }} | {{ r.name || r.key }} | {{ r.doc_count }} | {{ rptNum(r.qty) }} | {{ rptMoney(r.amount) }} | {{ r.share }}% | |
| {{ t('rpt.empty') }} | ||||||
{{ t('rpt.detail') }}
{{ rptDimLabel(rptDet.dim) }}: {{ rptDet.dim_key }}
{{ t('rpt.totalQty', { n: rptNum(rptDet.sum_qty) }) }} · {{ t('rpt.totalAmt', { n: rptMoney(rptDet.sum_amount) }) }}
| {{ t('rpt.th.date') }} | {{ t('rpt.th.type') }} | {{ t('rpt.th.docNo') }} | {{ t('rpt.th.country') }} | {{ t('rpt.th.cust') }} | {{ t('rpt.th.sales') }} | {{ t('rpt.th.code') }} | {{ t('rpt.th.name') }} | {{ t('rpt.th.qty') }} | {{ t('rpt.th.amount') }} | {{ t('rpt.th.warehouse') }} |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ r.date }} | {{ r.out_type }} | {{ r.doc_no }} | {{ loc(r.country) }} | {{ r.customer_name }} | {{ r.salesperson }} | {{ r.material_code }} | {{ r.material_name }} | {{ r.qty }} | {{ rptMoney(r.amount) }} | {{ r.warehouse }} |
| {{ t('rpt.empty') }} | ||||||||||
{{ t('pager.page', { cur: rptDet.page, total: Math.ceil(rptDet.total/rptDet.pageSize) }) }}
{{ stats.kpi.equipment || 0 }}
{{ t('stats.kpi.equipment') }}
{{ stats.kpi.models || 0 }}
{{ t('stats.kpi.models') }}
{{ stats.kpi.parts || 0 }}
{{ t('stats.kpi.parts') }}
{{ stats.kpi.albums || 0 }}
{{ t('stats.kpi.albums') }}
{{ stats.kpi.customers || 0 }}
{{ t('stats.kpi.customers') }}
{{ stats.kpi.sales || 0 }}
{{ t('stats.kpi.sales') }}
{{ t('stats.chart.country') }}
{{ t('stats.chart.model') }}
{{ t('stats.chart.trend') }}
{{ t('stats.chart.parts') }}
{{ t('stats.chart.album') }}
{{ t('stats.loading') }}
{{ t('admin.tabEquip') }}
{{ t('admin.tabBom') }}
{{ t('admin.tabCust') }}
{{ t('pm.title') }}
{{ t('rep.title') }}
{{ t('admin.tabMaint') }}
{{ t('bomclean.title') }}
{{ t('partspec.title') }}
{{ t('nav.sales') }}
{{ t('price.title') }}
{{ t('config.title') }}
{{ t('term.title') }}
{{ t('logs.title') }}
⚠ {{ t('stock.title') }}
🏭 {{ t('supplier.title') }}
📈 {{ t('report.title') }}
| {{ t('admin.th.serial') }} | {{ t('admin.th.model') }} | {{ t('admin.th.custCode') }} | {{ t('admin.th.region') }} | {{ t('admin.th.ship') }} | {{ t('admin.th.op') }} |
|---|---|---|---|---|---|
| {{ r.serial }} | {{ r.model }} | {{ r.customer_code }} | {{ r.region }} | {{ r.ship_date }} | |
| {{ t('common.nodata') }} | |||||
{{ t('pager.page', { cur: ae.page, total: Math.ceil(ae.total/ae.pageSize) }) }}
| {{ t('admin.thc.code') }} | {{ t('admin.thc.country') }} | {{ t('admin.thc.manager') }} | {{ t('admin.thc.phone') }} |
|---|---|---|---|
| {{ r.code }} | {{ loc(r.country) }} | {{ r.manager }} | {{ r.phone }} |
| {{ t('common.nodata') }} | |||
{{ t('pager.page', { cur: ac.page, total: Math.ceil(ac.total/ac.pageSize) }) }}
| {{ t('admin.th.bomcode') }} | {{ t('admin.th.bomname') }} | {{ t('admin.th.parts') }} | {{ t('admin.th.op') }} |
|---|---|---|---|
| {{ b.bom_id }} | {{ b.model_name }} | {{ b.items }} | |
| {{ t('common.nodata') }} | |||
{{ t('admin.batchAddPartsTitle') }}
{{ t('admin.batchAddPartsPreview') }}
{{ t('admin.batchAddPartsByCol', { col: bomItemBatchBomCol }) }}
{{ t('admin.batchAddPartsNoCol') }}
| {{ t('admin.th.bomcode') }} | {{ t('admin.batchAddPartsCnt') }} | {{ t('common.op') }} |
|---|---|---|
| {{ row.bom_id }} | {{ row.count }} | {{ t('admin.exists') }} {{ t('admin.batchAddPartsUnknown') }} |
{{ t('admin.batchAddPartsPickTargets') }}
{{ bomItemBatchMsg }}
| {{ t('pm.th.code') }} | {{ t('pm.th.name') }} | {{ t('pm.th.nameEn') }} | {{ t('pm.th.spec') }} | {{ t('pm.th.unit') }} | {{ t('pm.th.oe') }} | {{ t('pm.th.drawing') }} | {{ t('pm.th.material') }} | {{ t('pm.th.type') }} | {{ t('pm.th.attr') }} | {{ t('pm.th.brand') }} | {{ t('pm.th.group') }} | {{ t('pm.th.remark') }} | {{ t('pm.th.op') }} |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ r.code }} | {{ r.name }} | {{ r.name_en || '—' }} | {{ r.spec }} | {{ r.unit }} | {{ r.oe_no }} | {{ r.drawing_no }} | {{ r.material }} | {{ r.ptype }} | {{ r.attr }} | {{ r.brand }} | {{ r.group_name }} | {{ r.remark }} | |
| {{ t('common.nodata') }} | |||||||||||||
{{ t('pager.page', { cur: pm.page, total: Math.ceil(pm.total/pm.pageSize) }) }}
| {{ t('rep.th.id') }} | {{ t('rep.th.old') }} | {{ t('rep.th.new') }} | {{ t('rep.th.type') }} | {{ t('rep.th.eff') }} | {{ t('rep.th.exp') }} | {{ t('rep.fitment') }} | {{ t('common.status') }} | {{ t('rep.th.note') }} | {{ t('rep.th.caution') }} | {{ t('rep.th.op') }} |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ r.id }} | {{ r.old_no }} | {{ r.new_no }} | {{ r.replace_type }} | {{ r.eff_date }} | {{ r.exp_date }} | {{ expStatus(r) }} | {{ r.note }} | {{ r.caution }} | ||
| {{ t('common.nodata') }} | ||||||||||
{{ t('pager.page', { cur: rep.page, total: Math.ceil(rep.total/rep.pageSize) }) }}
{{ t('maint.stats', { t: maintAdmin.stats.total, d: maintAdmin.stats.distinct }) }}
| {{ t('maint.th.bom') }} | {{ t('maint.th.engine') }} | {{ t('maint.th.code') }} | {{ t('maint.th.name') }} | {{ t('parts.th.nameEn') }} | {{ t('maint.th.spec') }} | {{ t('maint.th.unit') }} | {{ t('maint.th.attr') }} | {{ t('maint.th.brand') }} | {{ t('maint.th.group') }} | {{ t('maint.th.remark') }} | {{ t('maint.th.w') }} | {{ t('maint.th.l') }} | {{ t('maint.th.wd') }} | {{ t('maint.th.h') }} | {{ t('maint.th.op') }} |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ r.engine_supply }} | {{ r.engine_code }} | {{ r.part_code }} | {{ r.name }} | {{ r.name_en || '—' }} | {{ r.spec }} | {{ r.unit }} | {{ r.attr }}— ★ | {{ r.brand }}— ★ | {{ r.ptype }}— ★ | {{ r.remark }}— ★ | {{ r.weight!=null ? r.weight : '—' }} | {{ r.length!=null ? r.length : '—' }} | {{ r.width!=null ? r.width : '—' }} | {{ r.height!=null ? r.height : '—' }} | |
| {{ t('common.nodata') }} | |||||||||||||||
{{ t('pager.page', { cur: maintAdmin.page, total: Math.ceil(maintAdmin.total/maintAdmin.pageSize) }) }}
{{ t('bomclean.savedHint', { n: bomClean.result.saved_spare }) }}
{{ t('bomclean.noiseTitle') }}({{ bomClean.result.noise_count }})
| {{ t('bomclean.thCode') }} | {{ t('bomclean.thName') }} | {{ t('bomclean.thSpec') }} |
|---|---|---|
| {{ r.code }} | {{ r.name }} | {{ r.spec }} |
| {{ t('common.nodata') }} | ||
{{ t('bomclean.dupTitle') }}({{ bomClean.result.dup_count }})
| {{ t('bomclean.thCode') }} | {{ t('bomclean.thName') }} | {{ t('bomclean.thSpec') }} |
|---|---|---|
| {{ r.code }} | {{ r.name }} | {{ r.spec }} |
| {{ t('common.nodata') }} | ||
{{ t('bomclean.spareTitle') }}({{ bomClean.result.spare_total }})
| {{ t('bomclean.thCode') }} | {{ t('bomclean.thName') }} | {{ t('bomclean.thNameEn') }} | {{ t('bomclean.thSpec') }} | {{ t('bomclean.thRemark') }} |
|---|---|---|---|---|
| {{ r.code }} | {{ r.name }} | {{ r.name_en || '—' }} | {{ r.spec }} | {{ r.remark }} |
| {{ t('common.nodata') }} | ||||
{{ t('bomclean.rulesTitle') }}
{{ t('bomclean.rulesDesc', { noise: bomClean.rules.noise.length, dedup: bomClean.rules.dedup.length }) }}
{{ bomClean.rulesFile.name }}
{{ bomClean.rulesMsg }}
{{ eqEditSerial ? t('admin.editEq') : t('admin.newEq') }}
{{ t('admin.newBomTitle') }}
{{ t('admin.selected', { n: bomNewFileName }) }}
{{ t('admin.batchImportTitle', { name: bomItemTarget.model_name }) }}
| {{ t('partspec.th.code') }} | {{ t('partspec.th.name') }} | {{ t('partspec.th.w') }} | {{ t('partspec.th.l') }} | {{ t('partspec.th.wd') }} | {{ t('partspec.th.h') }} | {{ t('maint.th.op') }} |
|---|---|---|---|---|---|---|
| {{ r.material_code }} | {{ r.name }} | {{ r.weight!=null ? r.weight : '' }} | {{ r.length!=null ? r.length : '' }} | {{ r.width!=null ? r.width : '' }} | {{ r.height!=null ? r.height : '' }} | |
| {{ t('common.nodata') }} | ||||||
{{ t('pager.page', { cur: partSpec.page, total: Math.ceil(partSpec.total/partSpec.pageSize) }) }}
| {{ t('sales.th.date') }} | {{ t('sales.th.type') }} | {{ t('sales.th.doc') }} | {{ t('sales.th.country') }} | {{ t('sales.th.matcode') }} | {{ t('sales.th.matname') }} | {{ t('sales.th.spec') }} | {{ t('sales.th.qty') }} | {{ t('sales.th.wh') }} |
|---|---|---|---|---|---|---|---|---|
| {{ r.date }} | {{ r.out_type }} | {{ r.doc_no }} | {{ loc(r.country) }} | {{ r.material_code }} | {{ r.material_name }} | {{ r.spec }} | {{ r.qty_out }} | {{ r.warehouse }} |
| {{ t('common.nodata') }} | ||||||||
{{ t('pager.page', { cur: sl.page, total: Math.ceil(sl.total/sl.pageSize) }) }}
| {{ t('pm.th.code') }} | {{ t('pm.th.name') }} | {{ t('pm.th.nameEn') }} | {{ t('price.th.currency') }} | {{ t('price.th.price') }} | {{ t('price.th.type') }} | {{ t('price.th.supplier') }} | {{ t('price.th.moq') }} | {{ t('price.th.lead') }} | {{ t('price.th.eff') }} | {{ t('pm.th.remark') }} | {{ t('pm.th.op') }} |
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ r.part_code }} | {{ r.name }} | {{ r.name_en || '—' }} | {{ r.currency }} | {{ r.price!=null ? r.price.toFixed(2) : '—' }} | {{ r.price_type }} | {{ r.supplier || '—' }} | {{ r.moq!=null ? r.moq : '—' }} | {{ r.lead_time_days!=null ? r.lead_time_days : '—' }} | {{ r.effective_date || '—' }} | {{ r.remark || '—' }} | |
| {{ t('common.nodata') }} | |||||||||||
{{ t('pager.page', { cur: pr.page, total: Math.ceil(pr.total/pr.pageSize) }) }}
| {{ t('config.th.key') }} | {{ t('config.th.value') }} | {{ t('config.th.desc') }} | {{ t('config.th.time') }} | {{ t('pm.th.op') }} |
|---|---|---|---|---|
| {{ r.key }} | {{ r.value }} | {{ r.description || '—' }} | {{ r.updated_at || '—' }} | |
| {{ t('common.nodata') }} | ||||
{{ t('ai.cfgTitle') }}
{{ t('ai.cfgStatus') }}: {{ llmStatus.configured ? t('ai.configured') : t('ai.notConfig') }} ({{ llmStatus.provider }})
{{ t('ai.cfgHint') }}
{{ t('backup.title') }}
| {{ t('backup.th.file') }} | {{ t('backup.th.time') }} | {{ t('backup.th.size') }} | {{ t('pm.th.op') }} |
|---|---|---|---|
| {{ b.file }} | {{ b.time }} | {{ fmtSize(b.size) }} | |
| {{ t('common.nodata') }} | |||
| {{ t('term.th.zh') }} | {{ t('term.th.en') }} | {{ t('term.th.domain') }} | {{ t('term.th.time') }} | {{ t('pm.th.op') }} |
|---|---|---|---|---|
| {{ r.zh_term }} | {{ r.en_term }} | {{ r.domain }} | {{ r.created_at || '—' }} | |
| {{ t('common.nodata') }} | ||||
{{ t('pager.page', { cur: tm.page, total: Math.ceil(tm.total/tm.pageSize) }) }}
| {{ t('logs.th.time') }} | {{ t('logs.th.user') }} | {{ t('logs.th.role') }} | {{ t('logs.th.action') }} | {{ t('logs.th.target') }} | {{ t('logs.th.detail') }} | {{ t('logs.th.ip') }} |
|---|---|---|---|---|---|---|
| {{ r.created_at }} | {{ r.username }} | {{ r.role }} | {{ r.action }} | {{ r.target || '—' }} | {{ r.detail || '—' }} | {{ r.ip || '—' }} |
| {{ t('common.nodata') }} | ||||||
{{ t('pager.page', { cur: logs.page, total: Math.ceil(logs.total/logs.pageSize) }) }}
| {{ t('pm.th.code') }} | {{ t('pm.th.name') }} | {{ t('pm.th.nameEn') }} | {{ t('pm.th.spec') }} | {{ t('pm.th.brand') }} | {{ t('stock.th.stock') }} | {{ t('stock.th.safety') }} | {{ t('stock.th.status') }} |
|---|---|---|---|---|---|---|---|
| {{ r.code }} | {{ r.name }} | {{ r.name_en || '—' }} | {{ r.spec || '—' }} | {{ r.brand || '—' }} | {{ r.stock_qty!=null?r.stock_qty:'未录入' }} | {{ r.safety_stock!=null?r.safety_stock:'—' }} | {{ t('stock.alert') }} |
| {{ t('common.nodata') }} | |||||||
{{ t('pager.page', { cur: stock.page, total: Math.ceil(stock.total/stock.pageSize) }) }}
{{ t('stock.tip') }}
| {{ t('supplier.th.name') }} | {{ t('supplier.th.country') }} | {{ t('supplier.th.contact') }} | {{ t('supplier.th.lead') }} | {{ t('supplier.th.remark') }} | {{ t('pm.th.op') }} |
|---|---|---|---|---|---|
| {{ s.name }} | {{ s.country || '—' }} | {{ s.contact || '—' }} | {{ s.lead_time_days!=null?s.lead_time_days:'—' }} | {{ s.remark || '—' }} | |
| {{ t('common.nodata') }} | |||||
{{ t('pager.page', { cur: suppliers.page, total: Math.ceil(suppliers.total/suppliers.pageSize) }) }}
{{ t('supplier.aggTitle') }}
| {{ t('supplier.th.name') }} | {{ t('supplier.th.cnt') }} | {{ t('supplier.th.min') }} | {{ t('supplier.th.max') }} | {{ t('supplier.th.avg') }} |
|---|---|---|---|---|
| {{ a.supplier }} | {{ a.part_cnt }} | {{ a.min_price!=null?a.min_price.toFixed(2):'—' }} | {{ a.max_price!=null?a.max_price.toFixed(2):'—' }} | {{ a.avg_price!=null?a.avg_price.toFixed(2):'—' }} |
| {{ t('common.nodata') }} | ||||
{{ report.title }}
| {{ h }} |
|---|
| {{ v }} |
| {{ t('common.nodata') }} |
{{ pmEditCode ? t('pm.edit') : t('pm.new') }}
{{ priceEditId ? t('price.edit') : t('price.new') }}
{{ cfgEditKey ? t('config.edit') : t('config.add') }}
{{ termEditId ? t('term.edit') : t('term.new') }}
{{ repEditId ? t('rep.edit') : t('rep.new') }}
{{ t('part.repTitle', { code: repPanelCode }) }}
| {{ t('rep.th.old') }} | {{ t('rep.th.new') }} | {{ t('rep.th.type') }} | {{ t('part.repStatus') }} | {{ t('rep.th.note') }} | {{ t('rep.th.caution') }} |
|---|---|---|---|---|---|
| {{ r.old_no }} | {{ r.new_no }} | {{ r.replace_type }} | {{ t('rep.status.'+r.status) }} | {{ r.note }} | {{ r.caution }} |
{{ t('part.repEmpty') }}
{{ supForm.id ? t('pm.edit') : t('supplier.add') }}
{{ t('rep.adaptTitle') }} · {{ adaptInfo.code }}
{{ t('rep.check') }}:{{ adaptInfo.count }} 个 BOM
| {{ t('rep.adaptBom') }} | {{ t('rep.adaptModel') }} |
|---|---|
| {{ m.bom_id }} | {{ m.model_name }} |
{{ t('rep.adaptNone') }}
{{ supParts.supplier }} · {{ t('supplier.parts') }}
| {{ t('pm.th.code') }} | {{ t('pm.th.name') }} | {{ t('price.fCurrency') }} | {{ t('price.fPrice') }} | {{ t('price.fType') }} | {{ t('price.fMoq') }} | {{ t('price.fLead') }} | {{ t('price.fEff') }} |
|---|---|---|---|---|---|---|---|
| {{ p.part_code }} | {{ p.part_name }} | {{ p.currency }} | {{ p.price }} | {{ p.price_type }} | {{ p.moq!=null?p.moq:'—' }} | {{ p.lead_time_days!=null?p.lead_time_days:'—' }} | {{ p.effective_date||'—' }} |
{{ t('common.nodata') }}
🛒{{ cart.length }}
{{ cartMsg }}
{{ t('cart.title') }}({{ cart.length }})
{{ orderCountry }}
| {{ t('orders.th.partcode') }} | {{ t('orders.th.partname') }} | {{ t('cart.qty') }} | {{ t('cart.remove') }} |
|---|---|---|---|
| {{ x.code }} | {{ x.name }} |
{{ t('cart.empty') }}
| {{ t('acct.th.user') }} | {{ t('acct.th.role') }} | {{ t('acct.th.code') }} | {{ t('acct.th.name') }} | {{ t('acct.th.created') }} | {{ t('acct.th.op') }} |
|---|---|---|---|---|---|
| {{ u.username }} | {{ roleName(u.role) }} | {{ u.customer_code || '—' }} | {{ u.display_name }} | {{ u.created_at || '—' }} | |
| {{ t('common.nodata') }} | |||||
{{ acctEdit ? t('acct.edit') : t('acct.new') }}
{{ t('acct.resetTitle', { u: pwdTarget }) }}
{{ t('acct.chgSelf') }}
{{ t('inv.adjustTip', { code: invAdj.code }) }}
{{ invAdj.name }}
{{ t('inv.importTitle') }}
{{ t('inv.importHint') }}
{{ invImp.msg }}
{{ t('svc.importTitle') }}
{{ t('svc.importHint') }}
{{ svcImp.msg }}
{{ svcImp.detail }}
{{ consignStats.placed||0 }}
{{ t('consign.kpi.placed') }}
{{ consignStats.issued||0 }}
{{ t('consign.kpi.issued') }}
{{ consignStats.remain||0 }}
{{ t('consign.kpi.remain') }}
{{ consignStats.wh_count||0 }}
{{ t('consign.kpi.wh') }}
| {{ t('consign.th.batchNo') }} | {{ t('consign.th.wh') }} | {{ t('consign.th.country') }} | {{ t('consign.th.date') }} | {{ t('consign.th.placed') }} | {{ t('consign.th.issued') }} | {{ t('consign.th.remain') }} | {{ t('consign.th.remark') }} | {{ t('consign.th.op') }} |
|---|---|---|---|---|---|---|---|---|
| {{ r.batch_no }} | {{ r.wh_cust_name }} | {{ r.country }} | {{ r.place_date }} | {{ r.qty_placed }} | {{ r.qty_issued }} | {{ r.qty_remain }} | {{ r.remark }} | |
| {{ t('consign.empty') }} | ||||||||
{{ t('pager.page',{cur:placePage,total:Math.ceil(placeTotal/placePageSize)}) }}
| {{ t('consign.th.wh') }} | {{ t('consign.th.country') }} | {{ t('consign.th.code') }} | {{ t('consign.th.name') }} | {{ t('consign.th.spec') }} | {{ t('consign.th.unit') }} | {{ t('consign.th.remain') }} | {{ t('consign.th.safety') }} | {{ t('consign.th.low') }} |
|---|---|---|---|---|---|---|---|---|
| {{ r.wh_cust_name }} | {{ r.country }} | {{ r.material_code }} | {{ lang==='en'?(r.name_en||r.name):r.name }} | {{ r.spec }} | {{ r.unit }} | {{ r.remain }} | {{ r.safety }} | {{ t('consign.low') }}— |
| {{ t('consign.empty') }} | ||||||||
{{ t('pager.page',{cur:stockPage,total:Math.ceil(stockTotal/stockPageSize)}) }}
| {{ t('consign.th.issueNo') }} | {{ t('consign.th.wh') }} | {{ t('consign.th.reqCust') }} | {{ t('consign.th.type') }} | {{ t('consign.th.qty') }} | {{ t('consign.th.date') }} | {{ t('consign.th.ticket') }} |
|---|---|---|---|---|---|---|
| {{ r.issue_no }} | {{ r.wh_cust_name }} | {{ r.req_cust_name }} | {{ consignTypeLabel(r.issue_type) }} | {{ r.qty_total }} | {{ r.issue_date }} | {{ r.ticket_no }} |
| {{ t('consign.empty') }} | ||||||
{{ t('pager.page',{cur:issuePage,total:Math.ceil(issueTotal/issuePageSize)}) }}
{{ t('consign.newPlace') }}
{{ t('consign.placeHint') }}
✓ {{ placeForm.wh_cust_code }} · {{ placeForm.wh_cust_name }}
{{ t('consign.th.code') }} / {{ t('consign.th.qty') }}
{{ it.code }}
{{ it.name }}
{{ t('consign.addItem') }}
{{ t('consign.newIssue') }}
{{ t('consign.issueHint') }}
✓ {{ t('consign.th.wh') }}: {{ issueForm.wh_cust_code }} · {{ issueForm.wh_cust_name }}
✓ {{ t('consign.th.reqCust') }}: {{ issueForm.req_cust_code }} · {{ issueForm.req_cust_name }}
{{ t('consign.th.code') }} / {{ t('consign.th.qty') }}
{{ it.code }}
{{ it.name }}