自动化立体仓库 - WMS系统
lty
3 天以前 8e943b7104561c3b14cf223016698709c5ade4b5
#pda料箱组托和换码
15个文件已添加
6个文件已修改
906 ■■■■■ 已修改文件
cn_keys.txt 补丁 | 查看 | 原始文档 | blame | 历史
en_keys.txt 补丁 | 查看 | 原始文档 | blame | 历史
found_keys.txt 补丁 | 查看 | 原始文档 | blame | 历史
missing_cn.txt 补丁 | 查看 | 原始文档 | blame | 历史
missing_en.txt 补丁 | 查看 | 原始文档 | blame | 历史
scripts/add_missing_keys.ps1 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
scripts/find_missing_keys.ps1 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
scripts/mapping.json 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
scripts/update_i18n.ps1 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/ReplaceBarcodeParam.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkDetlMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkDetlService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkDetlMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/i18n/en.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/i18n/en/common.json 483 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/i18n/en/date.json 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/i18n/en/form.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/i18n/en/layer.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/i18n/en/table.json 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cn_keys.txt
Binary files differ
en_keys.txt
Binary files differ
found_keys.txt
Binary files differ
missing_cn.txt
Binary files differ
missing_en.txt
Binary files differ
scripts/add_missing_keys.ps1
New file
@@ -0,0 +1,101 @@
$javaFiles = Get-ChildItem -Path "src/main/java" -Recurse -Filter "*.java"
$foundKeys = @()
foreach ($file in $javaFiles) {
    $content = Get-Content $file.FullName
    $matches = [regex]::Matches($content, 'response\.[a-zA-Z0-9_]+')
    foreach ($match in $matches) {
        $foundKeys += $match.Value
    }
}
# Manually add keys mentioned by user or known to be missing from grep
$manualKeys = @("response.mat_list", "response.menu_list", "response.mat_delete", "response.mat_update", "response.user_detail")
$foundKeys += $manualKeys
$foundKeys = $foundKeys | Sort-Object | Get-Unique
# Exclude technical calls
$exclude = @("response.getOutputStream", "response.setContentType", "response.setCharacterEncoding", "response.setHeader", "response.sendRedirect", "response.getWriter", "response.addCookie", "response.setStatus", "response.reset", "response.isSuccessful", "response.getStatus")
$foundKeys = $foundKeys | Where-Object { $exclude -notcontains $_ }
$enPath = "src/main/webapp/static/i18n/en.json"
$cnPath = "src/main/webapp/static/i18n/zh-cn.json"
$mapPath = "scripts/mapping.json"
$enContent = Get-Content $enPath -Raw -Encoding UTF8
$cnContent = Get-Content $cnPath -Raw -Encoding UTF8
$mapContent = Get-Content $mapPath -Raw -Encoding UTF8 | ConvertFrom-Json
# Parse existing keys
$enKeys = [regex]::Matches($enContent, '"(response\.[^"]+)"') | ForEach-Object { $_.Groups[1].Value }
$cnKeys = [regex]::Matches($cnContent, '"(response\.[^"]+)"') | ForEach-Object { $_.Groups[1].Value }
$missingEn = $foundKeys | Where-Object { $enKeys -notcontains $_ }
$missingCn = $foundKeys | Where-Object { $cnKeys -notcontains $_ }
function Get-EnTrans($key) {
    $parts = $key.Replace("response.", "").Split("_")
    $text = $parts | ForEach-Object { $_.Substring(0,1).ToUpper() + $_.Substring(1) }
    return $text -join " "
}
function Get-CnTrans($key) {
    $keyRaw = $key.Replace("response.", "")
    $parts = $keyRaw.Split("_")
    $trans = ""
    foreach ($part in $parts) {
        $found = $false
        if ($mapContent -ne $null) {
            # Robust property check
            if ($mapContent.PSObject.Properties.Name -contains $part) {
                $trans += $mapContent.$part
                $found = $true
            }
        }
        if (-not $found) {
            if ($part.Length -gt 0) {
                 $trans += $part.Substring(0,1).ToUpper() + $part.Substring(1)
            }
        }
    }
    return $trans
}
# Add to EN
if ($missingEn.Count -gt 0) {
    $newEntries = @()
    foreach ($key in $missingEn) {
        $val = Get-EnTrans $key
        $newEntries += "    `"$key`": `"$val`""
    }
    $toAdd = "," + [Environment]::NewLine + ($newEntries -join "," + [Environment]::NewLine)
    $lastBraceIndex = $enContent.LastIndexOf("}")
    if ($lastBraceIndex -ge 0) {
        $enContent = $enContent.Substring(0, $lastBraceIndex) + $toAdd + [Environment]::NewLine + "}"
        Set-Content -Path $enPath -Value $enContent -Encoding UTF8
        Write-Host "Added $($missingEn.Count) keys to en.json"
    }
} else {
    Write-Host "No missing keys in EN"
}
# Add to CN
if ($missingCn.Count -gt 0) {
    $newEntries = @()
    foreach ($key in $missingCn) {
        $val = Get-CnTrans $key
        $newEntries += "    `"$key`": `"$val`""
    }
    $toAdd = "," + [Environment]::NewLine + ($newEntries -join "," + [Environment]::NewLine)
    $lastBraceIndex = $cnContent.LastIndexOf("}")
    if ($lastBraceIndex -ge 0) {
        $cnContent = $cnContent.Substring(0, $lastBraceIndex) + $toAdd + [Environment]::NewLine + "}"
        Set-Content -Path $cnPath -Value $cnContent -Encoding UTF8
        Write-Host "Added $($missingCn.Count) keys to zh-cn.json"
    }
} else {
    Write-Host "No missing keys in CN"
}
scripts/find_missing_keys.ps1
New file
@@ -0,0 +1,28 @@
$javaFiles = Get-ChildItem -Path "src/main/java" -Recurse -Filter "*.java"
$foundKeys = @()
foreach ($file in $javaFiles) {
    $content = Get-Content $file.FullName
    $matches = [regex]::Matches($content, 'response\.[a-zA-Z0-9_]+')
    foreach ($match in $matches) {
        $foundKeys += $match.Value
    }
}
$foundKeys = $foundKeys | Sort-Object | Get-Unique
# Exclude technical calls like response.getOutputStream, response.setContentType, etc.
$exclude = @("response.getOutputStream", "response.setContentType", "response.setCharacterEncoding", "response.setHeader", "response.sendRedirect", "response.getWriter", "response.addCookie", "response.setStatus", "response.reset")
$foundKeys = $foundKeys | Where-Object { $exclude -notcontains $_ }
$enContent = Get-Content "src/main/webapp/static/i18n/en.json" -Raw
$enKeys = [regex]::Matches($enContent, '"(response\.[^"]+)"') | ForEach-Object { $_.Groups[1].Value }
$cnContent = Get-Content "src/main/webapp/static/i18n/zh-cn.json" -Raw
$cnKeys = [regex]::Matches($cnContent, '"(response\.[^"]+)"') | ForEach-Object { $_.Groups[1].Value }
$missingEn = $foundKeys | Where-Object { $enKeys -notcontains $_ }
$missingCn = $foundKeys | Where-Object { $cnKeys -notcontains $_ }
Write-Output "Missing in EN:"
$missingEn
Write-Output "Missing in CN:"
$missingCn
scripts/mapping.json
New file
@@ -0,0 +1,37 @@
{
    "add": "新增", "delete": "删除", "update": "修改", "edit": "编辑",
    "list": "列表", "export": "导出", "detail": "详情", "query": "查询",
    "import": "导入", "success": "成功", "failed": "失败", "error": "错误",
    "mat": "物料", "user": "用户", "role": "角色", "menu": "菜单",
    "dept": "部门", "area": "库区", "loc": "库位", "node": "货位",
    "order": "单据", "task": "任务", "work": "作业", "log": "日志",
    "station": "站台", "zone": "库区", "warehouse": "仓库", "whs": "仓库",
    "stock": "库存", "inbound": "入库", "outbound": "出库", "print": "打印",
    "check": "盘点", "audit": "审核", "cancel": "取消", "close": "关闭",
    "enable": "启用", "disable": "禁用", "pda": "PDA", "search": "搜索",
    "find": "查找", "count": "数量", "param": "参数", "exists": "已存在",
    "empty": "为空", "required": "必填", "permission": "权限", "auth": "认证",
    "login": "登录", "logout": "登出", "password": "密码", "reset": "重置",
    "group": "组", "type": "类型", "status": "状态", "history": "历史",
    "config": "配置", "system": "系统", "data": "数据", "file": "文件",
    "download": "下载", "upload": "上传", "template": "模板", "preview": "预览",
    "start": "启动", "stop": "停止", "pause": "暂停", "resume": "恢复",
    "finish": "完成", "submit": "提交", "reject": "拒绝", "approve": "通过",
    "batch": "批量", "all": "全部", "info": "信息", "msg": "消息",
    "code": "编码", "name": "名称", "desc": "描述", "memo": "备注",
    "tree": "树", "chart": "图表", "report": "报表", "home": "首页",
    "main": "主", "sub": "子", "parent": "父", "child": "子",
    "init": "初始化", "sync": "同步", "refresh": "刷新", "load": "加载",
    "save": "保存", "create": "创建", "remove": "移除", "clear": "清空",
    "select": "选择", "confirm": "确认", "cancel": "取消", "ok": "确定",
    "yes": "是", "no": "否", "true": "真", "false": "假",
    "wrk": "作业", "mast": "主档", "detl": "明细", "execute": "执行",
    "lastno": "流水号", "stk": "库存", "plcm": "位置", "crn": "堆垛机",
    "devp": "设备", "dev": "设备", "err": "异常", "opt": "操作",
    "plc": "PLC", "wcs": "WCS", "wms": "WMS", "mes": "MES",
    "sap": "SAP", "erp": "ERP", "agv": "AGV", "rgv": "RGV",
    "led": "LED", "rfid": "RFID", "barcode": "条码", "qrcode": "二维码",
    "label": "标签", "print": "打印", "scan": "扫描", "read": "读取",
    "write": "写入", "open": "打开", "close": "关闭", "connect": "连接",
    "disconnect": "断开", "send": "发送", "receive": "接收", "request": "请求"
}
scripts/update_i18n.ps1
New file
@@ -0,0 +1,146 @@
# Set encoding to UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
# Paths
$root = "f:\workFile\2026.1.12yuedan\zy-asrs"
$enPath = "$root\src\main\webapp\static\i18n\en.json"
$cnPath = "$root\src\main\webapp\static\i18n\zh-cn.json"
$mapPath = "$root\scripts\mapping.json"
$javaPath = "$root\src\main\java"
# 1. Load Mapping
if (Test-Path $mapPath) {
    $mapContent = Get-Content $mapPath -Raw -Encoding UTF8 | ConvertFrom-Json
} else {
    Write-Host "Mapping file not found!"
    $mapContent = $null
}
# 2. Scan Java Files for keys
Write-Host "Scanning Java files..."
$javaFiles = Get-ChildItem -Path $javaPath -Recurse -Filter "*.java"
$foundKeys = @()
foreach ($file in $javaFiles) {
    $content = Get-Content $file.FullName
    # Regex to capture response.xxx
    # Matches response. followed by letters, numbers, underscores, dots
    $matches = [regex]::Matches($content, 'response\.[a-zA-Z0-9_]+')
    foreach ($match in $matches) {
        $foundKeys += $match.Value
    }
}
# Manual keys mentioned by user
$manualKeys = @("response.mat_list", "response.menu_list", "response.mat_delete", "response.mat_update", "response.user_detail")
$foundKeys += $manualKeys
# Unique and Sort
$foundKeys = $foundKeys | Sort-Object | Get-Unique
# Exclude technical calls (heuristic)
$exclude = @("response.getOutputStream", "response.setContentType", "response.setCharacterEncoding", "response.setHeader", "response.sendRedirect", "response.getWriter", "response.addCookie", "response.setStatus", "response.reset", "response.isSuccessful", "response.getStatus", "response.put")
$foundKeys = $foundKeys | Where-Object { $exclude -notcontains $_ }
Write-Host "Found $($foundKeys.Count) unique 'response.*' keys."
# Helper Functions
function Get-EnTrans($key) {
    $parts = $key.Replace("response.", "").Split("_")
    $text = $parts | ForEach-Object { $_.Substring(0,1).ToUpper() + $_.Substring(1) }
    return $text -join " "
}
function Get-CnTrans($key) {
    $keyRaw = $key.Replace("response.", "")
    $parts = $keyRaw.Split("_")
    $trans = ""
    foreach ($part in $parts) {
        $found = $false
        if ($mapContent -ne $null) {
            if ($mapContent.PSObject.Properties.Name -contains $part) {
                $trans += $mapContent.$part
                $found = $true
            }
        }
        if (-not $found) {
             if ($part.Length -gt 0) {
                 # Fallback: capitalize
                 # Or maybe leave as English if no mapping?
                 # User wants Chinese, but better English than nothing.
                 # But we try to map.
                 # If valid mapping is missing, we might want to flag it?
                 # For now, just Capitalize
                 $trans += $part.Substring(0,1).ToUpper() + $part.Substring(1)
             }
        }
    }
    return $trans
}
function Process-JsonFile($path, $lang) {
    Write-Host "Processing $path ..."
    $jsonContent = Get-Content $path -Raw -Encoding UTF8 | ConvertFrom-Json
    # Convert to hashtable for easier manipulation if possible,
    # but ConvertFrom-Json returns PSCustomObject.
    # We will build a new Ordered Dictionary to store results.
    $newDict = [Ordered]@{}
    # Copy existing keys
    foreach ($prop in $jsonContent.PSObject.Properties) {
        $newDict[$prop.Name] = $prop.Value
    }
    # Update/Add keys
    $addedCount = 0
    $updatedCount = 0
    foreach ($key in $foundKeys) {
        $val = ""
        if ($lang -eq "en") {
            $val = Get-EnTrans $key
        } else {
            $val = Get-CnTrans $key
        }
        if ($newDict.Contains($key)) {
            # Check if empty
            if ([string]::IsNullOrEmpty($newDict[$key])) {
                $newDict[$key] = $val
                $updatedCount++
                Write-Host "  Updated empty key: $key -> $val"
            }
        } else {
            # Add new
            $newDict[$key] = $val
            $addedCount++
            Write-Host "  Added new key: $key -> $val"
        }
    }
    Write-Host "  Added: $addedCount, Updated: $updatedCount"
    # Sort keys
    $sortedDict = [Ordered]@{}
    $keys = $newDict.Keys | Sort-Object
    foreach ($k in $keys) {
        $sortedDict[$k] = $newDict[$k]
    }
    # Convert back to JSON
    $jsonOutput = $sortedDict | ConvertTo-Json -Depth 100
    # Unescape Unicode
    $jsonOutput = [regex]::Replace($jsonOutput, "\\u([0-9a-fA-F]{4})", { param($m) [char][int]::Parse($m.Groups[1].Value, [System.Globalization.NumberStyles]::HexNumber) })
    # Save
    $jsonOutput | Set-Content -Path $path -Encoding UTF8
}
Process-JsonFile $enPath "en"
Process-JsonFile $cnPath "cn"
Write-Host "Done."
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -160,6 +160,40 @@
        return R.ok("response.comb_success");
    }
    @RequestMapping("/cartonScanReplace/auth")
    @ManagerAuth(memo = "response.carton_scan")
    public R cartonScanReplace(@RequestBody ScanParam scanParam){
        List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("barcode",scanParam.getCartonLabel()));
        if (wrkDetls.isEmpty()) {
            return R.error("response.no_data");
        }
        WrkDetl wrkDetl = wrkDetls.get(0);
        return R.ok("response.scan_success").add(wrkDetl);
    }
    @RequestMapping("/labelReplace/auth")
    @ManagerAuth(memo = "response.carton_scan_save")
    public R cartonScanReplaceSave(@RequestBody ReplaceBarcodeParam replaceBarcodeParam) {
        if (replaceBarcodeParam == null || Cools.isEmpty(replaceBarcodeParam.getReplaceParam())) {
            return R.error("PARAM IS NULL");
        }
        for (ReplaceBarcodeParam.CombinedData param : replaceBarcodeParam.getReplaceParam()) {
            WrkDetl wrkDetl = wrkDetlService.selectOne(
                    new EntityWrapper<WrkDetl>()
                            .eq("order_no", param.getOrderNo())
                            .eq("barcode", param.getBarcode())
            );
            if (wrkDetl == null) {
                return R.error("DETL IS NULL, barcode=" + param.getBarcode());
            }
            if (!wrkDetlService.updateBuyerLabel(param.getOrderNo(), param.getBuyerLabelBarcode(),param.getBarcode())) {
                return R.error("Failed to update, barcode=" + param.getBarcode());
            }
        }
        return R.ok("response.replace_success");
    }
    @RequestMapping("/cartonScan/auth")
    @ManagerAuth(memo = "response.carton_scan")
    public R cartonScan(@RequestBody ScanParam scanParam){
src/main/java/com/zy/asrs/entity/param/ReplaceBarcodeParam.java
New file
@@ -0,0 +1,22 @@
package com.zy.asrs.entity.param;
import com.zy.common.model.LocDto;
import lombok.Data;
import java.util.List;
@Data
public class ReplaceBarcodeParam {
    private List<CombinedData> replaceParam;
    @Data
    public static class CombinedData {
        private String barcode;            // 内部箱条码
        private Double qty;
        private Double ctn;
        private String orderNo;
        private String buyerLabelBarcode;  // 客户标签
    }
}
src/main/java/com/zy/asrs/mapper/WrkDetlMapper.java
@@ -26,6 +26,7 @@
    List<WrkDetl> selectAndLogByOrderNo(String orderNo);
    int updateBuyerLabel(@Param("orderNo")String orderNo, @Param("buyerLabel")String buyerLabel,@Param("barcode")String barcode);
    int updateInspect( @Param("wrkNo")Integer wrkNo, @Param("matnr")String matnr, @Param("batch")String batch);
    List<WrkDetl> selectPakoutQuery(@Param("staNo")Integer staNo, @Param("matnr")String matnr);
src/main/java/com/zy/asrs/service/WrkDetlService.java
@@ -19,6 +19,7 @@
    boolean updateAnfme(Double anfme, Integer wrkNo, String matnr, String batch);
    boolean updateAnfme(Double anfme, Integer wrkNo, String matnr, String batch,String barcode);
    boolean updateBuyerLabel(String orderNo,String buyerLabel,String barcode);
    List<WrkDetl> selectAndLogByOrderNo(String orderNo);
    List<WrkDetl> findByBarcode(String barcode);
src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java
@@ -9,6 +9,7 @@
import com.zy.asrs.service.MatService;
import com.zy.asrs.service.WrkDetlService;
import com.zy.common.model.DetlDto;
import com.zy.common.utils.HttpHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -78,6 +79,10 @@
            return baseMapper.updateAnfme(anfme, wrkNo, matnr, batch,barcode) > 0;
        }
    }
    @Override
    public  boolean updateBuyerLabel(String orderNo,String buyerLabel,String barcode){
        return this.baseMapper.updateBuyerLabel(orderNo, buyerLabel,barcode) > 0;
    }
    @Override
    public List<WrkDetl> selectAndLogByOrderNo(String orderNo) {
src/main/resources/mapper/WrkDetlMapper.xml
@@ -88,6 +88,12 @@
        and matnr = #{matnr}
        <include refid="batchSeq"></include>
    </update>
    <update id="updateBuyerLabel">
        update asr_wrk_detl
        set memo = #{buyerLabel}
        where order_no = #{orderNo}
        and barcode = #{barcode}
    </update>
    <select id="selectAndLogByOrderNo" resultMap="BaseResultMap">
        select * from asr_wrk_detl where order_no = #{orderNo}
src/main/webapp/static/i18n/en.json
@@ -579,6 +579,7 @@
    "response.code_or_name_exists":  "Code or name already exists",
    "response.comb_success":  "Comb Success",
    "response.scan_success":  "Scan Success",
    "response.replace_success":  "Replace Success",
    "response.confirm_complete":  "Confirm Complete",
    "response.confirm_picking_outbound_failed":  "Confirm Picking Outbound Failed",
    "response.crane_add":  "Crane Add",
src/main/webapp/static/i18n/en/common.json
New file
@@ -0,0 +1,483 @@
{
    "status_desc": "Status Description",
    "wrk_status_0": "0.Pending Receive",
    "wrk_status_1": "1.Received",
    "wrk_status_2": "2.Task Started",
    "wrk_status_3": "3.Pickup Completed",
    "wrk_status_4": "4.Inbound Completed",
    "wrk_status_5": "5.Inventory Updated",
    "wrk_status_6": "6.Task Interrupted",
    "wrk_status_7": "7.Drop-off Completed",
    "wrk_status_11": "11.Outbound ID Generated",
    "wrk_status_12": "12.Crane Outbound In Progress",
    "wrk_status_13": "13.Crane Empty Outbound Error",
    "wrk_status_14": "14.Outbound Unconfirmed",
    "wrk_status_15": "15.Outbound Update Completed",
    "display_mode": "Display Mode",
    "view_by_row": "View by Row",
    "view_by_layer": "View by Layer",
    "enable_selection": "Enable Selection",
    "disable_selection": "Disable Selection",
    "assign_zone": "Assign Zone",
    "zone_legend": "Zone Legend",
    "selection_mode_tip": "Selection mode enabled, please drag to select on the location map",
    "please_select_zone": "Please select a zone",
    "zone_color": "Zone Color",
    "assign_zone_and_color": "Assign Zone and Color",
    "confirm": "Confirm",
    "cancel": "Cancel",
    "cancel_selection": "Cancel Selection",
    "assign_success": "Assignment successful",
    "operation_failed": "Operation failed",
    "fetch_zone_list_failed": "Failed to fetch zone list",
    "modify_zone_color": "Modify Zone Color",
    "zone_name": "Zone Name",
    "select_color": "Select Color",
    "save": "Save",
    "color_updated": "Color updated",
    "update_failed": "Update failed",
    "load_failed": "Load failed",
    "language": "Language",
    "license_validity_prefix": "Temporary license valid for: ",
    "license_validity_suffix": " days",
    "basic_info": "Basic Information",
    "logout": "Log Out",
    "home": "Home",
    "_comment_home": "Home Tab Bar",
    "主页": "Home",
    "控制台": "Dashboard",
    "分析页": "Analytics",
    "库位热点图": "Location Heatmap",
    "基础数据": "Master Data",
    "商品档案": "Item Master",
    "工作状态": "Task Status",
    "入出库类型": "Transaction Types",
    "库位状态": "Location Status",
    "库位类型管理": "LocType Management",
    "工作序号查询": "Task Number Query",
    "库位排号分配": "Location Slot Query",
    "归类管理": "Category Management",
    "库区管理": "Zone Management",
    "路径站点设置": "Path & Station Setup",
    "库存管理": "Inventory Management",
    "库位查询": "Location Inquiry",
    "库存明细管理": "Inventory Detail",
    "库存调整": "Inventory Adjustment",
    "库存明细统计": "Inventory Summary",
    "入出库作业": "Out & In Operations",
    "入库作业": "Inbound Operations",
    "出库作业": "Outbound Operations",
    "盘点出库": "Cycle Count Outbound",
    "库位移转": "Location Transfer",
    "空板出库": "Empty Pallet Outbound",
    "工作档管理": "Work Orders",
    "工作档查询维护": "Work Order Query",
    "工作档明细查询": "Work Order Details",
    "工作历史档查询": "Work Order History",
    "工作明细历史档查询": "Work Order Detail History",
    "work_order_detail_history": "Work Order Detail History",
    "入库通知档": "Inbound Notice",
    "入库通知历史档": "Inbound Notice History",
    "订单系统": "Order System",
    "单据管理": "Order Management",
    "订单出库": "Order Outbound",
    "订单状态": "Order Status",
    "单据类型": "Order Types",
    "设备维护": "Equipment Maintenance",
    "库位管理": "Location Management",
    "站点管理": "Station Management",
    "日志统计": "Logs & Stats",
    "库存调整记录": "Inventory Adjustments",
    "三方接口统计": "3rd-Party API Logs",
    "异常工作档": "Exception Work Orders",
    "库位使用率统计": "Location Utilization",
    "库存在库时间统计": "Inventory Age",
    "日入出库次数统计": "Daily Transactions",
    "日入库明细查询": "Inbound Details",
    "日出库明细查询": "Outbound Details",
    "工作档维护日志": "Work Maintenance Log",
    "开发专用": "Developer Tools",
    "菜单列表": "Menu List",
    "权限控制": "Permission Control",
    "接口文档": "API Documentation",
    "凭证记录": "Credential Records",
    "系统配置": "System Configuration",
    "系统管理": "System Management",
    "系统用户": "System Users",
    "角色管理": "Role Management",
    "操作日志": "Operation Log",
    "个人设置": "Personal Settings",
    "基本资料": "Basic Information",
    "可视化": "Visualization",
    "侧边伸缩": "Toggle Side",
    "刷新": "Refresh",
    "全屏": "Full Screen",
    "主题": "Theme",
    "关闭当前": "Close Current",
    "关闭其他": "Close Others",
    "关闭所有": "Close All",
    "关闭当前标签页": "Close Current Tab",
    "关闭其他标签页": "Close Other Tabs",
    "关闭所有标签页": "Close All Tabs",
    "主页不能关闭": "Home page cannot be closed",
    "首页": "Home Page",
    "库存滞留时间统计表": "Stock Retention Time Statistics",
    "库位使用比例": "Location Usage Ratio",
    "库位占比": "Location Percentage",
    "日入出库数量": "Daily In/Out Quantity",
    "入_出库数量": "In/Out Quantity",
    "仓储管理系统": "WMS",
    "请选择您要使用的模块": "Please select the module you want to use",
    "运行任务": "Running Tasks",
    "库存明细": "Inventory Details",
    "_comment_common": "Common Table Columns",
    "商品编号_品号": "Item No.",
    "商品名称_品名": "Item Name",
    "规格": "Spec",
    "代码": "Code",
    "颜色": "Color",
    "品牌": "Brand",
    "单位": "Unit",
    "单价": "Price",
    "sku": "SKU",
    "单位量": "Unit Qty",
    "条码": "Barcode",
    "产地": "Origin",
    "厂家": "Manufacturer",
    "生产日期": "Mfg Date",
    "品项数": "Item Count",
    "安全库存量": "Safety Stock",
    "单箱净重": "Net Weight/Box",
    "单箱毛重": "Gross Weight/Box",
    "单箱体积": "Volume/Box",
    "箱子尺寸": "Box Size",
    "供应商": "Supplier",
    "供应商编码": "Supplier Code",
    "是否批次": "Batch Managed",
    "保质期": "Shelf Life",
    "预警天数": "Warning Days",
    "制购": "Make/Buy",
    "要求检验": "Inspection Reqd",
    "危险品": "Hazardous",
    "修改人员": "Updated By",
    "修改时间": "Updated Time",
    "备注": "Remark",
    "单据编号": "Order No.",
    "批号": "Batch No.",
    "数量": "Quantity",
    "托盘条码": "Pallet Barcode",
    "入库时间": "Inbound Time",
    "滞留天数": "Retention Days",
    "库位号": "Location No.",
    "托盘码": "Pallet Code",
    "商品编号": "Item No.",
    "商品名称": "Item Name",
    "请输入": "Please enter",
    "搜索": "Search",
    "重置": "Reset",
    "导出": "Export",
    "详情": "Detail",
    "库龄_天": "Age(Days)",
    "no_data": "No Data",
    "start_end_time": "Start / End Time",
    "add": "Add",
    "delete": "Delete",
    "edit": "Edit",
    "data_status": "Data Status",
    "normal": "Normal",
    "status_disabled": "Disabled",
    "locked": "Locked",
    "io_status": "Transaction Status",
    "inbound": "Inbound",
    "pending_inbound": "Pending Inbound",
    "confirm_generate_task": "Confirm Task Generation",
    "select_one_data": "Select One Record",
    "confirm_delete_data": "Confirm Delete Record",
    "confirm_delete_prefix": "Are you sure to delete ",
    "confirm_delete_suffix": " record(s)?",
    "this": "this",
    "account": "Account",
    "username": "Username",
    "password": "Password",
    "role": "Role",
    "age_days": "Inventory Age(Days)",
    "product_name": "Item Name",
    "order_no": "Order No.",
    "batch_no": "Batch No.",
    "unit_qty": "Unit Qty",
    "spec": "Spec",
    "code": "Code",
    "color": "Color",
    "brand": "Brand",
    "origin": "Origin",
    "manufacturer": "Manufacturer",
    "mfg_date": "Mfg Date",
    "item_count": "Item Count",
    "safety_stock": "Safety Stock",
    "net_weight_box": "Net Weight/Box",
    "gross_weight_box": "Gross Weight/Box",
    "volume_box": "Volume/Box",
    "box_size": "Box Size",
    "supplier": "Supplier",
    "supplier_code": "Supplier Code",
    "batch_managed": "Batch Managed",
    "shelf_life": "Shelf Life",
    "warning_days": "Warning Days",
    "make_buy": "Make/Buy",
    "inspection_reqd": "Inspection Reqd",
    "hazardous": "Hazardous",
    "confirm_export_excel": "Confirm Export to Excel",
    "no_data_found": "No Data Found",
    "creator_detail": "Creator Details",
    "modifier_detail": "Modifier Details",
    "please_select_data": "please select data",
    "pallet_barcode": "Pallet Code",
    "product_code": "Item No.",
    "location_no": "Location No.",
    "search": "search",
    "reset": "reset",
    "export": "export",
    "exporting": "Exporting...",
    "detail": "Detail",
    "modifier": "Modifier",
    "modify_time": "Modify Time",
    "prompt": "Prompt",
    "info": "Info",
    "id": "ID",
    "material": "Material",
    "material_desc": "Material Desc",
    "status": "Status",
    "remark": "Remark",
    "add_time": "Add Time",
    "creator": "Creator",
    "close": "Close",
    "modify": "Modify",
    "warm_prompt_prefix": "Warm Prompt: Please fill in the information carefully, ",
    "warm_prompt_suffix": "is mandatory.",
    "total_prefix": "Total ",
    "total_suffix": " items",
    "jump_to": "Go to ",
    "page": " page",
    "items_per_page": " items/page",
    "running": "Running",
    "pending": "Pending",
    "inbound_notice_no": "Inbound Notice No",
    "input_placeholder": "Please input...",
    "work_time": "Work Time",
    "barcode": "Barcode",
    "work_no": "Work No",
    "work_status": "Work Status",
    "crane_no": "Crane No",
    "crane": "Crane",
    "increase_priority": "Increase Priority",
    "decrease_priority": "Decrease Priority",
    "pre_existing": "Pre-Existing",
    "empty_op": "Empty Op",
    "pick": "Pick",
    "count": "Count",
    "complete": "Complete",
    "cancel": "Cancel",
    "transaction_type": "Transaction Type",
    "priority": "Priority",
    "source_station": "Source Station",
    "target_station": "Target Station",
    "source_location": "Source Location",
    "target_location": "Target Location",
    "picking": "Picking",
    "exit": "Exit",
    "warehouse_no": "Warehouse No",
    "transfer_req_no": "Transfer Req No",
    "item_no": "Item No",
    "material_label_id": "Material Label ID",
    "factory": "Factory",
    "quantity": "Quantity",
    "unit": "Unit",
    "user_id": "User ID",
    "empty_pallet": "Empty Pallet",
    "work_time": "Work Time",
    "crane_start_time": "Crane Start Time",
    "crane_end_time": "Crane End Time",
    "picking_time": "Picking Time",
    "full_pallet": "Full Pallet",
    "operation": "Operation",
    "current_workflow_detail": "Material details for current workflow",
    "confirm_cancel_work_order": "Confirm cancel this work order?",
    "confirm_complete_work_order": "Confirm complete this work order?",
    "confirm_pick_work_order": "Pick inbound this work order?",
    "confirm_pre_existing_exception": "Pre-existing exception occurred. To re-inbound, ensure cargo is at crane outbound station!",
    "confirm_cancel_erp_order": "Current task linked to ERP sales order. Cancellation will regenerate outbound task. Continue?",
    "confirm_export": "Confirm export to Excel?",
    "confirm_empty_op_exception": "Empty operation exception! Continue?",
    "work_order_detail": "Work Order Detail",
    "location_type": "Location Type",
    "row": "Row",
    "bay": "Bay",
    "level": "Level",
    "group": "Group",
    "init": "Init",
    "please_enter_password_reset_location": "Please enter password to reset location",
    "init_location": "Initialize Location",
    "password_error": "Password Error",
    "location_detail": "Location Detail",
    "modify_detail": "Modification Detail",
    "create_detail": "Creation Detail",
    "high_low_type": "High/Low Type",
    "width_type": "Width Type",
    "weight_type": "Weight Type",
    "delete_location": "Delete Location",
    "delete_keep": "Delete|Keep",
    "start_end_row": "Start/End Row",
    "start_end_bay": "Start/End Bay",
    "start_end_level": "Start/End Level",
    "crane_amount": "Crane Amount",
    "start_crane": "Start Crane",
    "low_location": "Low Location",
    "high_location": "High Location",
    "middle_location": "Middle Location",
    "narrow_location": "Narrow Location",
    "wide_location": "Wide Location",
    "light_location": "Light Location",
    "heavy_location": "Heavy Location",
    "unknown": "Unknown",
    "standard_crane_whs": "Standard Crane Whs",
    "flat_whs": "Flat Whs",
    "shuttle_board": "Shuttle Board",
    "four_way_vehicle": "Four-way Vehicle",
    "agv": "AGV",
    "warm_prompt_clear_inventory": "Warm Prompt: Clearing inventory when modifying to empty location",
    "禁用库位": "Disabled Location",
    "在库库位": "Occupied Location",
    "空库位": "Empty Location",
    "使用库位": "Used Location",
    "入库数量": "Inbound Quantity",
    "出库数量": "Outbound Quantity",
    "classification": "Type",
    "stock_upper_limit": "Stock Max",
    "stock_lower_limit": "Stock Min",
    "stock_age_upper_limit_days": "Max Stock Age (Days)",
    "area": "Area",
    "please_select_print_data": "Please select data to print",
    "batch_print_count": "Batch Print [Count: {{count}}]",
    "category_cannot_be_empty": "Category cannot be empty",
    "confirm_sync_file": "Confirm sync file [{{filename}}]?",
    "template_1": "Template 1",
    "template_2": "Template 2",
    "template_3": "Template 3",
    "print_preview": "Print Preview",
    "please_input_item_no": "Enter Item No.",
    "please_input_item_name": "Enter Item Name",
    "please_input_item_spec": "Enter Item Spec",
    "batch_print": "Batch Print",
    "print": "Print",
    "select_template": "Select Template",
    "item": "Item",
    "item_code": "Item Code",
    "item_name": "Item Name",
    "item_spec": "Item Spec",
    "data_sync": "Sync Data",
    "io_type_code": "Transaction Type Code",
    "io_type_desc": "Transaction Type Description",
    "io_type_1": "1.Inbound",
    "io_type_3": "3.Station to Station",
    "io_type_6": "6.Exit on Device",
    "io_type_10": "10.Empty Pallet Inbound",
    "io_type_11": "11.Bin Transfer",
    "io_type_53": "53.Picking Re-inbound",
    "io_type_54": "54.Merge Re-inbound",
    "io_type_57": "57.Cycle Count Re-inbound",
    "io_type_101": "101.Outbound",
    "io_type_103": "103.Picking Outbound",
    "io_type_104": "104.Merge Outbound",
    "io_type_107": "107.Cycle Count Outbound",
    "io_type_110": "110.Empty Pallet Outbound",
    "loc_status_code": "Location Status Code",
    "loc_status_desc": "Location Status Description",
    "location_status": "Location Status",
    "loc_status_D": "D.Empty Bin/Pallet",
    "loc_status_F": "F.In Stock",
    "loc_status_G": "G.Aisle",
    "loc_status_O": "O.Empty Location",
    "loc_status_P": "P.Picking/Counting/Merging Outbound",
    "loc_status_Q": "Q.Picking/Counting/Merging Re-inbound",
    "loc_status_R": "R.Outbound Reserved",
    "loc_status_S": "S.Inbound Reserved",
    "loc_status_X": "X.Disabled",
    "loc_status_Y": "Y.Merged",
    "parent_menu": "Parent Menu",
    "category": "Category",
    "please_input_net_weight_box": "Please input net weight/box",
    "please_input_gross_weight_box": "Please input gross weight/box",
    "please_input_remark": "Please input remark",
    "please_select_type": "Please Select Type",
    "other": "Other",
    "responsible_person": "Owner",
    "please_enter_responsible_person": "Please enter Owner",
    "classification_name": "Category Name",
    "please_enter_classification_name": "Please enter Category Name",
    "sort": "Sort",
    "please_enter_sort": "Please enter sort",
    "memo": "Memo",
    "please_enter_memo": "Please enter memo",
    "type": "Type",
    "name": "Name",
    "image": "Image",
    "confirm_delete_selected_data": "Are you sure you want to delete the selected data?",
    "extract_item": "Extract Item",
    "extract_inventory": "Extract Inventory",
    "check_station": "Check Station:",
    "please_select_station": "Please select station",
    "check_outbound": "Check Outbound",
    "please_add_check_inventory_first": "Please add check inventory first",
    "requesting": "Requesting...",
    "inbound_station": "Inbound Station:",
    "please_select_station": "Please Select Station",
    "start_inbound": "Start Inbound",
    "remove": "Remove",
    "quantity_required": "Quantity (Required)",
    "batch_optional": "Batch (Optional)",
    "operation": "Operation",
    "please_enter_number": "Please enter a number",
    "quantity_must_be_greater_than_zero": "Quantity must be greater than zero",
    "please_extract_item_first": "Please extract item first",
    "please_select_inbound_station": "Please select inbound station",
    "inbound_started_success_target_loc": "Inbound started successfully, target location: ",
    "requesting": "Requesting...",
    "select_item": "Select Item",
    "search_bar": "Search Bar",
    "confirm_extract": "Extract",
    "please_input_search_condition": "Please input search condition",
    "empty_pallet_inbound_station": "Empty Pallet Inbound Station",
    "empty_pallet_outbound_station": "Empty Pallet Outbound Station:",
    "please_select_outbound_station": "Please select outbound station",
    "start_outbound": "Start Outbound",
    "extract": "Extract",
    "extract_inventory_item": "Extract Inventory Item",
    "target_empty_location": "Target Empty Location",
    "location_transfer": "Location Transfer",
    "please_enter_source_location": "Please enter source location",
    "please_select_target_location": "Please select target location",
    "please_enter_and_select": "Please enter and select",
    "please_retrieve_location_first": "Please retrieve location first",
    "current_retrieve_location": "Current location",
    "add_inventory": "Add Inventory",
    "adjust_inventory": "Adjust Inventory",
    "actual_quantity": "Actual Qty",
    "batch_edit": "Batch (Edit)",
    "please_add_detail_first": "Please add detail first",
    "quantity_cannot_be_less_than_zero": "Quantity cannot be less than zero",
    "confirm_adjust_location_detail": "Are you sure to adjust details for location?",
    "please_enter_valid_location_no": "Please enter valid location no",
    "outbound_station": "Outbound Station:",
    "outbound_quantity": "Outbound Qty",
    "inventory_quantity": "Inventory Qty",
    "outbound_qty_cannot_exceed_inventory_qty": "Outbound qty cannot exceed inventory qty",
    "please_extract_inventory_item_first": "Please extract inventory item first",
    "code": { "copy": "Copy Code", "copied": "Copied", "copyError": "Copy Failed", "maximize": "Maximize", "restore": "Restore", "preview": "Preview" },
    "colorpicker": { "clear": "Clear", "confirm": "OK" },
    "dropdown": { "noData": "No Data" },
    "flow": { "loadMore": "Load More", "noMore": "No More" },
    "transfer": { "noData": "No Data", "noMatch": "No Match", "title": ["List 1", "List 2"], "searchPlaceholder": "Search" },
    "tree": { "defaultNodeName": "Unnamed", "noData": "No Data", "deleteNodePrompt": "Delete node \"{name}\"?" },
    "upload": { "fileType": { "file": "File", "image": "Image", "video": "Video", "audio": "Audio" }, "validateMessages": { "fileExtensionError": "{fileType} format not supported", "filesOverLengthLimit": "Max {length} files", "currentFilesLength": "Selected {length} files", "fileOverSizeLimit": "Max size {size}" }, "chooseText": "{length} files" },
    "util": { "timeAgo": { "days": "{days} days ago", "hours": "{hours} hours ago", "minutes": "{minutes} mins ago", "future": "Future", "justNow": "Just now" }, "toDateString": { "meridiem": "AM/PM" } }
}
src/main/webapp/static/i18n/en/date.json
New file
@@ -0,0 +1,16 @@
{
  "months": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  "weeks": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
  "time": ["Hr", "Min", "Sec"],
  "literal": { "year": "Year" },
  "selectDate": "Select Date",
  "selectTime": "Select Time",
  "startTime": "Start Time",
  "endTime": "End Time",
  "tools": { "confirm": "OK", "clear": "Clear", "now": "Now", "reset": "Reset" },
  "rangeOrderPrompt": "End time cannot be earlier than start time",
  "invalidDatePrompt": "Invalid date or time",
  "formatErrorPrompt": "Date format error, must follow: {format}",
  "autoResetPrompt": "Auto reset",
  "preview": "Preview"
}
src/main/webapp/static/i18n/en/form.json
New file
@@ -0,0 +1,5 @@
{
  "select": { "noData": "No Data", "noMatch": "No Match", "placeholder": "Select" },
  "validateMessages": { "required": "Required", "phone": "Invalid Phone", "email": "Invalid Email", "url": "Invalid URL", "number": "Numbers Only", "date": "Invalid Date", "identity": "Invalid ID" },
  "verifyErrorPromptTitle": "Prompt"
}
src/main/webapp/static/i18n/en/layer.json
New file
@@ -0,0 +1,5 @@
{
  "confirm": "OK", "cancel": "Cancel", "defaultTitle": "Info",
  "prompt": { "InputLengthPrompt": "Max {length} chars" },
  "photos": { "noData": "No photos", "tools": { "rotate": "Rotate", "scaleX": "Flip H", "zoomIn": "Zoom In", "zoomOut": "Zoom Out", "reset": "Reset", "close": "Close" }, "viewPicture": "View Original", "urlError": { "prompt": "Image error, continue?", "confirm": "Next", "cancel": "Exit" } }
}
src/main/webapp/static/i18n/en/table.json
New file
@@ -0,0 +1,15 @@
{
  "sort": { "asc": "Ascending", "desc": "Descending" },
  "noData": "No Data",
  "tools": {
    "filter": { "title": "Filter Columns" },
    "export": { "title": "Export", "noDataPrompt": "No data", "compatPrompt": "IE not supported", "csvText": "Export CSV" },
    "print": { "title": "Print", "noDataPrompt": "No data" }
  },
  "dataFormatError": "Data format error",
  "xhrError": "Request error: {msg}",
  "laypage": {
     "prev": "Prev", "next": "Next", "first": "First", "last": "Last",
     "total": "Total {total}", "pagesize": "/page", "goto": "Go to", "page": "Page", "confirm": "OK"
  }
}