一、模式介绍
1、适用群体
财务BP条线、业务内勤等,主要用于业务资金到账、资金付款的信息同步
2、应用场景
主要是用于企业内各类收款、付款以及银行余额信息的对接,用于解决
“客户转的款到了没有?”
“我办的付款支付了没有”
“现在我们所有账户余额多少”。。。等等一系列问题。
实施以前我们业务人员需要根据客户转款情况再发起销售合同或是发起发货流程,主要依赖于财务人员进网银核查,打电话或者是转发短信息进行信息的同步,转账信息的同步不及时、不敏捷。类似这样:
实施以后,钉钉机器人会在银行余额变动后将业务资金直接推送至群里给业务人员认领。类似这样:
3、使用工具:钉钉、多维表、钉钉连接器、SmsForwarder、钉钉机器人
4、费用情况:
除了手机基本套餐费用以外,大多是免费即可实现(需开通钉钉企业版)。
三、总体框架(三个结构图)
四、各环节步骤展示
1、接收短信环节:使用到了一个很神奇的工具,是大神@pppscn开发的软件SmsForwarder-短信转发器文档预览 - Gitee.com
2、配置连接器:这里要注意配置的webhook地址来源于钉钉连接器里面的地址↓
这里运用的就是很简单的三个步骤:从webhook-FaaS脚本-多维表的过程,这里共享一下代码,选用的是我们在用的几个银行作为示例:
/*
版本:Node.js 16
脚本入参变量的属性将会映射到对象 input 中,对象 output 对应的属性将会映射到出参设置中。
例如脚本入参变量配置字段 name,脚本中可以通过 input.name 取到字段 name 的值,output.age = 20 可将出参配置字段 age 的值设置为20后返回。
以下为示例脚本:
var array = input.array;
var result = array.map((val, index) => {
var key = val[0];
var value = val[1];
return {"key": key, "value":value};
});
output.result = result;
以上脚本获取到名为 array 的脚本入参变量,该脚本入参变量为双层数组(内部的数组为固定存储 key、value 的大小为2的数组),将内部数组的 key、value 转为对象后返回。
输入:
{"array":[["a","b"],["c","d"]]}
输出:
{"result":[{"key":"a","value":"b"},{"key":"c","value":"d"}]}
测试的时候可通过 console.log(xxx); 查看测试日志
注:input、output为系统预置变量,不要重复定义
*/
function formatNumber(num) {
if(!num) return "";
return Number(num).toFixed(2).replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,');
}
let inputHandle=decodeURI(input.params.split('&')[1].split('=')[1]);
const regex = /(?<=【)[^】]+/;
let outPutResult = [];
const match = inputHandle.match(regex)||[];
let result = match[0];
let accountNumber = "";
let companyName = "";
let transactionType = "";
let transactionAmount = "";
let balance = "";
let accountNumberMatch = null;
let companyNameMatch = null;
let transactionTypeMatch = null;
let transactionAmountMatch = null;
let balanceMatch = null;
if (result.indexOf("农业银行")>-1) {
accountNumberMatch = inputHandle.match(/尾号(\d{4})/);
companyNameMatch = inputHandle.match(/:(.*?)于/);
transactionTypeMatch = inputHandle.match(/完成(\S+?)交易/);
transactionAmountMatch = inputHandle.match(/金额为(\d+\.\d{2})/);
balanceMatch = inputHandle.match(/余额为(\d+\.\d{2})/);
accountNumber = (accountNumberMatch && accountNumberMatch[1]) || "";
companyName = (companyNameMatch && companyNameMatch[1]) || "";
transactionType = (transactionTypeMatch && transactionTypeMatch[1]) || "";
transactionAmount =
(transactionAmountMatch && transactionAmountMatch[1]) || "";
balance = (balanceMatch && balanceMatch[1]) || "";
}
if (result === "民生银行") {
accountNumberMatch = /\*\d{4}/; // 匹配账户号码
companyNameMatch =inputHandle.indexOf('存入')>-1?/付方(\S+?),/:/收方(\S+?),/; // 匹配公司名称
transactionTypeMatch =inputHandle.indexOf('存入')>-1?/存入/:/支出/; // 匹配交易类型
transactionAmountMatch = /¥\d+\.\d{2}/; // 匹配交易金额
balanceMatch = /可用余额(\S+?)元/; // 匹配可用余额
accountNumber = inputHandle.match(accountNumberMatch)[0].slice(1); // 获取账户号码
companyName = inputHandle.match(companyNameMatch)[1]; // 获取公司名称
transactionType =
inputHandle.match(transactionTypeMatch)[0] === "存入" ? "转入" : "支出"; // 获取交易类型
transactionAmount = inputHandle.match(transactionAmountMatch)[0].slice(1); // 获取交易金额
balance = inputHandle.match(balanceMatch)[1]; // 获取可用余额
}
if (result === "兴业银行") {
accountNumberMatch = /\*\d{4}\*/; // 匹配账户号码
companyNameMatch = /对方账户:([\u4e00-\u9fa5]+),/; // 匹配姓名
transactionTypeMatch = inputHandle.indexOf('支出')>-1?/支出/:/收入/; // 匹配交易类型
transactionAmountMatch =inputHandle.indexOf('支出')>-1?/支出(\S+?)元/:/收入(\S+?)元/; // 匹配支出金额
balanceMatch = /余额(\S+?)元/; // 匹配余额
accountNumber = inputHandle.match(accountNumberMatch)[0].slice(1, 5); // 获取账户号码
companyName = inputHandle.match(companyNameMatch)[1]; // 获取姓名
transactionType = inputHandle.match(transactionTypeMatch)[0]; // 获取交易类型
transactionAmount = inputHandle.match(transactionAmountMatch)[1]; // 获取支出金额
balance = inputHandle.match(balanceMatch)[1]; // 获取余额
}
outPutResult.push({ key: '\n银行:' +result+accountNumber+'\n客户名称:'+companyName+'\n金额:'+formatNumber(transactionAmount)+'元'+'\n余额:'+formatNumber(balance)+'元'});
outPutResult.push({ 银行: result });
outPutResult.push({ 尾号: accountNumber });
outPutResult.push({ 交易对手: companyName });
outPutResult.push({ 交易类型: transactionType });
outPutResult.push({ 金额: transactionAmount });
outPutResult.push({ 余额: balance });
outPutResult.push({ 短信原文: inputHandle });
output={outPutResult};
#重要!!! 这个分隔代码求援想问问大家有没有更好的处理方式。
代码的功能主要是把无序的短信变成有序的信息:
最后把几个字段匹配写入我们的维格表,推送与管理就基本完成了
3、配置多维表:
我们采用的多维表方案是“流水账-分账户余额表-总余额表-仪表盘”四个层次
推送效果展示:
看板效果展示: