本文档描述了在移动端通过扫码功能将货物信息录入库存单据体的需求、思路、实现过程及注意事项。首先,设计并打印包含条形码的货物基础资料模板。接着,在移动端实现扫码功能,扫码后解析结果并保存货物信息到库存单据中。实现包括打印模板设计、移动端表单设计、扫码插件编写、注册插件以及钉钉快捷应用的配置。开发环境需确保手机和苍穹环境在同一局域网内,生产环境则需配置域名。文档最后提供了开发平台指导手册及附件。
关键词:移动端,扫码,单据体
一、需求
将“货物”基础资料打印出条形码,在“库存”单据中设计移动端扫码功能。
扫码完成之后,将“货物”信息录入“库存”的单据体中。
二、思路与方案
1.打印出条形码需要设计打印模板
2.苍穹的移动端扫码,依赖第三方应用,需要调起第三方应用的扫码功能。
3.扫码之后,需要解析扫码结果,将货物信息保存到单据体中。
三、实现过程
1.新建“罐头”基础资料
2.创建“罐头”基础资料的打印模板
添加打印模板:
设计打印模板,条形码控件绑定内码:
3.打印数据
工具栏添加打印预览操作:
打印数据:
4.创建“库存”单据
单据体添加“罐头”字段
5.设计“库存”移动表单
拖入单据体,在卡片视图中添加单据体字段
添加“扫码”按钮
6.编写插件并注册,完成扫码业务逻辑
6.1监听按钮点击
@Override public void registerListener(EventObject e) { super.registerListener(e); addClickListeners("kdec_sync"); } @Override public void click(EventObject evt) { super.click(evt); if (evt.getSource() instanceof Button) { switch (((Button) evt.getSource()).getKey()) { case "kdec_sync": HashMap args = new HashMap(); // 调用钉钉扫码,qr:二维码扫码框;bar:条形码扫码框 args.put("type", "qr"); HashMap map = new HashMap(); map.put("method", "scanQRCode"); map.put("args", args); this.getView().executeClientCommand("callAPPApi", map); break; } } }
6.2 接收扫码结果
@Override public void customEvent(CustomEventArgs e) { String eventName = e.getEventName(); String content = e.getEventArgs(); String key = e.getKey(); if (key.equals("callAppMethod")) { if (eventName.equals("scanQRCode")) { // 解析扫码结果 HashMap mapSync = SerializationUtils.fromJsonString(content, HashMap.class); String canId = mapSync.get("qrcode_str").toString(); } } }
6.3 获取到“罐头”基础资料的内码id之后,查询这个id对应的基础资料,弹窗展示
DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(Long.valueOf(canId ), "kdec_can"); String name = dynamicObject.get("name").toString(); String status = dynamicObject.get("kdec_repertory_status").toString(); switch (status) { case "A": status = "待入库"; break; case "B": status = "已入库"; break; } String count = dynamicObject.get("kdec_repertory_count").toString(); String number = dynamicObject.get("number").toString();
6.4 弹窗展示用户是否入库,confirmCallBacks是回调,content是id
// 弹框,提示是否入库 ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener("SyncConfirm", this); getView().showConfirm("罐头入库", "名称:" + name + "\n编号:" + number + "\n数量:" + count + "\n状态:" + status, MessageBoxOptions.OKCancel, ConfirmTypes.Default, confirmCallBacks, null, canId);
6.5 如果用户点击的确认,新增一行单据体,调用SaveServiceHelper保存数据
@Override public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) { super.confirmCallBack(messageBoxClosedEvent); // 用户点击后,会回调这个事件,判断用户点击了确定 if (messageBoxClosedEvent.getResult().equals(MessageBoxResult.Yes) && messageBoxClosedEvent.getCallBackId().equals("SyncConfirm")) { String canId = messageBoxClosedEvent.getCustomVaule(); DynamicObject canDynamicObject = BusinessDataServiceHelper.loadSingle(Long.valueOf(canId), "kdec_can"); // 获取当前库存单 DynamicObject repertoryDynamicObject = BusinessDataServiceHelper.loadSingle(getModel().getValue("id"), "kdec_can_repertory"); // 新增单据体 DynamicObjectCollection entryCollection = repertoryDynamicObject.getDynamicObjectCollection("kdec_can_en"); //获取单据体容器 DynamicObject entry = new DynamicObject(entryCollection.getDynamicObjectType()); // 新增一行 entry.set("kdec_can", canDynamicObject.get("id")); // 设置入库商品 entryCollection.add(entry); // 保存record对象,获取保存结果 OperationResult result = SaveServiceHelper.saveOperate("kdec_can_repertory", new DynamicObject[]{repertoryDynamicObject}, OperateOption.create()); if (result.isSuccess()) { getView().showSuccessNotification("入库成功"); getView().invokeOperation("refresh"); } else { getView().showSuccessNotification("入库失败"); } } }
7 注册插件
8.钉钉新建快捷应用
登录钉钉开放平台:
创建应用,配置首页信息。
参数解释:
type=mobilelist是固定写法。
form=bos_moblist是固定写法,表示配置一个列表模板。
billFormId=kdec_can_repertory是单据标识。
172.20.14.63:8080/ierp/,是苍穹的访问地址。
注意:手机和苍穹环境必须连接在同一个局域网内。
最终URL如下:
http://172.20.14.63:8080/ierp/mobile.html?type=mobilelist&form=bos_moblist&billFormId=kdec_can_repertory
钉钉新增快捷应用的界面如下:
四、效果图
进入钉钉app,进入工作台。
点击仓库入库应用。
在库存列表点击一行单据,进入单据详情
单据详情点击右上角扫码
点击确认:
完成入库:
五、开发环境版本
V4.0.020
六、注意事项
如果是开发环境:手机和苍穹环境必须连接在同一个局域网内,不然钉钉app无法访问到苍穹页面。
如果是生产环境,配置域名可以代替ip地址。
七、参考资料
八、附件
附件包含,打印模板,两个页面的元数据,扫码的代码
MetaAndCode.zip(20.14KB)
推荐阅读