如何实现 移动端扫码,单据体数据入库的功能原创
金蝶云社区-吴锐雄
吴锐雄
3人赞赏了该文章 2,964次浏览 未经作者许可,禁止转载编辑于2022年12月20日 09:46:50
summary-icon摘要由AI智能服务提供

本文档描述了在移动端通过扫码功能将货物信息录入库存单据体的需求、思路、实现过程及注意事项。首先,设计并打印包含条形码的货物基础资料模板。接着,在移动端实现扫码功能,扫码后解析结果并保存货物信息到库存单据中。实现包括打印模板设计、移动端表单设计、扫码插件编写、注册插件以及钉钉快捷应用的配置。开发环境需确保手机和苍穹环境在同一局域网内,生产环境则需配置域名。文档最后提供了开发平台指导手册及附件。

关键词:移动端,扫码,单据体


一、需求

将“货物”基础资料打印出条形码,在“库存”单据中设计移动端扫码功能。

扫码完成之后,将“货物”信息录入“库存”的单据体中。


二、思路与方案

1.打印出条形码需要设计打印模板

2.苍穹的移动端扫码,依赖第三方应用,需要调起第三方应用的扫码功能。

3.扫码之后,需要解析扫码结果,将货物信息保存到单据体中。


三、实现过程

1.新建“罐头”基础资料

image.png


2.创建“罐头”基础资料的打印模板


添加打印模板:

image.png


设计打印模板,条形码控件绑定内码:

image.png


3.打印数据


工具栏添加打印预览操作:

image.png


打印数据:

image.png

image.png


4.创建“库存”单据

单据体添加“罐头”字段

image.png


5.设计“库存”移动表单

拖入单据体,在卡片视图中添加单据体字段

image.png


添加“扫码”按钮

image.png

image.png

image.png


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 注册插件

image.png


8.钉钉新建快捷应用

登录钉钉开放平台:

image.png

创建应用,配置首页信息。

参数解释:

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



钉钉新增快捷应用的界面如下

image.png


四、效果图

进入钉钉app,进入工作台。

点击仓库入库应用。

image.png


在库存列表点击一行单据,进入单据详情

image.png


单据详情点击右上角扫码

image.png


点击确认:

image.png


完成入库:

image.png


五、开发环境版本

苍穹版本号
V4.0.020
许可版本
V2.0

星瀚版本号

V4.0.020

许可版本
V2.0


六、注意事项

如果是开发环境:手机和苍穹环境必须连接在同一个局域网内,不然钉钉app无法访问到苍穹页面。

如果是生产环境,配置域名可以代替ip地址。



七、参考资料

【开发平台】指导手册

学习成长中心

如何调用扫码、拍照等移动客户端的API?



八、附件

附件包含,打印模板,两个页面的元数据,扫码的代码




图标赞 3
3人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!