### 说明 > 要使用分享功能,主要就是在业务单据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 getFormData(@PathVariable("id") Long id) { SaleFormDTO data = saleService.getFormData(id); return Result.success(data); } ``` 事实上,绝大部分的业务增删改查,都可以使用标准的Biz注解。这样仅需一个caller,就可以在任何地方执行任何业务逻辑了