作者 钟来

提交鱼儿乐数据到飞书

package com.ruoyi.quartz.task;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.FeishuUtil;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.dao.service.PublicService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component("feiShuSubData")
public class FeiShuSubData {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private PublicService publicService;
/**
* 提交鱼儿乐集团-》南京养殖数据总表-》硬件抄表
* https://e1l9o8boha.feishu.cn/base/OcUYbxkuCakxYlsbrEUcXyqKnbf?table=tblSfMTyLc8OCPVX&view=vewbRhrhFU
*/
public void subPenggongData()
{
List<Map<String,Object>> list = publicService.getObjectListBySQL("SELECT id,data_state FROM `liu_yu_le`.`device_info` WHERE user_login_name='15968860065' AND device_type=0");
subFeishuLuhuiList(list);
}
private void subFeishuLuhuiList(List<Map<String,Object>> list)
{
if(null != list && list.size() != 0)
{
JSONObject field = new JSONObject();
field.put("记录时间",System.currentTimeMillis());
for (Map<String,Object> map:list)
{
String id = (String) map.get("id");
String data_state = (String) map.get("data_state");
if(null != data_state && !"".equals(data_state))
{
JsonObject jsonObject = GsonConstructor.get().fromJson(data_state, JsonObject.class);
switch (id)
{
case "865019079529917_1_1":
if(jsonObject.has("41"))
{
field.put("8号池ORP值",jsonObject.get("41").getAsDouble());
}
break;
case "865019079529917_1_2":
if(jsonObject.has("105"))
{
field.put("8号池浊度",jsonObject.get("105").getAsDouble());
}
break;
case "865019079529917_1_3":
if(jsonObject.has("7"))
{
field.put("8号池氨氮",jsonObject.get("7").getAsDouble());
}
break;
case "865019079529917_1_4":
if(jsonObject.has("8"))
{
field.put("8号池PH",jsonObject.get("8").getAsDouble());
}
break;
case "865019079530196_1_1":
if(jsonObject.has("0"))
{
field.put("微滤机水温",jsonObject.get("0").getAsDouble());
}
if(jsonObject.has("1"))
{
field.put("微滤机溶氧",jsonObject.get("1").getAsDouble());
}
break;
case "865019079530196_1_2":
if(jsonObject.has("0"))
{
field.put("7号池水温",jsonObject.get("0").getAsDouble());
}
if(jsonObject.has("1"))
{
field.put("7号池溶氧",jsonObject.get("1").getAsDouble());
}
break;
case "865019079530196_1_3":
if(jsonObject.has("0"))
{
field.put("8号池水温",jsonObject.get("0").getAsDouble());
}
if(jsonObject.has("1"))
{
field.put("8号池溶氧",jsonObject.get("1").getAsDouble());
}
break;
}
}
}
subFeishuLuhui(field);
}
}
private static void subFeishuLuhui(JSONObject field)
{
FeishuUtil.subFeishuTables(FeishuUtil.gettenant_access_token("cli_a88a14d3b279d01c","Z3hpYKHeR1yR2aiv6Rp0mcnwKvehkzmT"),"OcUYbxkuCakxYlsbrEUcXyqKnbf","tblSfMTyLc8OCPVX",field);
}
}
... ...
package com.ruoyi.common.utils;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.html.HttpUtils;
import okhttp3.Request;
import okhttp3.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class FeishuUtil {
private static final Logger logger = LoggerFactory.getLogger(FeishuUtil.class);
private static Map<String, TenantAccessToken> tenant_access_token_map = new HashMap<>();
public static String gettenant_access_token(String yy_app_id,String yy_app_secret) {
if(tenant_access_token_map.containsKey(yy_app_id))
{
TenantAccessToken tenant_access_token = tenant_access_token_map.get(yy_app_id);
// 判断token是否未超时
if (tenant_access_token.getTenant_access_token() != null && System.currentTimeMillis() < tenant_access_token.getTokenExpireTime()) {
return tenant_access_token.getTenant_access_token();
}
}
String url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal";
try {
Response response = HttpUtils.postJsonBody(url, builder -> builder.addHeader("Content-Type", "application/json; charset=utf-8"), jsonObject -> {
jsonObject.put("app_id", yy_app_id); // 替换为实际的 app_id
jsonObject.put("app_secret", yy_app_secret); // 替换为实际的 app_secret
});
String str = response.body().string();
JSONObject responseMap = JSONObject.parseObject(str, JSONObject.class);
if (responseMap != null && responseMap.getInteger("code")==0) {
TenantAccessToken tenant_access_token = new TenantAccessToken();
tenant_access_token.setTenant_access_token(responseMap.getString("tenant_access_token"));
// 设置token过期时间,假设token有效期为7200秒
tenant_access_token.setTokenExpireTime(System.currentTimeMillis() + responseMap.getInteger("expire") * 1000);
tenant_access_token_map.put(yy_app_id, tenant_access_token);
return tenant_access_token.getTenant_access_token();
}else {
throw new RuntimeException("Failed to get tenant_access_token: " + str);
}
} catch (IOException e) {
throw new RuntimeException("Failed to get tenant_access_token: " ,e);
}
}
/**
* HTTP URL
* https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records
* HTTP Method
* POST
* 接口频率限制
* 50 次/秒
*
* 请求头 :Authorization、Content-Type
*/
public static void subFeishuTables(String tenant_access_token,String app_token,String table_id, JSONObject field )
{
String url = "https://open.feishu.cn/open-apis/bitable/v1/apps/"+app_token+"/tables/"+table_id+"/records";
JSONObject params = new JSONObject();
params.put("fields",field);
try {
Response response = HttpUtils.postJsonBody(url, builder -> {
builder.addHeader("Content-Type", "application/json");
builder.addHeader("Authorization", "Bearer "+tenant_access_token);
}, jsonObject -> {
jsonObject.put("fields", field);
});
String str = response.body().string();
JSONObject responseMap = JSONObject.parseObject(str, JSONObject.class);
if (responseMap != null && responseMap.getInteger("code")!=0)
{
logger.error("提交飞书表数据返回失败:{}",str);
}
} catch (IOException e) {
logger.error("提交飞书表数据异常",e);
}
}
}
... ...
package com.zhonglai.luhui.api.controller.test.dto;
package com.ruoyi.common.utils;
public class TenantAccessToken {
private String tenant_access_token;
... ...
... ... @@ -175,9 +175,10 @@ public class HttpUtils {
Response response = okHttpClient.newCall(request).execute();
try {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
throw new IOException("Unexpected code " );
}
} catch (IOException e) {
System.out.println(response.body().string());
response.body().close();
}
return response;
... ...