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