要使用分享功能,主要就是在业务单据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,就可以在任何地方执行任何业务逻辑了