分享功能及其扩展.md 2.9 KB

说明

要使用分享功能,主要就是在业务单据read接口加一个@ReadBiz注解

  • 前端viewModel.data需要设置showShareBtn: true,这样会在单据右上角 显示一个分享图标

  • 用户点击该图标会生成一条分享记录,保存在saas_biz.form_share

  • 用户通过扫码二维码或直接复制链接,分享出去

  • 查看的时候,通过分享记录,拿到对应的业务单据数据

其实关键步骤在如何通过分析记录,拿到业务单据数据。因为查看分享数据的人, 是没有系统的账户及操作权限的,无法使用单据本身的read接口 (接口也不允许通过_noc等参数忽略鉴权)。

这里的做法是,提供一个@ReadBiz注解,业务单据的读取方法使用该注解标记。提供一个 com.usoftchina.saas.biz.config.BizMappingFactory.read工厂方法来读取指定业务的数据

实现的地方在com.usoftchina.saas.biz.controller.FormShareController.readBiz

    /**
     * 读取分享记录对应的业务数据
     * 注意:不能直接发起业务单据的read请求,只能通过此安全接口获取
     *
     * @param id
     * @return
     */
    @GetMapping("/read_biz/{id}")
    public Result readBiz(@PathVariable String id) {
        FormShare share = formShareService.findByPrimaryKey(id);
        if (null == share) {
            return Result.error(BizExceptionCode.ORDER_NOT_EXITTS);
        }
        FormShareBizDTO dto = BeanMapper.map(share, FormShareBizDTO.class);
        BaseContextHolder.setAppId(share.getAppId());
        BaseContextHolder.setUserId(share.getCreatorId());
        BaseContextHolder.setUserName(share.getCreatorName());
        BaseContextHolder.setCompanyId(share.getCompanyId());

        try {
            // 按caller读取业务数据
            Object result = mappingFactory.read(share.getAppId(), share.getBizType(), share.getBizId());
            if (null != result) {
                if (result instanceof Result) {
                    dto.setBizData(((Result) result).getData());
                } else {
                    dto.setBizData(result);
                }
            }
            return Result.success(dto);
        } finally {
            BaseContextHolder.remove();
        }
    }

案例一

销售订单

代码在com.usoftchina.saas.sale.controller.SaleController.getFormData 此方法不但提供了基于path的http get请求,也提供了基于caller的业务读取接口

    /**
     * 销售订单查询
     * 
     * @return
     */
    @ReadBiz("Sale")
    public Result<SaleFormDTO> getFormData(@PathVariable("id") Long id) {
        SaleFormDTO data = saleService.getFormData(id);
        return Result.success(data);
    }

事实上,绝大部分的业务增删改查,都可以使用标准的Biz注解。这样仅需一个caller,就可以在任何地方执行任何业务逻辑了