|
|
|
@ -31,7 +31,6 @@ import org.springframework.util.StringUtils;
|
|
|
|
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
import java.util.function.Function;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
@ -58,41 +57,35 @@ public abstract class CJTOperateCallBackAbstract {
|
|
|
|
|
protected ErpLarkTempRelationMapper erpLarkTempRelationMapper;
|
|
|
|
|
@Value("${lark.robot.group}")
|
|
|
|
|
private String ROBOT_GROUP;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 畅捷通域名
|
|
|
|
|
*/
|
|
|
|
|
protected static final String REQUEST_ROOT_PATH = "https://openapi.chanjet.com";
|
|
|
|
|
/**
|
|
|
|
|
* 重置畅捷通ticket的接口
|
|
|
|
|
*/
|
|
|
|
|
private static final String REQUEST_RESET_TICKET_PATH = REQUEST_ROOT_PATH + "/auth/appTicket/resend";
|
|
|
|
|
/**
|
|
|
|
|
* 生成调用畅捷通接口的token信息
|
|
|
|
|
*/
|
|
|
|
|
private static final String REQUEST_GENERATE_TOKEN_PATH = REQUEST_ROOT_PATH + "/v1/common/auth/selfBuiltApp/generateToken";
|
|
|
|
|
|
|
|
|
|
public void execute(CJTEdiCallbackRequestVo req){
|
|
|
|
|
String operateCallBackFlag = buildCacheUniqueKey(RedisConstants.CJT_CALLBACK_OPERATE, req.getAppId() + req.getMsgType() + req.getVoucherId());
|
|
|
|
|
try {
|
|
|
|
|
Boolean operateFlag = redisCache.setCacheObjectIfAbsent(operateCallBackFlag, operateCallBackFlag, 10L, TimeUnit.MINUTES);
|
|
|
|
|
if (!operateFlag){
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
preHandle(req);
|
|
|
|
|
initContext(req);
|
|
|
|
|
// resetTicket(req);
|
|
|
|
|
sync(req);
|
|
|
|
|
endHandle(req);
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
log.error("{} execute error",this.getClass().getSimpleName(),e);
|
|
|
|
|
if (req.getRetry() && req.getRetryCount() < 3){
|
|
|
|
|
req.addRetryCount();
|
|
|
|
|
execute(req);
|
|
|
|
|
}else {
|
|
|
|
|
errorHandle(req,e);
|
|
|
|
|
log.error("{} execute error",this.getClass().getSimpleName(),e);
|
|
|
|
|
larkRobotHelper.sendMessageByBot(ROBOT_GROUP, buildRobotErrorCountMessage(req,e));
|
|
|
|
|
}
|
|
|
|
|
}finally {
|
|
|
|
|
redisCache.deleteObject(operateCallBackFlag);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void preHandle(CJTEdiCallbackRequestVo req){
|
|
|
|
|
if (req.getRetryCount() > 0){
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Date date = new Date();
|
|
|
|
|
ErpLarkTempRelation erpLarkTempRelation = new ErpLarkTempRelation();
|
|
|
|
|
erpLarkTempRelation.setKey(req.getBody().getString("voucherID"));
|
|
|
|
@ -119,7 +112,10 @@ public abstract class CJTOperateCallBackAbstract {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void sync(CJTEdiCallbackRequestVo req){
|
|
|
|
|
JSONObject body = req.getBody();
|
|
|
|
|
CjtAccountEnum cjtAccountEnum = req.getCjtAccountEnum();
|
|
|
|
|
String voucherID = body.getString("voucherID");
|
|
|
|
|
req.setVoucherId(voucherID);
|
|
|
|
|
LarkCJTRequestBody cjtRequestBody = new LarkCJTRequestBody(req.getVoucherId());
|
|
|
|
|
LarkCJTRequest cjtRequest = new LarkCJTRequest(getRequestUrl(), cjtAccountEnum.getAppKey(), cjtAccountEnum.getAppSecret(), generateToken(req),cjtRequestBody);
|
|
|
|
|
LarkOkHttpHelper.post(cjtRequest);
|
|
|
|
@ -144,10 +140,8 @@ public abstract class CJTOperateCallBackAbstract {
|
|
|
|
|
protected abstract String getMethodUrl();
|
|
|
|
|
|
|
|
|
|
private void initContext(CJTEdiCallbackRequestVo req){
|
|
|
|
|
LarkCompanyRelation companyRelation = req.getCompanyRelation();
|
|
|
|
|
String larkCompanyCode = req.getMsgTypeEnum().getLarkCompanyCode();
|
|
|
|
|
if (companyRelation == null){
|
|
|
|
|
LarkCompanyRelation queryCompany = new LarkCompanyRelation();
|
|
|
|
|
String larkCompanyCode = req.getMsgTypeEnum().getLarkCompanyCode();
|
|
|
|
|
queryCompany.setAppType(larkCompanyCode);
|
|
|
|
|
queryCompany.setFlag(FlagStatus.OK.getCode());
|
|
|
|
|
queryCompany.setRemark(req.getAppId());
|
|
|
|
@ -155,11 +149,8 @@ public abstract class CJTOperateCallBackAbstract {
|
|
|
|
|
if (CollectionUtils.isEmpty(larkCompanyRelations)){
|
|
|
|
|
throw new RuntimeException(String.format("%s 无larkCompany配置信息 appId:%s appType:%s",req.getMsgType(),req.getAppId(),larkCompanyCode));
|
|
|
|
|
}
|
|
|
|
|
companyRelation = larkCompanyRelations.get(0);
|
|
|
|
|
LarkCompanyRelation companyRelation = larkCompanyRelations.get(0);
|
|
|
|
|
req.setCompanyRelation(companyRelation);
|
|
|
|
|
}
|
|
|
|
|
LarkTableRelation tableRelation = req.getTableRelation();
|
|
|
|
|
if (tableRelation == null){
|
|
|
|
|
LarkTableRelation queryTable = new LarkTableRelation();
|
|
|
|
|
queryTable.setLarkCompanyRelationId(companyRelation.getId());
|
|
|
|
|
queryTable.setFlag(FlagStatus.OK.getCode());
|
|
|
|
@ -167,10 +158,9 @@ public abstract class CJTOperateCallBackAbstract {
|
|
|
|
|
if (CollectionUtils.isEmpty(larkTableRelations)){
|
|
|
|
|
throw new RuntimeException(String.format("%s 无larkTableRelation配置信息 appId:%s appType:%s larkCompanyId:%s",req.getMsgType(),req.getAppId(),larkCompanyCode,companyRelation.getId()));
|
|
|
|
|
}
|
|
|
|
|
tableRelation = larkTableRelations.get(0);
|
|
|
|
|
LarkTableRelation tableRelation = larkTableRelations.get(0);
|
|
|
|
|
req.setTableRelation(tableRelation);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String buildRobotErrorCountMessage(CJTEdiCallbackRequestVo req,Exception e){
|
|
|
|
|
JSONObject body = new JSONObject();
|
|
|
|
@ -188,12 +178,12 @@ public abstract class CJTOperateCallBackAbstract {
|
|
|
|
|
return body.toJSONString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected LarkTableRequest buildLarkTableRequest(CJTEdiCallbackRequestVo req){
|
|
|
|
|
protected LarkTableRequest buildLarkTableRequest(LarkCompanyRelation companyRelation,LarkTableRelation tableRelation){
|
|
|
|
|
LarkTableRequest request = new LarkTableRequest();
|
|
|
|
|
request.setAppId(req.getLarkAppId());
|
|
|
|
|
request.setAppSecret(req.getLarkAppSecret());
|
|
|
|
|
request.setAppToken(req.getLarkToAppToken());
|
|
|
|
|
request.setAppTable(req.getLarkToTableId());
|
|
|
|
|
request.setAppId(companyRelation.getAppId());
|
|
|
|
|
request.setAppSecret(companyRelation.getSecret());
|
|
|
|
|
request.setAppToken(tableRelation.getToAppToken());
|
|
|
|
|
request.setAppTable(tableRelation.getToTableId());
|
|
|
|
|
return request;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -201,93 +191,67 @@ public abstract class CJTOperateCallBackAbstract {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected void addRecord(CJTEdiCallbackRequestVo req, JSONObject header) {
|
|
|
|
|
protected void addRecord(CJTEdiCallbackRequestVo req, JSONObject returnBody) {
|
|
|
|
|
LarkTableRelation tableRelation = req.getTableRelation();
|
|
|
|
|
//多维表格id
|
|
|
|
|
String toTableId = req.getLarkToTableId();
|
|
|
|
|
String toTableId = tableRelation.getToTableId();
|
|
|
|
|
//头部信息
|
|
|
|
|
JSONObject header = returnBody.getJSONObject("data");
|
|
|
|
|
//明细信息
|
|
|
|
|
JSONArray details = header.getJSONArray(getDetailName());
|
|
|
|
|
JSONArray saleOrderDetails = header.getJSONArray(getDetailName());
|
|
|
|
|
//待创建关联关系
|
|
|
|
|
List<ErpLarkRelation> relationList = new ArrayList<>();
|
|
|
|
|
LarkTableRequest request = this.buildLarkTableRequest(req);
|
|
|
|
|
LarkTableRequest request = this.buildLarkTableRequest(req.getCompanyRelation(), req.getTableRelation());
|
|
|
|
|
CjtAccountEnum cjtAccountEnum = req.getCjtAccountEnum();
|
|
|
|
|
List<String> errorList = new ArrayList<>();
|
|
|
|
|
for (int i = 0; i < details.size(); i++) {
|
|
|
|
|
try {
|
|
|
|
|
JSONObject detail = details.getJSONObject(i);
|
|
|
|
|
for (int i = 0; i < saleOrderDetails.size(); i++) {
|
|
|
|
|
JSONObject detail = saleOrderDetails.getJSONObject(i);
|
|
|
|
|
String uniqueKey = buildUniqueKey(toTableId, header, detail,cjtAccountEnum);
|
|
|
|
|
Map<String, Object> larkBody = buildLarkBody(header, detail,cjtAccountEnum);
|
|
|
|
|
request.setBody(larkBody);
|
|
|
|
|
CreateAppTableRecordRespBody respBody = larkTableHelper.addTableRecord(request);
|
|
|
|
|
String larkKey = respBody.getRecord().getRecordId();
|
|
|
|
|
relationList.add(buildErpLarkRelation(uniqueKey, larkKey, cjtAccountEnum.getCode(),toTableId,req.getVoucherId()));
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
errorList.add(e.getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (CollectionUtils.isEmpty(errorList)){
|
|
|
|
|
req.setRetry(Boolean.FALSE);
|
|
|
|
|
relationList.add(buildErpLarkRelation(uniqueKey, larkKey, cjtAccountEnum.getCode()));
|
|
|
|
|
}
|
|
|
|
|
if (!org.springframework.util.CollectionUtils.isEmpty(relationList)) {
|
|
|
|
|
erpLarkRelationMapper.batchInsert(relationList);
|
|
|
|
|
}
|
|
|
|
|
if (CollectionUtils.isNotEmpty(errorList)){
|
|
|
|
|
throw new RuntimeException(String.join(",",errorList));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void updateRecord(CJTEdiCallbackRequestVo req, JSONObject header) {
|
|
|
|
|
protected void updateRecord(CJTEdiCallbackRequestVo req, JSONObject returnBody) {
|
|
|
|
|
LarkTableRelation tableRelation = req.getTableRelation();
|
|
|
|
|
//多维表格id
|
|
|
|
|
String toTableId = req.getLarkToTableId();
|
|
|
|
|
String toTableId = tableRelation.getToTableId();
|
|
|
|
|
//头部信息
|
|
|
|
|
JSONObject header = returnBody.getJSONObject("data");
|
|
|
|
|
//明细信息
|
|
|
|
|
JSONArray details = header.getJSONArray(getDetailName());
|
|
|
|
|
JSONArray saleOrderDetails = header.getJSONArray(getDetailName());
|
|
|
|
|
//待创建关联关系
|
|
|
|
|
List<ErpLarkRelation> waitCreateRelationList = new ArrayList<>();
|
|
|
|
|
LarkTableRequest request = this.buildLarkTableRequest(req);
|
|
|
|
|
LarkTableRequest request = this.buildLarkTableRequest(req.getCompanyRelation(), req.getTableRelation());
|
|
|
|
|
CjtAccountEnum cjtAccountEnum = req.getCjtAccountEnum();
|
|
|
|
|
//获取已经存在的明细
|
|
|
|
|
Map<String, ErpLarkRelation> existMap = getExistRecords(req).stream().collect(Collectors.toMap(ErpLarkRelation::getKey, Function.identity(), (K1, k2) -> K1));
|
|
|
|
|
if (existMap != null && existMap.size() > 0){
|
|
|
|
|
List<ErpLarkRelation> collect = existMap.values().stream().collect(Collectors.toList());
|
|
|
|
|
toTableId = collect.get(0).getLarkTable();
|
|
|
|
|
}
|
|
|
|
|
List<String> errorList = new ArrayList<>();
|
|
|
|
|
for (int i = 0; i < details.size(); i++) {
|
|
|
|
|
JSONObject detail = details.getJSONObject(i);
|
|
|
|
|
for (int i = 0; i < saleOrderDetails.size(); i++) {
|
|
|
|
|
JSONObject detail = saleOrderDetails.getJSONObject(i);
|
|
|
|
|
String uniqueKey = buildUniqueKey(toTableId, header, detail,cjtAccountEnum);
|
|
|
|
|
Map<String, Object> larkBody = buildLarkBody(header, detail,cjtAccountEnum);
|
|
|
|
|
request.setBody(larkBody);
|
|
|
|
|
if (existMap.containsKey(uniqueKey)){
|
|
|
|
|
try {
|
|
|
|
|
ErpLarkRelation erpLarkRelation = existMap.get(uniqueKey);
|
|
|
|
|
request.setRecord(erpLarkRelation.getLarkKey());
|
|
|
|
|
request.setAppTable(erpLarkRelation.getLarkTable());
|
|
|
|
|
larkTableHelper.updateTableRecord(request);
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
errorList.add(e.getMessage());
|
|
|
|
|
}
|
|
|
|
|
}else {
|
|
|
|
|
try {
|
|
|
|
|
request.setRecord(null);
|
|
|
|
|
request.setAppTable(toTableId);
|
|
|
|
|
CreateAppTableRecordRespBody respBody = larkTableHelper.addTableRecord(request);
|
|
|
|
|
String larkKey = respBody.getRecord().getRecordId();
|
|
|
|
|
waitCreateRelationList.add(buildErpLarkRelation(uniqueKey, larkKey, cjtAccountEnum.getCode(),toTableId,req.getVoucherId()));
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
errorList.add(e.getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
waitCreateRelationList.add(buildErpLarkRelation(uniqueKey, larkKey, cjtAccountEnum.getCode()));
|
|
|
|
|
}
|
|
|
|
|
if (CollectionUtils.isEmpty(errorList)){
|
|
|
|
|
req.setRetry(Boolean.FALSE);
|
|
|
|
|
}
|
|
|
|
|
if (!org.springframework.util.CollectionUtils.isEmpty(waitCreateRelationList)) {
|
|
|
|
|
erpLarkRelationMapper.batchInsert(waitCreateRelationList);
|
|
|
|
|
}
|
|
|
|
|
if (CollectionUtils.isNotEmpty(errorList)){
|
|
|
|
|
throw new RuntimeException(String.join(",",errorList));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected abstract String getDetailName();
|
|
|
|
@ -305,13 +269,11 @@ public abstract class CJTOperateCallBackAbstract {
|
|
|
|
|
protected abstract Map<String, Object> buildLarkBody(JSONObject header, JSONObject detail,CjtAccountEnum cjtAccountEnum);
|
|
|
|
|
|
|
|
|
|
//构建飞书行与cjt唯一键的对应关系对象
|
|
|
|
|
private ErpLarkRelation buildErpLarkRelation(String key, String larkKey, String cjt,String tableId,String cjtId) {
|
|
|
|
|
private ErpLarkRelation buildErpLarkRelation(String key, String larkKey, String cjt) {
|
|
|
|
|
ErpLarkRelation erpLarkRelation = new ErpLarkRelation();
|
|
|
|
|
erpLarkRelation.setKey(key);
|
|
|
|
|
erpLarkRelation.setCjtId(cjtId);
|
|
|
|
|
erpLarkRelation.setLarkKey(larkKey);
|
|
|
|
|
erpLarkRelation.setLarkTable(tableId);
|
|
|
|
|
erpLarkRelation.setMethod(getMethodUrl());
|
|
|
|
|
erpLarkRelation.setMethod(getRequestUrl());
|
|
|
|
|
erpLarkRelation.setFlag(FlagStatus.OK.getCode());
|
|
|
|
|
erpLarkRelation.setRemark(cjt);
|
|
|
|
|
erpLarkRelation.setCreateBy("SYSTEM");
|
|
|
|
@ -336,12 +298,15 @@ public abstract class CJTOperateCallBackAbstract {
|
|
|
|
|
* @param req
|
|
|
|
|
*/
|
|
|
|
|
protected void deleteRecord(CJTEdiCallbackRequestVo req){
|
|
|
|
|
LarkTableRequest request = new LarkTableRequest(req.getLarkAppId(), req.getLarkAppSecret(), req.getLarkToAppToken(),null);
|
|
|
|
|
LarkCompanyRelation companyRelation = req.getCompanyRelation();
|
|
|
|
|
LarkTableRelation tableRelation = req.getTableRelation();
|
|
|
|
|
LarkTableRequest request = new LarkTableRequest(companyRelation.getAppId(), companyRelation.getSecret(), tableRelation.getToAppToken());
|
|
|
|
|
Map<String,List<String>> waitDeleteLarkMap = new HashMap<>();
|
|
|
|
|
List<ErpLarkRelation> relationList = getExistRecords(req);
|
|
|
|
|
List<Long> waitDeleteIdList = new ArrayList<>();
|
|
|
|
|
for (ErpLarkRelation record : relationList) {
|
|
|
|
|
String appTable = record.getLarkTable();
|
|
|
|
|
String[] s = record.getKey().split("_");
|
|
|
|
|
String appTable = s[s.length-1];
|
|
|
|
|
List<String> waitDeleteLarkList = waitDeleteLarkMap.getOrDefault(appTable, new ArrayList<>());
|
|
|
|
|
waitDeleteLarkList.add(record.getLarkKey());
|
|
|
|
|
waitDeleteLarkMap.put(appTable,waitDeleteLarkList);
|
|
|
|
@ -354,7 +319,6 @@ public abstract class CJTOperateCallBackAbstract {
|
|
|
|
|
larkTableHelper.deleteTableRecordBatch(request);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
req.setRetry(Boolean.FALSE);
|
|
|
|
|
if (CollectionUtils.isNotEmpty(waitDeleteIdList)) {
|
|
|
|
|
erpLarkRelationMapper.deleteErpLarkRelationByIds(waitDeleteIdList);
|
|
|
|
|
}
|
|
|
|
@ -410,8 +374,24 @@ public abstract class CJTOperateCallBackAbstract {
|
|
|
|
|
}else {
|
|
|
|
|
throw new RuntimeException("token不存在");
|
|
|
|
|
}
|
|
|
|
|
// if (StringUtils.isEmpty(openToken)) {
|
|
|
|
|
// LarkCJTRequest cjtRequest = new LarkCJTRequest(REQUEST_GENERATE_TOKEN_PATH
|
|
|
|
|
// , cjtAccountEnum.getAppKey()
|
|
|
|
|
// , cjtAccountEnum.getAppSecret()
|
|
|
|
|
// , req.getTicket()
|
|
|
|
|
// , cjtAccountEnum.getCertificate());
|
|
|
|
|
// cjtRequest.buildGenerateBody();
|
|
|
|
|
// JSONObject body = JSONObject.parseObject(LarkOkHttpHelper.post(cjtRequest));
|
|
|
|
|
// JSONObject value = body.getJSONObject("value");
|
|
|
|
|
// String token = value.getString("accessToken");
|
|
|
|
|
// req.setOpenToken(token);
|
|
|
|
|
// redisCache.setCacheObject(tokenCacheKey, token, 5, TimeUnit.MINUTES);
|
|
|
|
|
// return token;
|
|
|
|
|
// } else {
|
|
|
|
|
// req.setOpenToken(openToken);
|
|
|
|
|
// return openToken;
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 请求接口并序列化返回对象
|
|
|
|
|
*/
|
|
|
|
|