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

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


一、需求

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

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


二、思路与方案

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