|
|
|
@ -1,18 +1,16 @@
|
|
|
|
|
package com.ruoyi.flyingbook.strategy.operate;
|
|
|
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
import com.ruoyi.common.constant.CompanyNameConstants;
|
|
|
|
|
import com.ruoyi.common.constant.RedisConstants;
|
|
|
|
|
import com.ruoyi.common.enums.AppType;
|
|
|
|
|
import com.ruoyi.common.enums.EventOperateStatus;
|
|
|
|
|
import com.ruoyi.common.enums.FlagStatus;
|
|
|
|
|
import com.ruoyi.common.enums.TableDetailRelationTypeEnum;
|
|
|
|
|
import com.ruoyi.flyingbook.LarkHelper.LarkTokenHelper;
|
|
|
|
|
import com.ruoyi.flyingbook.LarkHelper.MultidimensionalTableParamHelper;
|
|
|
|
|
import com.ruoyi.flyingbook.domain.*;
|
|
|
|
|
import com.ruoyi.flyingbook.service.IEventService;
|
|
|
|
|
import com.ruoyi.flyingbook.service.ILarkCompanyRelationService;
|
|
|
|
|
import com.ruoyi.flyingbook.service.ILarkTableRelationService;
|
|
|
|
|
import com.ruoyi.flyingbook.service.ILarkTableRowRelationService;
|
|
|
|
|
import com.ruoyi.flyingbook.service.*;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
@ -23,7 +21,6 @@ import java.util.ArrayList;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -32,6 +29,7 @@ import java.util.stream.Collectors;
|
|
|
|
|
* @author yuxiangyong
|
|
|
|
|
* @create 2023-03-13 20:47
|
|
|
|
|
*/
|
|
|
|
|
@Slf4j
|
|
|
|
|
@Component("MultidimensionalTableOperate")
|
|
|
|
|
public class MultidimensionalTableOperate extends LarkAbstract {
|
|
|
|
|
|
|
|
|
@ -47,6 +45,10 @@ public class MultidimensionalTableOperate extends LarkAbstract {
|
|
|
|
|
protected ILarkTableRelationService iLarkTableRelationService;
|
|
|
|
|
@Autowired
|
|
|
|
|
protected ILarkTableRowRelationService iLarkTableRowRelationService;
|
|
|
|
|
@Autowired
|
|
|
|
|
private IEventService eventService;
|
|
|
|
|
@Autowired
|
|
|
|
|
private IEventLogService eventLogService;
|
|
|
|
|
/**
|
|
|
|
|
* 获取明细行
|
|
|
|
|
*/
|
|
|
|
@ -62,80 +64,104 @@ public class MultidimensionalTableOperate extends LarkAbstract {
|
|
|
|
|
private static final String DELETE_OPERATE = "DELETE_OPERATE";
|
|
|
|
|
private String deleteLine = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/:record_id";
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void preOperate(LarkRequest request) {
|
|
|
|
|
Event event = request.getEvent();
|
|
|
|
|
if (event == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
LarkCompanyRelation relation = larkCompanyRelationService.getByCompanyName(CompanyNameConstants.COMPANY_NAME, AppType.APPROVAL.getCode());
|
|
|
|
|
if (relation == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
request.setCompanyRelationId(relation.getId());
|
|
|
|
|
|
|
|
|
|
private void fillTableRelation(LarkRequest request) {
|
|
|
|
|
LarkTableRelation tableRelation = new LarkTableRelation();
|
|
|
|
|
tableRelation.setLarkCompanyRelationId(relation.getId());
|
|
|
|
|
tableRelation.setLarkCompanyRelationId(request.getCompanyRelationId());
|
|
|
|
|
tableRelation.setFromTableId(request.getEvent().getTableId());
|
|
|
|
|
tableRelation.setFlag(FlagStatus.OK.getCode());
|
|
|
|
|
List<LarkTableRelation> larkTableRelations = iLarkTableRelationService.selectLarkTableRelationList(tableRelation);
|
|
|
|
|
if (CollectionUtils.isEmpty(larkTableRelations)) {
|
|
|
|
|
return;
|
|
|
|
|
String errorMessage = String.format("tableId:{}表关系未配置", request.getEvent().getTableId());
|
|
|
|
|
log.error("iLarkTableRelationService.selectLarkTableRelationList:{}", errorMessage);
|
|
|
|
|
throw new RuntimeException(errorMessage);
|
|
|
|
|
}
|
|
|
|
|
//主表与副表的列对应关系
|
|
|
|
|
Map<String, List<LarkTableRelation>> map = larkTableRelations.stream().collect(Collectors.groupingBy(LarkTableRelation::getToTableId));
|
|
|
|
|
request.setTableRelationMap(map);
|
|
|
|
|
List<Long> tableRelationIdList = new ArrayList<>();
|
|
|
|
|
Map<String, Long> tableRelationMap = new HashMap<>();
|
|
|
|
|
for (LarkTableRelation larkTableRelation : larkTableRelations) {
|
|
|
|
|
String to = String.format("%s_%s", larkTableRelation.getToAppToken(), larkTableRelation.getToTableId());
|
|
|
|
|
tableRelationMap.put(to, larkTableRelation.getId());
|
|
|
|
|
tableRelationIdList.add(larkTableRelation.getId());
|
|
|
|
|
}
|
|
|
|
|
request.setTableRelationMap(tableRelationMap);
|
|
|
|
|
//主表与副表的行对应关系
|
|
|
|
|
LarkTableRowRelation larkTableRowRelation = new LarkTableRowRelation();
|
|
|
|
|
larkTableRowRelation.setLarkCompanyRelationId(relation.getId());
|
|
|
|
|
larkTableRowRelation.setFromTableId(request.getEvent().getTableId());
|
|
|
|
|
larkTableRowRelation.setFlag(FlagStatus.OK.getCode());
|
|
|
|
|
List<LarkTableRowRelation> larkTableRowRelations = iLarkTableRowRelationService.selectLarkTableRowRelationList(larkTableRowRelation);
|
|
|
|
|
Map<String, List<LarkTableRowRelation>> rowMap = larkTableRowRelations.stream().collect(Collectors.groupingBy(LarkTableRowRelation::getToTableId));
|
|
|
|
|
request.setTableRowRelationMap(rowMap);
|
|
|
|
|
String token = larkTokenHelper.getToken(relation.getAppId(), relation.getSecret());
|
|
|
|
|
if (StringUtils.isBlank(token)) {
|
|
|
|
|
return;
|
|
|
|
|
List<LarkTableRowRelation> larkTableRowRelations = iLarkTableRowRelationService.queryListByTableRelationIdList(tableRelationIdList);
|
|
|
|
|
Map<Long, Map<String, String>> tableRowRelationMap = new HashMap<>();
|
|
|
|
|
Map<Long, Map<String, String>> tableColRelationMap = new HashMap<>();
|
|
|
|
|
for (LarkTableRowRelation larkTableRowRelation : larkTableRowRelations) {
|
|
|
|
|
Map<String, String> map = new HashMap<>();
|
|
|
|
|
map.put(larkTableRowRelation.getFromId(), larkTableRowRelation.getToId());
|
|
|
|
|
if (TableDetailRelationTypeEnum.ROW.getCode().equals(larkTableRowRelation.getType())) {
|
|
|
|
|
tableRowRelationMap.put(larkTableRowRelation.getTableRelationId(), map);
|
|
|
|
|
} else if (TableDetailRelationTypeEnum.COL.getCode().equals(larkTableRowRelation.getType())) {
|
|
|
|
|
tableColRelationMap.put(larkTableRowRelation.getTableRelationId(), map);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
request.setToken(token);
|
|
|
|
|
if (StringUtils.isNotBlank(event.getMessage())) {
|
|
|
|
|
return;
|
|
|
|
|
if (tableColRelationMap.isEmpty()) {
|
|
|
|
|
String errorMessage = String.format("tableId:{} 列关系未配置", request.getEvent().getTableId());
|
|
|
|
|
log.error("iLarkTableRowRelationService.queryListByTableRelationIdList:{}", errorMessage);
|
|
|
|
|
throw new RuntimeException(errorMessage);
|
|
|
|
|
}
|
|
|
|
|
event.setMessage(request.getCallBackMessage());
|
|
|
|
|
request.setTableRowRelationMap(tableRowRelationMap);
|
|
|
|
|
request.setTableColRelationMap(tableColRelationMap);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void businessProcessing(LarkRequest request) {
|
|
|
|
|
if (StringUtils.isBlank(request.getToken()) || request.getEvent() == null || StringUtils.isBlank(request.getEvent().getMessage())) {
|
|
|
|
|
return;
|
|
|
|
|
protected void preOperate(LarkRequest request) {
|
|
|
|
|
Event event = request.getEvent();
|
|
|
|
|
if (event == null) {
|
|
|
|
|
throw new RuntimeException("当前事件为空");
|
|
|
|
|
}
|
|
|
|
|
LarkCompanyRelation relation = larkCompanyRelationService.getByCompanyName(CompanyNameConstants.COMPANY_NAME, AppType.APPROVAL.getCode());
|
|
|
|
|
if (relation == null) {
|
|
|
|
|
String errorMessage = String.format("获取app值为空 companyName:{} appType:{}", CompanyNameConstants.COMPANY_NAME, AppType.APPROVAL.getCode());
|
|
|
|
|
log.error("larkCompanyRelationService.getByCompanyName:{}", errorMessage);
|
|
|
|
|
throw new RuntimeException(errorMessage);
|
|
|
|
|
}
|
|
|
|
|
for (Map.Entry<String, List<LarkTableRelation>> entry : request.getTableRelationMap().entrySet()) {
|
|
|
|
|
//用于后续追加row时候做关联关系
|
|
|
|
|
request.setCompanyRelationId(relation.getId());
|
|
|
|
|
//关联关系表填充
|
|
|
|
|
this.fillTableRelation(request);
|
|
|
|
|
String token = larkTokenHelper.getToken(relation.getAppId(), relation.getSecret(),"tenant_access_token");
|
|
|
|
|
request.setToken(token);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void businessProcessing(LarkRequest request) {
|
|
|
|
|
request.setOperateType(DETAIL);
|
|
|
|
|
JSONObject message = larkTokenHelper.getLark(getUrl(request), null, request.getToken());
|
|
|
|
|
request.setRecord(message);
|
|
|
|
|
for (Map.Entry<String, Long> entry : request.getTableRelationMap().entrySet()) {
|
|
|
|
|
request.setToTableId(entry.getKey());
|
|
|
|
|
request.setTableRelationId(entry.getValue());
|
|
|
|
|
Map<Object, Object> body = getBody(request);
|
|
|
|
|
|
|
|
|
|
String url = getUrl(request);
|
|
|
|
|
send(request.getOperateType(),url, body,request);
|
|
|
|
|
if (StringUtils.isBlank(url)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
send(request.getOperateType(), url, body, request);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected String getUrl(LarkRequest request) {
|
|
|
|
|
Event event = request.getEvent();
|
|
|
|
|
Map<String, String> rowRelation = request.getTableRowRelationMap().getOrDefault(request.getToTableId(),new ArrayList<>()).stream().collect(Collectors.toMap(LarkTableRowRelation::getFromRow, LarkTableRowRelation::getToRow, (k1, k2) -> k1));
|
|
|
|
|
|
|
|
|
|
Map<String, String> rowRelation = request.getTableRowRelationMap().get(request.getTableRelationId());
|
|
|
|
|
String cacheKey = String.format("%s_%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, event.getAppToken(), event.getTableId(), event.getRecordId());
|
|
|
|
|
redisTemplate.delete(cacheKey);
|
|
|
|
|
if (UPDATE_OPERATE.equals(request.getOperateType())) {
|
|
|
|
|
if (rowRelation.containsKey(request.getFromRecordId())) {
|
|
|
|
|
return updateLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(request.getFromRecordId()));
|
|
|
|
|
if (rowRelation.containsKey(event.getRecordId())) {
|
|
|
|
|
return updateLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(event.getRecordId()));
|
|
|
|
|
}
|
|
|
|
|
} else if (CREATE_OPERATE.equals(request.getOperateType())) {
|
|
|
|
|
return addLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId());
|
|
|
|
|
} else if (DELETE_OPERATE.equals(request.getOperateType())) {
|
|
|
|
|
if (rowRelation.containsKey(request.getFromRecordId())) {
|
|
|
|
|
String cacheKey = String.format("%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, request.getFromTableId(), request.getFromRecordId());
|
|
|
|
|
redisTemplate.delete(cacheKey);
|
|
|
|
|
return deleteLine.replace(":app_token", event.getAppToken()).replace(":table_id", request.getToTableId()).replace(":record_id", rowRelation.get(request.getFromRecordId()));
|
|
|
|
|
if (rowRelation.containsKey(event.getRecordId())) {
|
|
|
|
|
return deleteLine.replace(":app_token", event.getAppToken()).replace(":table_id", event.getTableId()).replace(":record_id", rowRelation.get(event.getRecordId()));
|
|
|
|
|
}
|
|
|
|
|
} else if (DETAIL.equals(request.getOperateType())) {
|
|
|
|
|
return getDetail.replace(":app_token", event.getAppToken()).replace(":table_id", request.getFromTableId()).replace(":record_id", request.getFromRecordId());
|
|
|
|
|
return getDetail.replace(":app_token", event.getAppToken()).replace(":table_id", event.getTableId()).replace(":record_id", event.getRecordId());
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
@ -143,79 +169,68 @@ public class MultidimensionalTableOperate extends LarkAbstract {
|
|
|
|
|
@Override
|
|
|
|
|
protected Map<Object, Object> getBody(LarkRequest request) {
|
|
|
|
|
Map<Object, Object> result = new HashMap<>();
|
|
|
|
|
if (StringUtils.isBlank(request.getMessage())) {
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
String message = request.getMessage();
|
|
|
|
|
JSONObject jsonObject = JSONObject.parseObject(message);
|
|
|
|
|
JSONObject event = jsonObject.getJSONObject("event");
|
|
|
|
|
if (event == null) {
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
request.setFromTableId(event.getString("table_id"));
|
|
|
|
|
JSONArray actionList = event.getJSONArray("action_list");
|
|
|
|
|
if (CollectionUtils.isEmpty(actionList)) {
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
JSONObject action = actionList.getJSONObject(0);
|
|
|
|
|
request.setFromRecordId(action.getString("record_id"));
|
|
|
|
|
if (action.containsKey("before_value") && action.containsKey("after_value")) {
|
|
|
|
|
request.setOperateType(UPDATE_OPERATE);
|
|
|
|
|
result = parseMap(request);
|
|
|
|
|
} else if (action.containsKey("after_value")) {
|
|
|
|
|
request.setOperateType(CREATE_OPERATE);
|
|
|
|
|
result = parseMap(request);
|
|
|
|
|
} else {
|
|
|
|
|
JSONObject record = request.getRecord();
|
|
|
|
|
String responseCode = record.getString("code");
|
|
|
|
|
Map<String, String> rowMap = request.getTableRowRelationMap().get(request.getTableRelationId());
|
|
|
|
|
if ("1254043".equals(responseCode)) {
|
|
|
|
|
request.setOperateType(DELETE_OPERATE);
|
|
|
|
|
} else if ("0".equals(responseCode)) {
|
|
|
|
|
result = parseMap(request);
|
|
|
|
|
if (rowMap.containsKey(request.getEvent().getRecordId())) {
|
|
|
|
|
request.setOperateType(UPDATE_OPERATE);
|
|
|
|
|
} else {
|
|
|
|
|
request.setOperateType(CREATE_OPERATE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Map<Object, Object> parseMap(LarkRequest request) {
|
|
|
|
|
Map<Object, Object> result = new HashMap<>();
|
|
|
|
|
request.setOperateType(DETAIL);
|
|
|
|
|
String message = larkTokenHelper.getLark(getUrl(request), null, request.getToken());
|
|
|
|
|
if (StringUtils.isBlank(message)) {
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
Map<String, String> colRelation = request.getTableRelationMap().getOrDefault(request.getToTableId(),new ArrayList<>()).stream().collect(Collectors.toMap(LarkTableRelation::getFromColName, LarkTableRelation::getToColName, (k1, k2) -> k1));
|
|
|
|
|
JSONObject jsonObject = JSONObject.parseObject(message);
|
|
|
|
|
String fields = jsonObject.getJSONObject("data").getJSONObject("record").getString("fields");
|
|
|
|
|
Map<Object,Object> midMap = JSONObject.parseObject(fields, Map.class);
|
|
|
|
|
JSONObject record = request.getRecord();
|
|
|
|
|
Map<String, String> colRelation = request.getTableColRelationMap().get(request.getToTableId());
|
|
|
|
|
String fields = record.getJSONObject("data").getJSONObject("record").getString("fields");
|
|
|
|
|
Map<Object, Object> midMap = JSONObject.parseObject(fields, Map.class);
|
|
|
|
|
for (Map.Entry<Object, Object> entry : midMap.entrySet()) {
|
|
|
|
|
String key = String.valueOf(entry);
|
|
|
|
|
if (!colRelation.containsKey(key)){
|
|
|
|
|
if (!colRelation.containsKey(key)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
result.put(key,String.valueOf(entry.getValue()));
|
|
|
|
|
result.put(colRelation.get(key), entry.getValue());
|
|
|
|
|
}
|
|
|
|
|
Map<Object, Map<Object, Object>> map = new HashMap<>();
|
|
|
|
|
map.put("fields",result);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected JSONObject send(String type,String url, Map<Object, Object> body,LarkRequest request) {
|
|
|
|
|
protected void send(String type, String url, Map<Object, Object> body, LarkRequest request) {
|
|
|
|
|
String token = request.getToken();
|
|
|
|
|
if (CREATE_OPERATE.equals(type)){
|
|
|
|
|
String result = larkTokenHelper.postLark(url, body, token);
|
|
|
|
|
if (StringUtils.isNotBlank(result)){
|
|
|
|
|
JSONObject jsonObject = JSONObject.parseObject(result);
|
|
|
|
|
JSONObject data = jsonObject.getJSONObject("data");
|
|
|
|
|
if (data != null){
|
|
|
|
|
JSONObject record = data.getJSONObject("record");
|
|
|
|
|
if (record != null && StringUtils.isNotBlank(record.getString("record_id"))){
|
|
|
|
|
String recordId = record.getString("record_id");
|
|
|
|
|
LarkTableRowRelation rowRelation = new LarkTableRowRelation(request.getCompanyRelationId(),request.getFromTableId(),request.getFromRecordId(),request.getToTableId(),recordId);
|
|
|
|
|
|
|
|
|
|
iLarkTableRowRelationService.insertLarkTableRowRelation(rowRelation);
|
|
|
|
|
}
|
|
|
|
|
if (CREATE_OPERATE.equals(type)) {
|
|
|
|
|
JSONObject result = larkTokenHelper.postLark(url, body, token);
|
|
|
|
|
JSONObject data = result.getJSONObject("data");
|
|
|
|
|
if (data != null) {
|
|
|
|
|
JSONObject record = data.getJSONObject("record");
|
|
|
|
|
if (record != null && StringUtils.isNotBlank(record.getString("record_id"))) {
|
|
|
|
|
String recordId = record.getString("record_id");
|
|
|
|
|
LarkTableRowRelation rowRelation = new LarkTableRowRelation(request.getCompanyRelationId(), request.getEvent().getRecordId(), recordId, TableDetailRelationTypeEnum.ROW.getCode(), TableDetailRelationTypeEnum.ROW.getCode());
|
|
|
|
|
iLarkTableRowRelationService.insertLarkTableRowRelation(rowRelation);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}else if (UPDATE_OPERATE.equals(type)){
|
|
|
|
|
} else if (UPDATE_OPERATE.equals(type)) {
|
|
|
|
|
larkTokenHelper.putLark(url, body, token);
|
|
|
|
|
}else if (DELETE_OPERATE.equals(type)){
|
|
|
|
|
} else if (DELETE_OPERATE.equals(type)) {
|
|
|
|
|
larkTokenHelper.deleteLark(url, body, token);
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void endHandle(LarkRequest request) {
|
|
|
|
|
Event event = request.getEvent();
|
|
|
|
|
eventService.updateStatus(event.getId(), EventOperateStatus.SUCCESS.getCode());
|
|
|
|
|
EventLog eventLog = StringUtils.isBlank(request.getErrorMessage()) ?
|
|
|
|
|
new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage())
|
|
|
|
|
: new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage(), request.getErrorCode(), request.getErrorMessage());
|
|
|
|
|
eventLogService.insertEventLog(eventLog);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|