供应链PC实操落地实践|得物技术
目录
一、背景
二、实操模式
三、快捷码设计和使用
1. 快捷码布局
2. 快捷码的准确识别
3. 快捷码的高亮反馈
4. 快捷码打印和黏贴建议
四、问题复盘
1. 基准体验的梳理
五、实操环境检测
1. 实操环境的安装和配置
2. 实操环境检测能力的使用流程
3. 实操检测能力的技术架构
4. 实操环境的检查时机
5. 输入法的检测和自动修复
6. 统一打印组件
7. 软件更新
六、信息反馈及异常SOP
七、效率指标的定义、监控和分析
八、后续规划
一
背景
大部分云仓BPO没有平板电脑,无法直接使用得物既有的实操系统(Pink Flutter App); 打印机型号众多,打印指令无法统一,容易造成打印配置和打印效果不一致; 设备类型和配置的不一致,带来了更多的适配问题,很容易形成业务流程的卡点,影响开仓和实操的效率。
二
实操模式
三
快捷码设计和使用
快捷码布局
快捷码的准确识别
字符录入冲突。在一个连续的指令输入过程中,会禁用默认键入的内容,这样可以避免焦点处于输入框的同时扫描了快捷码,意外将快捷码字符录入到输入框中。 焦点冲突。由于实操系统同时支持键盘模式操作,可以通过Enter键模拟鼠标对按钮的点击;当焦点处于按钮上时扫描了快捷码,扫码枪输入的Enter会造成按钮意外触发点击。因此在识别到扫码内容为快捷指令类型时,会在短时间将按钮移除焦点,指令结束后再重新设置焦点。
(e: KeyboardEvent) => {const enterKey = e.key === "Enter";// @ 开头,开启一个新的快捷指令if (e.key === "@") {e.preventDefault();scaning.current = true;}// ...// 处理按钮输入锁定等兼容逻辑if (scaning.current && !enterKey) {activeCode.current += String(e.key);e.preventDefault();} else if (activeCode.current && enterKey) {scaning.current = false;// next// 快捷指令执行函数和标记高亮等}//...// 输入解锁等能力};
快捷码的高亮反馈
快捷码打印和黏贴建议
/*** 打印html片段*/export function printHTMLOutWithCSS(config: {content?: string;cssText?: string;}) {if (!config?.content) return;const cssText = config?.cssText;const iframeEle = document.createElement("iframe");iframeEle.style.display = "none";document.body.append(iframeEle);const iframeDoc =iframeEle?.contentDocument || iframeEle?.contentWindow?.document;if (iframeDoc?.body) {iframeDoc.body.innerHTML = `<style>${cssText || ""}</style>${config?.content}`;iframeEle?.contentWindow?.print();}document.body.removeChild(iframeEle);}printHTMLOutWithCSS({content: `${dom.outerHTML}<div class="qrcode-button-name">${config?.name || "-"}</div>`,cssText: STYLE_PRINT_STR,});
四
问题复盘
异常流程、逆向流程,无SOP。依赖经验和培训。如:订单被取消,后续的操作建议。 实操环境检测及自动化配置。如输入法检测、扫码枪配置检测、打印机环境检测和配置等。 正向流程存在冗余。除了必要的信息输入,其余部分可以自动化完成。如:防伪完成。
基准体验的梳理
开仓或实操开始前“实操助手” 可以保障实操环境、设备配置的可用性,并可以自助修复卡点问题; 保障大部分订单仅需扫码必要的订单、商品、防伪信息,即可自动化完成发货,操作链路无冗余; 提升高频操作的无键盘化的覆盖率,全程仅需用到扫码枪,降低用户设备上的使用负担; 针对异常流程,可以系统化低成本的录入异常SOP预案,自动呈现提示语、解决问题的快捷指令等。
五
实操环境检测
实操环境的安装和配置
实操环境检测能力的使用流程
实操检测能力的技术架构
实操环境的检查时机
输入法的检测和自动修复
// # constantconst PLAT_WIN = os.platform() === 'win32'const LANG_CONFIG = {'en-US': {name: 'en-US',code: '0409:00000409',delay: 1.5,},'zh-CN': {name: 'zh-CN',code: '0804:{81D4E9C9-1D3B-41BC-9E6C-4B40BF79E35E}{FA550B04-5AD7-411F-A5AC-CA038EC515D7}',delay: 1.5,},}/*** 获取shell指令集*/function getShellLangScripts({delay,name,code,}: {delay: numbername: stringcode: string}) {const tplName = name || 'en-US'const tplCode = code || '0409:00000409'const tplDelay = delay || 1.5// powershell 指令集return {// ## 脚本: 重置系统输入法为 name 如en-US,删除其他输入法,立即生效,无需切换窗口焦点// ## 优点,避免用户意外打开中文输入法,缺点,用户已有输入法被卸载RESET: [`Set-WinSystemLocale ${tplName};`,`Set-WinUserLanguageList ${tplName} -Force;`,`Set-WinDefaultInputMethodOverride -InputTip "${tplCode}";`,],// ## 脚本: 添加系统输入法 name 如en-US,合并其他输入法,立即生效,无需切换窗口焦点// ## 优点,用户已有输入法依然存在,缺点,中文输入法可能还存在于用户的输入法列表中COMPATIBLE: [`$restoreLanguageList = Get-WinUserLanguageList;`,`$restoreLanguageList.Remove("${tplName}");`,`$restoreLanguageList.Insert(0, "${tplName}");`,`Set-WinUserLanguageList ${tplName} -Force;`,// windows未开放当前窗口立即生效,这里通过hack实现`Start-Sleep -Seconds ${tplDelay};`,`Set-WinUserLanguageList -LanguageList $restoreLanguageList -Force;`,// 设置默认输入法和系统语言`Set-WinDefaultInputMethodOverride -InputTip "${tplCode}";`,`Set-WinSystemLocale zh-CN;`,// 调整语言顺序后,Win11下会将首个语言设置为展示语言,这里重置为中文`Set-WinUILanguageOverride -Language zh-CN;`,],}}/*** 添加系统输入法 en-US,合并其他输入法,立即生效,无需切换窗口焦点*/export type ActionTypeLangAdapt = 'COMPATIBLE' | 'RESET' | 'CAT'export type NameTypeLangAdapt = 'zh-CN' | 'en-US'let lockExecLang = falseexport function adaptOrCatLang(actionType?: ActionTypeLangAdapt,nameType?: NameTypeLangAdapt,delay?: string,fn?: (status: 'success' | 'failed', msg: string) => void) {if (lockExecLang) returnlockExecLang = trueconst fnAffair = (status: 'success' | 'failed', msg: string) => {fn?.(status, msg)lockExecLang = false}if (!PLAT_WIN) {fnAffair('failed', '仅支持windows系统')return}const langTplConfig = LANG_CONFIG[nameType]langTplConfig.delay = Number(delay) || langTplConfig.delayif (!langTplConfig) {fnAffair('failed', '语言类型错误')return}const shellLangScripts = getShellLangScripts(langTplConfig)switch (actionType) {case 'CAT':const out = childProcess.execSync('powershell.exe (Get-WinUserLanguageList)[0].LanguageTag;')fnAffair('success', out?.toString('utf8')?.trim() || '')breakdefault:const langScript = shellLangScripts?.[actionType]?.join('')if (langScript) {const out = childProcess.spawn(langScript, {shell: 'powershell.exe',})out.on('exit', function () {fnAffair('success', `语言切换成功(${nameType})`)})} else {fnAffair('failed', '指令类型错误')}break}}
统一打印组件
新版打印机组件,可以实现和打印机机型解耦,不再要求 BPO 购买指定机型打印机,节省 BPO 成本; 保证打印效果的一致性,为后边统一面单打印做基础。
软件更新
六
信息反馈及异常SOP
声音,仓内无音响设备则无法触达; 通知,有常驻通知和非常驻两种。
七
效率指标的定义、监控和分析
八
后续规划
完成实操检测能力的验证,确定后续开仓流程细节,确认检测能力短板; 提升实操效率指标的可用性、逆向流程分析和发现问题的效率。
保障后续开仓顺利进行,补齐商品图无键盘切换、关键词信息和AI复检等能力; 保障PC实操在云仓DB和得物仓的兼容性和可用性,通过微前端兼容云仓登录,从而提升迭代的一致性和效率。
信息透出屏效和自动录入能力; 设备环境问题可以通过“实操助手”检测能力自行解决; 业务异常不中断操作流程,并可以自行解决问题。
往期回顾
1. Android Fresco调优实践|得物技术
2. 来自快手、得物等无线优化技术话题已集结|干货
3. 非标类型导致Dubbo接口出入参异常的本质 | 得物技术
4. 模型量化与量化在LLM中的应用 | 得物技术
5. 如何做配置链接的质量保障?看这篇就对了 | 得物技术
文 / Tony
关注得物技术,每周一、三、五更新技术干货
要是觉得文章对你有帮助的话,欢迎评论转发点赞~
未经得物技术许可严禁转载,否则依法追究法律责任。
“
扫码添加小助手微信
如有任何疑问,或想要了解更多技术资讯,请添加小助手微信:
线下活动推荐