引言:1.上游如何通过接口如何传数据到nifi并存储数据到数据库?
2.数据库中的表应该如何设计?
目录
1.常见组件的使用
-
HandleHttpRequest
- 用于上游数据传输到nifi设置接口功能组件,启动一个http的端口。
-
allowed paths :.*/(qq|hh)
2.StandardHttpContextMap
- StandardHttpContextMap 用于设置HTTP的请求和响应
3.RouteOnAttribute
- 该处理器使用属性表达式语言,根据流文件的属性去计算然后进行路由。
-
简单来话是对HandleHttpRequest路由进行分发
-
oa_zjxbxz ${http.request.uri:equals("/oa_zjxbxz")}
-
通过不同的路由进入到不同的处理组中对应的处理组件
-
4.ExecuteGroovyScript
-
负责写类java脚本groovy对数据进行接收转换并存储到中台。
-
2.数据库中表的设计
-
主表oa_zjxbxz表多加fid和dr字段,fid自增,dr用来存储最新数据状态(dr=0代表最新状态,dr=1代表旧数据),一般不涉及到删除数据,要保留痕迹!
-
-
子表oa_zjxbxz_h表保存主表的主键并且也多加一个自增字段sid和状态字段dr(同上)
-
3.groovy脚本接收和存储数据
- 新增数据接口
//资金下拨新增
import com.fasterxml.jackson.databind.ObjectMapper
import groovy.json.JsonSlurper
//数据转化为json格式
import groovy.sql.Sql
import com.yonyou.util.NiFiUtil
import java.util.ArrayList;
import java.util.List;
//判断流数据是否流入
def flowfile = session.get();
if (!flowfile) return;
//jsonObject变量用来获取流数据
def jsonObject = null;
//连接中台数据库
ObjectMapper mapper = new ObjectMapper();
def response = [:];
def conn = CTL.mydb.getConnection();
if (!conn) return;
Sql sql = new Sql(conn);
if (!sql) return;
//连接nc数据库
def conn1 = CTL.ncdb.getConnection();
if (!conn1) return;
Sql sql1 = new Sql(conn1);
if (!sql1) return;
//如果上面都没有问题返回数据库状态
response.put("success", "true");
response.put("code", "1000000000");
int success = 0;//成功存入数据库个数
int fail = 0;//报错个数
NiFiUtil nftUtil = new NiFiUtil();
//把键值对类型的resert包裹在数组里
def restlist = [];
try {
// 将字符串进行 json 反序列化操作 , 得到 map 集合{"age":18,"name":"Tom"} [age:18, name:Tom]
jsonObject = new groovy.json.JsonSlurper().parseText(flowfile.read().getText("UTF-8"));
for (int i = 0; i < 1; i++) {
log.info("=======报销单新增=========");
//resert用来保存错误数据 map
def resert = [:];
//获取流过来的json字段数据
String oaid = jsonObject.oaid?.toString() == null ? "" : jsonObject.oaid?.toString();
//对每一个字段进行判断
if ("".equals(oaid)) {
resert.put("index", i);
resert.put("errormessage","oaid不能为空");
restlist.add(resert);
fail++;
response.put("code","1000000002");
continue;
}
String ymonth = jsonObject.ymonth?.toString() == null ? "" : jsonObject.ymonth?.toString();
//对每一个字段进行判断
if ("".equals(ymonth)) {
resert.put("index", i);
resert.put("errormessage", "ymonth不能为空");
restlist.add(resert);
fail++;
response.put("code","1000000002");
continue;
}
String finance = jsonObject.finance?.toString() == null ? "" : jsonObject.finance?.toString();
String transactiontype = jsonObject.transactiontype?.toString() == null ? "" : jsonObject.transactiontype?.toString();
double homemoney = jsonObject.homemoney == null ? 0.00 : jsonObject.homemoney;
double totalmoney=jsonObject.totalmoney==null? 0.00 :jsonObject.totalmoney;
double actualmoney=jsonObject.actualmoney==null? 0.00:jsonObject.actualmoney;
double paymoney=jsonObject.paymoney==null? 0.00 :jsonObject.paymoney;
double repaymentmoney=jsonObject.repaymentmoney==null? 0.00 :jsonObject.repaymentmoney;
double borrowermoney=jsonObject.borrowermoney==null? 0.00 :jsonObject.borrowermoney;
String payingunit=jsonObject.payingunit?.toString()==null? "" :jsonObject.payingunit?.toString();
String corporatebank = jsonObject.corporatebank?.toString() == null ? "" : jsonObject.corporatebank?.toString();
String paymenttype = jsonObject.paymenttype?.toString() == null ? "" : jsonObject.paymenttype?.toString();
String expenseunit = jsonObject.expenseunit