钉钉流程报销付款的一种解决方案

需求

小微公司需要搭建一套完整的OA系统,且需求比较急。钉钉的OA解决方案是业内比较认可的,且接入的公司比较多,
配置后即可使用,降低开发成本,同时也提供技术支持,故决定采用该方案。

问题

  • 钉钉的付款目前只支持支付宝,不满足公司的银企直连方案
  • 配置的流程多,且钉钉的回调报文都是根据配置的字段来,多为中文,开发成本高

解决方案

  • 把审批流的数据通过审批回调接口落地,数据校验成功后调用付款接口进行付款
    审批流页面审批流展示
  • 使用策略模式,对不同流程的相同字段的解析可以重复利用,提高了开发效率,降低了开发成本
public interface FieldStrategy {
	
	/**
	 * 处理字段的值(应付单)
	 * @param value
	 * @param paymentBill
	 */
	void process(String value, PaymentBill paymentBill);
	
	/**
	 * 处理字段的值(应收单)
	 * @param value
	 * @param receiptBill
	 */
	void receiptProcess(String value, ReceiptBill receiptBill);

}

public class FieldStrategyContext {
	
	public FieldStrategy getInstance(String processType, String name){
		return getBean(processType, name);
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	private <T> T getBean(String processType, String name){
		FieldEnum[] values = FieldEnum.values();
		if(values != null && values.length > 0){
			for(FieldEnum val : values){
				
				try {
					if(Objects.equal(processType, val.getType()) && Objects.equal(name, val.getName())){
						Class clazz = Class.forName(val.getClassName());
						return (T) clazz.newInstance();
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return null;
	}

}

public class FinalPaymentProcess implements ProcessStrategy {

	@Override
	public PaymentBill process(ProcessInstanceTopVo processInstance, String processType) {
		
		//初始化应收单
		PaymentBill pb = initPaymentBill(processInstance, processType);
				
		List<FormComponentValueVo> formValues = processInstance.getFormComponentValues();
		FieldStrategyContext context = new FieldStrategyContext();
		for(FormComponentValueVo form : formValues){
			FieldStrategy fieldStrategy = context.getInstance(processType, form.getName());
			if(fieldStrategy != null){
				fieldStrategy.process(form.getValue(), pb);
			}
		}
		
		PaymentReimbursementDetail prd = pb.getReimbursementDetails().get(MagicNumber.ZERO);
		//计算付款金额
		prd.setAmount(prd.getTotalAmount());
		prd.setFeeAmount(MagicNumber.D_ZERO);
		pb.setPaymentAmount(prd.getTotalAmount());
		
		return pb;
	}
}

总结

其实钉钉提供的通用性解决方案是建立个微应用,调用审批提供的服务进行处理,但是受限于需求的上线时间,和开发资源的紧张,就采用了该方案。该方案存在一些问题,比如修改配置字段,代码也需要同步修改,否则会带来解析问题,所以该方案目前作为一个临时的过度方案,后期的计划还是建立微应用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值