|
|
|
@ -0,0 +1,232 @@
|
|
|
|
|
package com.ruoyi.flyingbook.strategy.operate;
|
|
|
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
import com.lark.oapi.service.bitable.v1.model.AppTableField;
|
|
|
|
|
import com.lark.oapi.service.bitable.v1.model.CreateAppTableRecordRespBody;
|
|
|
|
|
import com.lark.oapi.service.bitable.v1.model.GetAppTableRecordResp;
|
|
|
|
|
import com.ruoyi.common.constant.RedisConstants;
|
|
|
|
|
import com.ruoyi.common.enums.*;
|
|
|
|
|
import com.ruoyi.flyingbook.LarkHelper.LarkTableFieldHelper;
|
|
|
|
|
import com.ruoyi.flyingbook.LarkHelper.LarkTableHelper;
|
|
|
|
|
import com.ruoyi.flyingbook.domain.*;
|
|
|
|
|
import com.ruoyi.flyingbook.domain.lark.LarkTableFieldRequest;
|
|
|
|
|
import com.ruoyi.flyingbook.domain.lark.LarkTableRequest;
|
|
|
|
|
import com.ruoyi.flyingbook.service.*;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 多维表格操作类_表单同步
|
|
|
|
|
*
|
|
|
|
|
* @author yuxiangyong
|
|
|
|
|
* @create 2023-03-13 20:47
|
|
|
|
|
*/
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class MultidimensionalTableOperate extends LarkAbstract {
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
protected LarkTableHelper larkTokenHelper;
|
|
|
|
|
@Autowired
|
|
|
|
|
protected LarkTableFieldHelper larkTableFieldHelper;
|
|
|
|
|
@Autowired
|
|
|
|
|
protected ILarkCompanyRelationService larkCompanyRelationService;
|
|
|
|
|
@Autowired
|
|
|
|
|
protected IEventService iEventService;
|
|
|
|
|
@Autowired
|
|
|
|
|
protected RedisTemplate redisTemplate;
|
|
|
|
|
@Autowired
|
|
|
|
|
protected ILarkTableRelationService iLarkTableRelationService;
|
|
|
|
|
@Autowired
|
|
|
|
|
protected ILarkTableRowRelationService iLarkTableRowRelationService;
|
|
|
|
|
@Autowired
|
|
|
|
|
protected IEventService eventService;
|
|
|
|
|
@Autowired
|
|
|
|
|
protected IEventLogService eventLogService;
|
|
|
|
|
/**
|
|
|
|
|
* 新增明细行
|
|
|
|
|
*/
|
|
|
|
|
protected static final String CREATE_OPERATE = "CREATE_OPERATE";
|
|
|
|
|
/**
|
|
|
|
|
* 修改明细行
|
|
|
|
|
*/
|
|
|
|
|
protected static final String UPDATE_OPERATE = "UPDATE_OPERATE";
|
|
|
|
|
/**
|
|
|
|
|
* 删除明细行
|
|
|
|
|
*/
|
|
|
|
|
protected static final String DELETE_OPERATE = "DELETE_OPERATE";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected void fillTableRelation(RequestVo request) {
|
|
|
|
|
//主表与副表的列对应关系
|
|
|
|
|
List<Long> tableRelationIdList = new ArrayList<>();
|
|
|
|
|
Map<String, Long> tableRelationMap = new HashMap<>();
|
|
|
|
|
for (LarkTableRelation larkTableRelation : request.getLarkTableRelations()) {
|
|
|
|
|
String to = String.format("%s_%s", larkTableRelation.getToAppToken(), larkTableRelation.getToTableId());
|
|
|
|
|
tableRelationMap.put(to, larkTableRelation.getId());
|
|
|
|
|
tableRelationIdList.add(larkTableRelation.getId());
|
|
|
|
|
}
|
|
|
|
|
request.setTableRelationMap(tableRelationMap);
|
|
|
|
|
//主表与副表的行对应关系
|
|
|
|
|
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) {
|
|
|
|
|
if (TableDetailRelationTypeEnum.ROW.getCode().equals(larkTableRowRelation.getType())) {
|
|
|
|
|
Map<String, String> map = tableRowRelationMap.getOrDefault(larkTableRowRelation.getTableRelationId(),new HashMap<>());
|
|
|
|
|
map.put(larkTableRowRelation.getFromId(), larkTableRowRelation.getToId());
|
|
|
|
|
tableRowRelationMap.put(larkTableRowRelation.getTableRelationId(), map);
|
|
|
|
|
} else if (TableDetailRelationTypeEnum.COL.getCode().equals(larkTableRowRelation.getType())) {
|
|
|
|
|
Map<String, String> map = tableColRelationMap.getOrDefault(larkTableRowRelation.getTableRelationId(),new HashMap<>());
|
|
|
|
|
map.put(larkTableRowRelation.getFromId(), larkTableRowRelation.getToId());
|
|
|
|
|
tableColRelationMap.put(larkTableRowRelation.getTableRelationId(), map);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (tableColRelationMap.isEmpty()) {
|
|
|
|
|
String errorMessage = String.format("tableId:{} 列关系未配置", request.getEvent().getTableId());
|
|
|
|
|
log.error("iLarkTableRowRelationService.queryListByTableRelationIdList:{}", errorMessage);
|
|
|
|
|
throw new RuntimeException(errorMessage);
|
|
|
|
|
}
|
|
|
|
|
request.setTableRowRelationMap(tableRowRelationMap);
|
|
|
|
|
request.setTableColRelationMap(tableColRelationMap);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void preOperate(RequestVo request) {
|
|
|
|
|
//关联关系表填充
|
|
|
|
|
this.fillTableRelation(request);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void businessProcessing(RequestVo request) {
|
|
|
|
|
Event event = request.getEvent();
|
|
|
|
|
String cacheKey = String.format("%s_%s_%s_%s", RedisConstants.MULTIPLE_TABLE_RECORD, event.getAppToken(), event.getTableId(), event.getRecordId());
|
|
|
|
|
redisTemplate.delete(cacheKey);
|
|
|
|
|
LarkTableRequest detailRequest = new LarkTableRequest(request.getAppId(), request.getAppSecret(), event.getAppToken(), event.getTableId(), event.getRecordId());
|
|
|
|
|
detailRequest.setSafeCode(Arrays.asList(1254043));
|
|
|
|
|
GetAppTableRecordResp recordDetail = larkTokenHelper.getTableRecordDetail(detailRequest);
|
|
|
|
|
request.setRespBody(recordDetail);
|
|
|
|
|
for (Map.Entry<String, Long> entry : request.getTableRelationMap().entrySet()) {
|
|
|
|
|
String[] arr = entry.getKey().split("_");
|
|
|
|
|
request.setToAppToken(arr[0]);
|
|
|
|
|
request.setToTableId(arr[1]);
|
|
|
|
|
request.setTableRelationId(entry.getValue());
|
|
|
|
|
send(request);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected Map<String, Object> getBody(RequestVo request) {
|
|
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
|
|
GetAppTableRecordResp respBody = request.getRespBody();
|
|
|
|
|
int responseCode = respBody.getCode();
|
|
|
|
|
Map<String, String> rowMap = request.getTableRowRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>());
|
|
|
|
|
if (1254043 == responseCode) {
|
|
|
|
|
request.setOperateType(DELETE_OPERATE);
|
|
|
|
|
} else if (0 == responseCode) {
|
|
|
|
|
result = parseMap(request);
|
|
|
|
|
if (rowMap.containsKey(request.getEvent().getRecordId())) {
|
|
|
|
|
request.setOperateType(UPDATE_OPERATE);
|
|
|
|
|
} else {
|
|
|
|
|
request.setOperateType(CREATE_OPERATE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (result.isEmpty() && DELETE_OPERATE != request.getOperateType()){
|
|
|
|
|
throw new RuntimeException("post 的body为空,请检查映射参数");
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 对两个表的列进行映射
|
|
|
|
|
*/
|
|
|
|
|
private Map<String, Object> parseMap(RequestVo request) {
|
|
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
|
|
LarkTableFieldRequest tableFieldRequest = new LarkTableFieldRequest(request.getAppId(),request.getAppSecret(),request.getEvent().getAppToken(),request.getEvent().getTableId());
|
|
|
|
|
Map<String, AppTableField> tableFieldDetail = larkTableFieldHelper.getTableFieldDetail(tableFieldRequest);
|
|
|
|
|
Map<String, String> colRelation = request.getTableColRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>());
|
|
|
|
|
Map<String, Object> midMap = request.getRespBody().getData().getRecord().getFields();
|
|
|
|
|
for (Map.Entry<String, Object> entry : midMap.entrySet()) {
|
|
|
|
|
String key = String.valueOf(entry.getKey());
|
|
|
|
|
if (!colRelation.containsKey(key)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
AppTableField appTableField = tableFieldDetail.get(key);
|
|
|
|
|
if (appTableField != null && TableFieldTypeEnum.FORMULA.getCode().equals(appTableField.getType())){
|
|
|
|
|
List<JSONObject> objects = (List<JSONObject>) entry.getValue();
|
|
|
|
|
Map<String,Object> map = (Map)objects.get(0);
|
|
|
|
|
result.put(colRelation.get(key), map.get("text"));
|
|
|
|
|
}else {
|
|
|
|
|
result.put(colRelation.get(key), entry.getValue());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void send(RequestVo request) {
|
|
|
|
|
|
|
|
|
|
Map<String, Object> body = getBody(request);
|
|
|
|
|
String type = request.getOperateType();
|
|
|
|
|
Event event = request.getEvent();
|
|
|
|
|
|
|
|
|
|
request.setOperateInfo(String.valueOf(body));
|
|
|
|
|
Map<String, String> rowRelationMap = request.getTableRowRelationMap().getOrDefault(request.getTableRelationId(), new HashMap<>());
|
|
|
|
|
if (CREATE_OPERATE.equals(type)) {
|
|
|
|
|
LarkTableRequest add = new LarkTableRequest(request.getAppId(), request.getAppSecret(), request.getToAppToken(), request.getToTableId(), body);
|
|
|
|
|
CreateAppTableRecordRespBody addResp = larkTokenHelper.addTableRecord(add);
|
|
|
|
|
if (addResp != null) {
|
|
|
|
|
String recordId = addResp.getRecord().getRecordId();
|
|
|
|
|
LarkTableRowRelation rowRelation = new LarkTableRowRelation(request.getCompanyRelationId(), event.getRecordId(), recordId, TableDetailRelationTypeEnum.ROW.getCode(), TableDetailRelationTypeEnum.ROW.getCode());
|
|
|
|
|
iLarkTableRowRelationService.insertLarkTableRowRelation(rowRelation);
|
|
|
|
|
}
|
|
|
|
|
request.setEventOperateType(EventOperateType.CREATE);
|
|
|
|
|
} else if (UPDATE_OPERATE.equals(type)) {
|
|
|
|
|
request.setEventOperateType(EventOperateType.UPDATE);
|
|
|
|
|
|
|
|
|
|
LarkTableRequest update = new LarkTableRequest(request.getAppId(), request.getAppSecret(), request.getToAppToken(), request.getToTableId(),rowRelationMap.get(request.getEvent().getRecordId()), body);
|
|
|
|
|
larkTokenHelper.updateTableRecord(update);
|
|
|
|
|
} else if (DELETE_OPERATE.equals(type)) {
|
|
|
|
|
request.setEventOperateType(EventOperateType.DELETE);
|
|
|
|
|
LarkTableRequest delete = new LarkTableRequest(request.getAppId(), request.getAppSecret(), request.getToAppToken(), request.getToTableId(),rowRelationMap.get(request.getEvent().getRecordId()));
|
|
|
|
|
larkTokenHelper.deleteTableRecord(delete);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void endHandle(RequestVo request) {
|
|
|
|
|
Event event = request.getEvent();
|
|
|
|
|
EventLog eventLog = null;
|
|
|
|
|
if (StringUtils.isBlank(request.getErrorMessage())) {
|
|
|
|
|
eventService.updateStatus(event.getId(), EventOperateStatus.SUCCESS.getCode(), event.getNumbers());
|
|
|
|
|
eventLog = new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage());
|
|
|
|
|
} else {
|
|
|
|
|
eventService.updateStatus(event.getId(), EventOperateStatus.PENDING.getCode(), event.getNumbers() + 1);
|
|
|
|
|
if (request.getEventOperateType() != null) {
|
|
|
|
|
eventLog = new EventLog(event.getId(), request.getEventOperateType().getCode(), request.getMessage(), request.getErrorCode(), request.getErrorMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (eventLog != null) {
|
|
|
|
|
eventLog.setOperateInfo(request.getOperateType());
|
|
|
|
|
eventLogService.insertEventLog(eventLog);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected String buildResult(RequestVo request) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected String getName() {
|
|
|
|
|
return this.getClass().getSimpleName();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|