Compare commits

...

5 Commits

@ -23,10 +23,16 @@ public class RedisConstants {
/**
* ticketkey
* CJT_TICKET_REFRESH_CACHE_KEY token
* CJT_TICKET_CACHE_KEY ticket
* CJT_TOKEN_CACHE_KEY token
* CJT_ASYNCHRONOUS
* CJT_CALLBACK_OPERATE
*/
public static final String CJT_TICKET_REFRESH_CACHE_KEY = "CJT_TICKET_REFRESH_CACHE_KEY";
public static final String CJT_TICKET_CACHE_KEY = "TICKET_KEY";
public static final String CJT_TOKEN_CACHE_KEY = "OPEN_TOKEN";
public static final String CJT_ASYNCHRONOUS = "CJT_ASYNCHRONOUS";
public static final String CJT_CALLBACK_OPERATE = "CJT_CALLBACK_OPERATE";
}

@ -9,15 +9,15 @@ public enum CjtCallBackOperateEnum {
/**
*
*/
SALE_DISPATCH_CREATE("SaleDispatchVoucher_Delete", "删除销售出库单",AppType.SYNC_CJT_SALE_DISPATCH_DATA_TO_MULTI_TABLE.getCode()),
SALE_DISPATCH_UPDATE("SaleDispatchVoucher_Delete", "删除销售出库单",AppType.SYNC_CJT_SALE_DISPATCH_DATA_TO_MULTI_TABLE.getCode()),
SALE_DISPATCH_CREATE("SaleDispatchVoucher_Create", "新增销售出库单",AppType.SYNC_CJT_SALE_DISPATCH_DATA_TO_MULTI_TABLE.getCode()),
SALE_DISPATCH_UPDATE("SaleDispatchVoucher_Update", "修改销售出库单",AppType.SYNC_CJT_SALE_DISPATCH_DATA_TO_MULTI_TABLE.getCode()),
SALE_DISPATCH_DELETE("SaleDispatchVoucher_Delete", "删除销售出库单",AppType.SYNC_CJT_SALE_DISPATCH_DATA_TO_MULTI_TABLE.getCode()),
MANUFACTURE_ORDER_CREATE("SaleDispatchVoucher_Delete", "删除销售出库单",AppType.SYNC_CJT_MANUFACTURE_ORDER_DATA_TO_MULTI_TABLE.getCode()),
MANUFACTURE_ORDER_UPDATE("SaleDispatchVoucher_Delete", "删除销售出库单",AppType.SYNC_CJT_MANUFACTURE_ORDER_DATA_TO_MULTI_TABLE.getCode()),
MANUFACTURE_ORDER_DELETE("SaleDispatchVoucher_Delete", "删除销售出库单",AppType.SYNC_CJT_MANUFACTURE_ORDER_DATA_TO_MULTI_TABLE.getCode()),
SALE_ORDER_CREATE("SaleDispatchVoucher_Delete", "删除销售出库单",AppType.SYNC_CJT_SALE_ORDER_DATA_TO_MULTI_TABLE.getCode()),
SALE_ORDER_UPDATE("SaleDispatchVoucher_Delete", "删除销售出库单",AppType.SYNC_CJT_SALE_ORDER_DATA_TO_MULTI_TABLE.getCode()),
SALE_ORDER_DELETE("SaleDispatchVoucher_Delete", "删除销售出库单",AppType.SYNC_CJT_SALE_ORDER_DATA_TO_MULTI_TABLE.getCode());
MANUFACTURE_ORDER_CREATE("ManufactureOrder_Create", "新增加工单",AppType.SYNC_CJT_MANUFACTURE_ORDER_DATA_TO_MULTI_TABLE.getCode()),
MANUFACTURE_ORDER_UPDATE("ManufactureOrder_Update", "修改加工单",AppType.SYNC_CJT_MANUFACTURE_ORDER_DATA_TO_MULTI_TABLE.getCode()),
MANUFACTURE_ORDER_DELETE("ManufactureOrder_Delete", "删除加工单",AppType.SYNC_CJT_MANUFACTURE_ORDER_DATA_TO_MULTI_TABLE.getCode()),
SALE_ORDER_CREATE("SaleOrder_Create", "新增销售订单",AppType.SYNC_CJT_SALE_ORDER_DATA_TO_MULTI_TABLE.getCode()),
SALE_ORDER_UPDATE("SaleOrder_Update", "修改销售订单",AppType.SYNC_CJT_SALE_ORDER_DATA_TO_MULTI_TABLE.getCode()),
SALE_ORDER_DELETE("SaleOrder_Delete", "删除销售订单",AppType.SYNC_CJT_SALE_ORDER_DATA_TO_MULTI_TABLE.getCode());
private final String code;

@ -8,6 +8,7 @@ import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
/**
@ -168,6 +169,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
public static LocalDateTime str2ldt(String time, String pattern) {
if (YYYYMMDD_SECOND.equals(pattern)){
return LocalDate.parse(time, DateTimeFormatter.ofPattern(pattern)).atStartOfDay();
}else if (YYYY_MM_DD.equals(pattern)){
return LocalDate.parse(time, DateTimeFormatter.ofPattern(pattern)).atStartOfDay();
}else {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern);
return LocalDateTime.parse(time, fmt);
@ -185,6 +188,9 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
}
public static Object str2long(String time, String pattern) {
if (StringUtils.isBlank(time)){
return null;
}
LocalDateTime localDateTime = DateUtils.str2ldt(time, pattern);
return DateUtils.ldt2Long(localDateTime);
}

@ -16,6 +16,7 @@ import com.ruoyi.flyingbook.domain.edi.CJTEdiRequestVo;
import com.ruoyi.flyingbook.edi.EdiOperateService;
import com.ruoyi.flyingbook.mapper.ErpLarkTempRelationMapper;
import com.ruoyi.flyingbook.service.IEventLogService;
import com.ruoyi.flyingbook.strategy.cjt.CJTOperateCallBackFactory;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
@ -48,6 +49,8 @@ public class EdiController extends BaseController {
private RedisCache redisCache;
@Autowired
private ErpLarkTempRelationMapper erpLarkTempRelationMapper;
@Autowired
private CJTOperateCallBackFactory cjtOperateCallBackFactory;
/**
*
@ -110,13 +113,15 @@ public class EdiController extends BaseController {
String appKey = jsonObject.getString("appKey");
redisCache.setCacheObject(buildUniqueKey(RedisConstants.CJT_TICKET_CACHE_KEY, appKey), appTicket, 24, TimeUnit.HOURS);
}
}else if ("SaleDispatchVoucher_Delete".equals(msgType)){
log.info("畅捷通删除接口回调");
String voucherCode = bizContent.getString("voucherCode");
CJTEdiCallbackRequestVo cjtEdiCallbackRequestVo = new CJTEdiCallbackRequestVo(msgType, voucherCode);
ediOperateService.cjtCallback(cjtEdiCallbackRequestVo);
}else{
cacheInfo(jsonObject);
}
// else if ("SaleDispatchVoucher_Delete".equals(msgType)){
// log.info("畅捷通删除接口回调");
// String voucherCode = bizContent.getString("voucherCode");
// CJTEdiCallbackRequestVo cjtEdiCallbackRequestVo = new CJTEdiCallbackRequestVo(msgType, voucherCode);
// ediOperateService.cjtCallback(cjtEdiCallbackRequestVo);
// }
else{
cjtOperateCallBackFactory.handle(jsonObject);
}
}
@ -128,7 +133,11 @@ public class EdiController extends BaseController {
erpLarkTempRelation.setMethod(jsonObject.getString("msgType"));
JSONObject bizContent = jsonObject.getJSONObject("bizContent");
if (bizContent != null){
erpLarkTempRelation.setLarkKey(bizContent.getString("voucherID"));
String voucherID = bizContent.getString("voucherID");
if (StringUtils.isBlank(voucherID)){
return;
}
erpLarkTempRelation.setLarkKey(voucherID);
}
erpLarkTempRelation.setRemark(jsonObject.toJSONString());
erpLarkTempRelation.setCreateBy("System");

@ -54,12 +54,50 @@ public class CJTEdiCallbackRequestVo {
*/
private String openToken;
private Boolean retry = Boolean.TRUE;
private Integer retryCount = 0;
/**
*
*/
private LarkCompanyRelation companyRelation;
private LarkTableRelation tableRelation;
public String getLarkAppId(){
return companyRelation.getAppId();
}
public String getLarkAppSecret(){
return companyRelation.getSecret();
}
public String getLarkToAppToken(){
switch (cjtAccountEnum){
case ONE:
return "UvVPbC0HdalNQ0sfJl6clZgZnhf";
case TWO:
return "UBggb0PmVad1mNsKnTFcgsf7nLd";
default:
return null;
}
}
public String getLarkToTableId(){
switch (msgTypeEnum){
case SALE_DISPATCH_DELETE:
case SALE_DISPATCH_UPDATE:
case SALE_DISPATCH_CREATE:
return "tbltlm4b4pYm9QrD";
case SALE_ORDER_CREATE:
case SALE_ORDER_UPDATE:
case SALE_ORDER_DELETE:
return "tblmZTswhz1zVMS1";
case MANUFACTURE_ORDER_CREATE:
case MANUFACTURE_ORDER_UPDATE:
case MANUFACTURE_ORDER_DELETE:
return "tblyecbS3hdmPEE1";
default:
return null;
}
// return tableRelation.getToTableId();
}
/**
* id
*/
@ -71,11 +109,15 @@ public class CJTEdiCallbackRequestVo {
this.voucherCode = voucherCode;
}
public CJTEdiCallbackRequestVo(String appId,String msgType, JSONObject body) {
public CJTEdiCallbackRequestVo(String appId,String msgType, JSONObject body,CjtAccountEnum cjtAccountEnum,CjtCallBackOperateEnum callBackOperateEnum) {
this.msgType = msgType;
this.body = body;
this.appId = appId;
this.cjtAccountEnum = CjtAccountEnum.getByCode(appId);
this.msgTypeEnum = CjtCallBackOperateEnum.getByCode(msgType);
this.cjtAccountEnum = cjtAccountEnum;
this.msgTypeEnum = callBackOperateEnum;
}
public void addRetryCount(){
this.retryCount++;
}
}

@ -0,0 +1,77 @@
package com.ruoyi.flyingbook.mapper;
import com.ruoyi.flyingbook.domain.ErpLarkRelation;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* Mapper
*
* @author ruoyi
* @date 2023-07-17
*/
public interface ErpLarkRelationMainMapper
{
/**
*
*
* @param id ID
* @return
*/
public ErpLarkRelation selectErpLarkRelationById(Long id);
/**
*
*
* @param erpLarkRelation
* @return
*/
public List<ErpLarkRelation> selectErpLarkRelationList(ErpLarkRelation erpLarkRelation);
/**
*
*
* @param erpLarkRelation
* @return
*/
public int insertErpLarkRelation(ErpLarkRelation erpLarkRelation);
/**
*
*
* @param erpLarkRelation
* @return
*/
public int updateErpLarkRelation(ErpLarkRelation erpLarkRelation);
/**
*
*
* @param id ID
* @return
*/
public int deleteErpLarkRelationById(Long id);
/**
*
*
* @param ids ID
* @return
*/
public int deleteErpLarkRelationByIds(@Param("array") List<Long> array);
public List<ErpLarkRelation> queryListByKeyList(@Param("keyList") List<String> keyList,@Param("method") String method);
public List<ErpLarkRelation> queryListByKeyListAndRemark(@Param("keyList") List<String> keyList,@Param("method") String method,@Param("remark") String remark);
public List<String> queryWaitDeleteRecordList(@Param("currentDay") String currentDay,@Param("method") String method,@Param("remark") String remark);
public void deleteRecordList(@Param("currentDay") String currentDay,@Param("method") String method,@Param("remark") String remark);
/**
*
*/
public int batchInsert(@Param("erpLarkRelationList") List<ErpLarkRelation> erpLarkRelationList);
public List<ErpLarkRelation> queryListByKey(@Param("key") String key,@Param("method") String method);
}

@ -31,6 +31,7 @@ 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;
@ -57,35 +58,41 @@ 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){
errorHandle(req,e);
log.error("{} execute error",this.getClass().getSimpleName(),e);
if (req.getRetry() && req.getRetryCount() < 3){
req.addRetryCount();
execute(req);
}else {
errorHandle(req,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"));
@ -112,10 +119,7 @@ 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);
@ -140,8 +144,10 @@ public abstract class CJTOperateCallBackAbstract {
protected abstract String getMethodUrl();
private void initContext(CJTEdiCallbackRequestVo req){
LarkCompanyRelation queryCompany = new LarkCompanyRelation();
LarkCompanyRelation companyRelation = req.getCompanyRelation();
String larkCompanyCode = req.getMsgTypeEnum().getLarkCompanyCode();
if (companyRelation == null){
LarkCompanyRelation queryCompany = new LarkCompanyRelation();
queryCompany.setAppType(larkCompanyCode);
queryCompany.setFlag(FlagStatus.OK.getCode());
queryCompany.setRemark(req.getAppId());
@ -149,8 +155,11 @@ public abstract class CJTOperateCallBackAbstract {
if (CollectionUtils.isEmpty(larkCompanyRelations)){
throw new RuntimeException(String.format("%s 无larkCompany配置信息 appId:%s appType:%s",req.getMsgType(),req.getAppId(),larkCompanyCode));
}
LarkCompanyRelation companyRelation = larkCompanyRelations.get(0);
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());
@ -158,9 +167,10 @@ 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()));
}
LarkTableRelation tableRelation = larkTableRelations.get(0);
tableRelation = larkTableRelations.get(0);
req.setTableRelation(tableRelation);
}
}
private String buildRobotErrorCountMessage(CJTEdiCallbackRequestVo req,Exception e){
JSONObject body = new JSONObject();
@ -178,12 +188,12 @@ public abstract class CJTOperateCallBackAbstract {
return body.toJSONString();
}
protected LarkTableRequest buildLarkTableRequest(LarkCompanyRelation companyRelation,LarkTableRelation tableRelation){
protected LarkTableRequest buildLarkTableRequest(CJTEdiCallbackRequestVo req){
LarkTableRequest request = new LarkTableRequest();
request.setAppId(companyRelation.getAppId());
request.setAppSecret(companyRelation.getSecret());
request.setAppToken(tableRelation.getToAppToken());
request.setAppTable(tableRelation.getToTableId());
request.setAppId(req.getLarkAppId());
request.setAppSecret(req.getLarkAppSecret());
request.setAppToken(req.getLarkToAppToken());
request.setAppTable(req.getLarkToTableId());
return request;
}
@ -191,67 +201,93 @@ public abstract class CJTOperateCallBackAbstract {
protected void addRecord(CJTEdiCallbackRequestVo req, JSONObject returnBody) {
LarkTableRelation tableRelation = req.getTableRelation();
protected void addRecord(CJTEdiCallbackRequestVo req, JSONObject header) {
//多维表格id
String toTableId = tableRelation.getToTableId();
//头部信息
JSONObject header = returnBody.getJSONObject("data");
String toTableId = req.getLarkToTableId();
//明细信息
JSONArray saleOrderDetails = header.getJSONArray(getDetailName());
JSONArray details = header.getJSONArray(getDetailName());
//待创建关联关系
List<ErpLarkRelation> relationList = new ArrayList<>();
LarkTableRequest request = this.buildLarkTableRequest(req.getCompanyRelation(), req.getTableRelation());
LarkTableRequest request = this.buildLarkTableRequest(req);
CjtAccountEnum cjtAccountEnum = req.getCjtAccountEnum();
for (int i = 0; i < saleOrderDetails.size(); i++) {
JSONObject detail = saleOrderDetails.getJSONObject(i);
List<String> errorList = new ArrayList<>();
for (int i = 0; i < details.size(); i++) {
try {
JSONObject detail = details.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()));
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);
}
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 returnBody) {
LarkTableRelation tableRelation = req.getTableRelation();
}
protected void updateRecord(CJTEdiCallbackRequestVo req, JSONObject header) {
//多维表格id
String toTableId = tableRelation.getToTableId();
//头部信息
JSONObject header = returnBody.getJSONObject("data");
String toTableId = req.getLarkToTableId();
//明细信息
JSONArray saleOrderDetails = header.getJSONArray(getDetailName());
JSONArray details = header.getJSONArray(getDetailName());
//待创建关联关系
List<ErpLarkRelation> waitCreateRelationList = new ArrayList<>();
LarkTableRequest request = this.buildLarkTableRequest(req.getCompanyRelation(), req.getTableRelation());
LarkTableRequest request = this.buildLarkTableRequest(req);
CjtAccountEnum cjtAccountEnum = req.getCjtAccountEnum();
//获取已经存在的明细
Map<String, ErpLarkRelation> existMap = getExistRecords(req).stream().collect(Collectors.toMap(ErpLarkRelation::getKey, Function.identity(), (K1, k2) -> K1));
for (int i = 0; i < saleOrderDetails.size(); i++) {
JSONObject detail = saleOrderDetails.getJSONObject(i);
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);
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()));
waitCreateRelationList.add(buildErpLarkRelation(uniqueKey, larkKey, cjtAccountEnum.getCode(),toTableId,req.getVoucherId()));
}catch (Exception e){
errorList.add(e.getMessage());
}
}
}
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();
@ -269,11 +305,13 @@ 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) {
private ErpLarkRelation buildErpLarkRelation(String key, String larkKey, String cjt,String tableId,String cjtId) {
ErpLarkRelation erpLarkRelation = new ErpLarkRelation();
erpLarkRelation.setKey(key);
erpLarkRelation.setCjtId(cjtId);
erpLarkRelation.setLarkKey(larkKey);
erpLarkRelation.setMethod(getRequestUrl());
erpLarkRelation.setLarkTable(tableId);
erpLarkRelation.setMethod(getMethodUrl());
erpLarkRelation.setFlag(FlagStatus.OK.getCode());
erpLarkRelation.setRemark(cjt);
erpLarkRelation.setCreateBy("SYSTEM");
@ -298,15 +336,12 @@ public abstract class CJTOperateCallBackAbstract {
* @param req
*/
protected void deleteRecord(CJTEdiCallbackRequestVo req){
LarkCompanyRelation companyRelation = req.getCompanyRelation();
LarkTableRelation tableRelation = req.getTableRelation();
LarkTableRequest request = new LarkTableRequest(companyRelation.getAppId(), companyRelation.getSecret(), tableRelation.getToAppToken());
LarkTableRequest request = new LarkTableRequest(req.getLarkAppId(), req.getLarkAppSecret(), req.getLarkToAppToken(),null);
Map<String,List<String>> waitDeleteLarkMap = new HashMap<>();
List<ErpLarkRelation> relationList = getExistRecords(req);
List<Long> waitDeleteIdList = new ArrayList<>();
for (ErpLarkRelation record : relationList) {
String[] s = record.getKey().split("_");
String appTable = s[s.length-1];
String appTable = record.getLarkTable();
List<String> waitDeleteLarkList = waitDeleteLarkMap.getOrDefault(appTable, new ArrayList<>());
waitDeleteLarkList.add(record.getLarkKey());
waitDeleteLarkMap.put(appTable,waitDeleteLarkList);
@ -319,6 +354,7 @@ public abstract class CJTOperateCallBackAbstract {
larkTableHelper.deleteTableRecordBatch(request);
}
}
req.setRetry(Boolean.FALSE);
if (CollectionUtils.isNotEmpty(waitDeleteIdList)) {
erpLarkRelationMapper.deleteErpLarkRelationByIds(waitDeleteIdList);
}
@ -374,24 +410,8 @@ 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;
// }
}
/**
*
*/

@ -0,0 +1,91 @@
package com.ruoyi.flyingbook.strategy.cjt;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.enums.CjtAccountEnum;
import com.ruoyi.common.enums.CjtCallBackOperateEnum;
import com.ruoyi.flyingbook.domain.edi.CJTEdiCallbackRequestVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author yuxiangyong
* @create 2023-10-14 10:44
*/
@Component
public class CJTOperateCallBackFactory {
@Autowired
private ManufactureOrderSyncCallOperate manufactureOrderSyncCallOperate;
@Autowired
private SaleDispatchSyncCallOperate saleDispatchSyncCallOperate;
@Autowired
private SaleOrderSyncCallBackOperate saleOrderSyncCallBackOperate;
public void handle(JSONObject jsonObject){
String appKey = jsonObject.getString("appKey");
String msgType = jsonObject.getString("msgType");
JSONObject bizContent = jsonObject.getJSONObject("bizContent");
CjtAccountEnum cjtAccountEnum = CjtAccountEnum.getByAppKey(appKey);
CjtCallBackOperateEnum callBackOperateEnum = CjtCallBackOperateEnum.getByCode(msgType);
if (cjtAccountEnum == null || callBackOperateEnum == null){
return;
}
if (bizContent == null){
return;
}
String voucherID = getVoucherId(bizContent);
if (StringUtils.isBlank(voucherID)){
return;
}
CJTEdiCallbackRequestVo cjtEdiCallbackRequestVo = new CJTEdiCallbackRequestVo(appKey, msgType, bizContent,cjtAccountEnum,callBackOperateEnum);
cjtEdiCallbackRequestVo.setVoucherId(voucherID);
switch (callBackOperateEnum){
case SALE_DISPATCH_CREATE:
case SALE_DISPATCH_UPDATE:
case SALE_DISPATCH_DELETE:
switch (cjtAccountEnum){
case ONE:
saleDispatchSyncCallOperate.execute(cjtEdiCallbackRequestVo);
break;
default:
break;
}
break;
case SALE_ORDER_CREATE:
case SALE_ORDER_UPDATE:
case SALE_ORDER_DELETE:
switch (cjtAccountEnum){
case ONE:
saleOrderSyncCallBackOperate.execute(cjtEdiCallbackRequestVo);
break;
default:
break;
}
break;
case MANUFACTURE_ORDER_CREATE:
case MANUFACTURE_ORDER_UPDATE:
case MANUFACTURE_ORDER_DELETE:
switch (cjtAccountEnum){
case TWO:
manufactureOrderSyncCallOperate.execute(cjtEdiCallbackRequestVo);
break;
default:
break;
}
break;
default:
break;
}
}
private String getVoucherId(JSONObject bizContent){
String voucherID = bizContent.getString("voucherID");
if (StringUtils.isNotBlank(voucherID)){
return voucherID;
}
return bizContent.getString("voucherId");
}
}

@ -1,12 +1,12 @@
package com.ruoyi.flyingbook.strategy.cjt;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.enums.*;
import com.ruoyi.common.enums.CjtAccountEnum;
import com.ruoyi.common.enums.CjtCallBackOperateEnum;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.flyingbook.domain.edi.CJTEdiCallbackRequestVo;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@ -55,9 +55,8 @@ public class ManufactureOrderSyncCallOperate extends CJTOperateCallBackAbstract
sb.append(inventory.get("Code")).append("_");
}
sb.append(detail.get("Quantity")).append("_");
sb.append(getSpecialKey(detail, "pubuserdefnvc2")).append("_");
sb.append(getSpecialKey(detail, "pubuserdefnvc2"));
}
sb.append(toTableId);
return sb.toString();
}
@ -67,29 +66,41 @@ public class ManufactureOrderSyncCallOperate extends CJTOperateCallBackAbstract
Map<String, Object> body = new HashMap<>();
body.put("单据日期", DateUtils.str2long(header.getString("VoucherDate"), DateUtils.YYYY_MM_DD));
body.put("来源单号", detail.getString("SourceVoucherCode"));
body.put("单据编", header.getString("Code"));
body.put("单据编", header.getString("Code"));
//创建时间只有年月日
// body.put("创建时间", DateUtils.str2long(header.getString("CreatedTime"), DateUtils.YYYY_MM_DD));
body.put("创建时间", System.currentTimeMillis());
JSONObject department = detail.getJSONObject("Department");
if (department != null){
body.put("生产车间", department.getString("Name"));
}
JSONObject person = detail.getJSONObject("Person");
if (person != null){
body.put("负责人", person.getString("Name"));
}
JSONObject inventory = detail.getJSONObject("Inventory");
if (inventory != null){
body.put("存货编码", inventory.getString("Code"));
body.put("存货", inventory.getString("Name"));
body.put("规格型号", inventory.getString("Specification"));
}
JSONObject unit = detail.getJSONObject("Unit");
if (unit != null){
body.put("生产单位", unit.getString("Name"));
}
body.put("数量", detail.getDoubleValue("Quantity"));
body.put("备注1", getSpecialKey(detail, "pubuserdefnvc2"));
JSONObject customer = detail.getJSONObject("Customer");
if (customer != null){
body.put("客户", customer.getString("Name"));
}
body.put("合并字段", getSpecialKey(detail, "priuserdefnvc1"));
switch (cjtAccountEnum) {
case ONE:
@ -103,7 +114,7 @@ public class ManufactureOrderSyncCallOperate extends CJTOperateCallBackAbstract
@Override
protected String getRequestUrl() {
return "/tplus/api/v2/ManufactureOrderOpenApi/GetVoucherDTO";
return REQUEST_ROOT_PATH + "/tplus/api/v2/ManufactureOrderOpenApi/GetVoucherDTO";
}
@Override

@ -7,7 +7,8 @@ import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.flyingbook.domain.edi.CJTEdiCallbackRequestVo;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.HashMap;
import java.util.Map;
/**
*
@ -51,8 +52,7 @@ public class SaleDispatchSyncCallOperate extends CJTOperateCallBackAbstract {
sb.append(detail.get("Quantity")).append("_");
sb.append(detail.get("DetailMemo")).append("_");
sb.append(header.get("SaleOrderCode")).append("_");
sb.append(getSpecialKey(detail, "pubuserdefnvc3")).append("_");
sb.append(toTableId);
sb.append(getSpecialKey(detail, "pubuserdefnvc3"));
return sb.toString();
}
@ -71,13 +71,16 @@ public class SaleDispatchSyncCallOperate extends CJTOperateCallBackAbstract {
body.put("配送路线", partner.getString("priuserdefnvc2"));
JSONObject inventory = detail.getJSONObject("Inventory");
if (inventory != null){
body.put("存货编码", inventory.getString("Code"));
body.put("存货", inventory.getString("Name"));
body.put("规格型号", inventory.getString("Specification"));
}
JSONObject unit = detail.getJSONObject("Unit");
if (unit != null){
body.put("计量单位", unit.getString("Name"));
}
body.put("数量", detail.getDoubleValue("Quantity"));
body.put("送货地址", header.getString("DispatchAddress"));
//创建时间只有年月日
@ -102,7 +105,7 @@ public class SaleDispatchSyncCallOperate extends CJTOperateCallBackAbstract {
@Override
protected String getRequestUrl() {
return "/tplus/api/v2/SaleDispatchOpenApi/GetVoucherDTO";
return REQUEST_ROOT_PATH + "/tplus/api/v2/SaleDispatchOpenApi/GetVoucherDTO";
}
@Override

@ -1,12 +1,12 @@
package com.ruoyi.flyingbook.strategy.cjt;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.enums.*;
import com.ruoyi.common.enums.CjtAccountEnum;
import com.ruoyi.common.enums.CjtCallBackOperateEnum;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.flyingbook.domain.edi.CJTEdiCallbackRequestVo;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@ -15,8 +15,8 @@ import java.util.Map;
* @author yuxiangyong
* @create 2023-07-17 21:21
*/
@Component("saleOrderSyncCallBack")
public class SaleOrderSyncCallBack extends CJTOperateCallBackAbstract{
@Component("saleOrderSyncCallBackOperate")
public class SaleOrderSyncCallBackOperate extends CJTOperateCallBackAbstract{
@Override
protected void syncRecord(CJTEdiCallbackRequestVo req, JSONObject returnBody) {
@ -60,9 +60,8 @@ public class SaleOrderSyncCallBack extends CJTOperateCallBackAbstract{
sb.append(inventory.get("Code")).append("_");
}
sb.append(detail.get("Quantity")).append("_");
sb.append(detail.get("DetailMemo")).append("_");
sb.append(detail.get("DetailMemo"));
}
sb.append(toTableId);
return sb.toString();
}
@ -84,12 +83,16 @@ public class SaleOrderSyncCallBack extends CJTOperateCallBackAbstract{
body.put("单据状态", voucherState.getString("Name"));
JSONObject inventory = detail.getJSONObject("Inventory");
if (inventory != null) {
body.put("存货编码", inventory.getString("Code"));
body.put("存货", inventory.getString("Name"));
body.put("规格型号", inventory.getString("Specification"));
}
JSONObject unit = detail.getJSONObject("Unit");
if (unit != null) {
body.put("销售单位", unit.getString("Name"));
}
body.put("数量", detail.getDoubleValue("Quantity"));
body.put("累计执行数量", detail.getDoubleValue("累计执行数量"));
@ -109,7 +112,7 @@ public class SaleOrderSyncCallBack extends CJTOperateCallBackAbstract{
@Override
protected String getRequestUrl() {
return "/tplus/api/v2/SaleOrderOpenApi/GetVoucherDTO";
return REQUEST_ROOT_PATH + "/tplus/api/v2/SaleOrderOpenApi/GetVoucherDTO";
}
@Override

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.flyingbook.mapper.ErpLarkRelationMainMapper">
<resultMap type="com.ruoyi.flyingbook.domain.ErpLarkRelation" id="ErpLarkRelationResult">
<result property="id" column="id"/>
<result property="key" column="key"/>
<result property="method" column="method"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="flag" column="flag"/>
<result property="remark" column="remark"/>
<result property="larkKey" column="lark_key"/>
</resultMap>
<sql id="selectErpLarkRelationVo">
select id, key, method, create_by, create_time, update_by, update_time, flag, remark, lark_key
from erp_lark_relation_main
</sql>
<select id="selectErpLarkRelationList" parameterType="com.ruoyi.flyingbook.domain.ErpLarkRelation"
resultMap="ErpLarkRelationResult">
<include refid="selectErpLarkRelationVo"/>
<where>
<if test="key != null and key != ''">and key = #{key}</if>
<if test="method != null and method != ''">and method = #{method}</if>
<if test="larkKey != null and larkKey != ''">and lark_key = #{larkKey}</if>
<if test="flag != null ">and flag = #{flag}</if>
</where>
</select>
<select id="selectErpLarkRelationById" parameterType="Long" resultMap="ErpLarkRelationResult">
<include refid="selectErpLarkRelationVo"/>
where id = #{id}
</select>
<select id="queryListByKeyList" resultMap="ErpLarkRelationResult">
select `key`, `method`,lark_key
from erp_lark_relation_main
where `method` = #{method} and `key` in
<foreach collection="keyList" open="(" separator="," close=")" item="item">
#{item}
</foreach>
</select>
<select id="queryListByKeyListAndRemark" resultMap="ErpLarkRelationResult">
select `key`, `method`,lark_key
from erp_lark_relation_main
where `method` = #{method} and remark = #{remark} and `key` in
<foreach collection="keyList" open="(" separator="," close=")" item="item">
#{item}
</foreach>
</select>
<select id="queryWaitDeleteRecordList" resultType="java.lang.String">
SELECT lark_key
FROM erp_lark_relation_main
WHERE DATE (create_time) >= #{currentDay}
and remark = #{remark}
and `method` = #{method}
</select>
<delete id="deleteRecordList">
delete FROM erp_lark_relation_main
WHERE DATE (create_time) >= #{currentDay}
and remark = #{remark}
and `method` = #{method}
</delete>
<select id="queryListByKey" resultMap="ErpLarkRelationResult">
select id, `key`, `method`, lark_key
from erp_lark_relation_main
where `method` = #{method}
and `key` like CONCAT('%', #{key}, '%')
</select>
<insert id="insertErpLarkRelation" parameterType="com.ruoyi.flyingbook.domain.ErpLarkRelation"
useGeneratedKeys="true" keyProperty="id">
insert into erp_lark_relation_main
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="key != null">key,</if>
<if test="method != null">method,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="flag != null">flag,</if>
<if test="remark != null">remark,</if>
<if test="larkKey != null">lark_key,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="key != null">#{key},</if>
<if test="method != null">#{method},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="flag != null">#{flag},</if>
<if test="remark != null">#{remark},</if>
<if test="larkKey != null">#{larkKey},</if>
</trim>
</insert>
<insert id="batchInsert" parameterType="com.ruoyi.flyingbook.domain.ErpLarkRelation" useGeneratedKeys="true"
keyProperty="id">
insert into erp_lark_relation_main(`key`,`method`,create_by,create_time,flag,lark_key,remark,update_time)
values
<foreach collection="erpLarkRelationList" item="relation" separator=",">
(
#{relation.key}
,#{relation.method}
,#{relation.createBy}
,#{relation.createTime}
,#{relation.flag}
,#{relation.larkKey}
,#{relation.remark}
,#{relation.updateTime}
)
</foreach>
</insert>
<update id="updateErpLarkRelation" parameterType="com.ruoyi.flyingbook.domain.ErpLarkRelation">
update erp_lark_relation_main
<trim prefix="SET" suffixOverrides=",">
<if test="key != null">key = #{key},</if>
<if test="method != null">method = #{method},</if>
<if test="createBy != null and createBy != ''">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="flag != null">flag = #{flag},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="larkKey != null">lark_key = #{larkKey},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteErpLarkRelationById" parameterType="Long">
delete
from erp_lark_relation_main
where id = #{id}
</delete>
<delete id="deleteErpLarkRelationByIds" parameterType="Long">
delete from erp_lark_relation_main where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

@ -6,6 +6,8 @@
<resultMap type="com.ruoyi.flyingbook.domain.ErpLarkRelation" id="ErpLarkRelationResult">
<result property="id" column="id"/>
<result property="cjtId" column="cjt_id"/>
<result property="larkTable" column="lark_table"/>
<result property="key" column="key"/>
<result property="method" column="method"/>
<result property="createBy" column="create_by"/>
@ -18,18 +20,21 @@
</resultMap>
<sql id="selectErpLarkRelationVo">
select id, key, method, create_by, create_time, update_by, update_time, flag, remark, lark_key
from erp_lark_relation_main
select id,cjt_id, `key`,lark_table, `method`, create_by, create_time, update_by, update_time, flag, remark, lark_key
from erp_lark_relation
</sql>
<select id="selectErpLarkRelationList" parameterType="com.ruoyi.flyingbook.domain.ErpLarkRelation"
resultMap="ErpLarkRelationResult">
<include refid="selectErpLarkRelationVo"/>
<where>
<if test="key != null and key != ''">and key = #{key}</if>
<if test="method != null and method != ''">and method = #{method}</if>
<if test="cjtId != null and cjtId != ''">and cjt_id = #{cjtId}</if>
<if test="larkTable != null and larkTable != ''">and lark_table = #{larkTable}</if>
<if test="key != null and key != ''">and `key` = #{key}</if>
<if test="method != null and method != ''">and `method` = #{method}</if>
<if test="larkKey != null and larkKey != ''">and lark_key = #{larkKey}</if>
<if test="flag != null ">and flag = #{flag}</if>
<if test="remark != null ">and remark = #{remark}</if>
</where>
</select>
@ -39,7 +44,7 @@
</select>
<select id="queryListByKeyList" resultMap="ErpLarkRelationResult">
select `key`, `method`,lark_key
from erp_lark_relation_main
from erp_lark_relation
where `method` = #{method} and `key` in
<foreach collection="keyList" open="(" separator="," close=")" item="item">
#{item}
@ -48,7 +53,7 @@
<select id="queryListByKeyListAndRemark" resultMap="ErpLarkRelationResult">
select `key`, `method`,lark_key
from erp_lark_relation_main
from erp_lark_relation
where `method` = #{method} and remark = #{remark} and `key` in
<foreach collection="keyList" open="(" separator="," close=")" item="item">
#{item}
@ -57,14 +62,14 @@
<select id="queryWaitDeleteRecordList" resultType="java.lang.String">
SELECT lark_key
FROM erp_lark_relation_main
FROM erp_lark_relation
WHERE DATE (create_time) >= #{currentDay}
and remark = #{remark}
and `method` = #{method}
</select>
<delete id="deleteRecordList">
delete FROM erp_lark_relation_main
delete FROM erp_lark_relation
WHERE DATE (create_time) >= #{currentDay}
and remark = #{remark}
and `method` = #{method}
@ -72,17 +77,19 @@
<select id="queryListByKey" resultMap="ErpLarkRelationResult">
select id, `key`, `method`, lark_key
from erp_lark_relation_main
from erp_lark_relation
where `method` = #{method}
and `key` like CONCAT('%', #{key}, '%')
and `key` = #{key}
</select>
<insert id="insertErpLarkRelation" parameterType="com.ruoyi.flyingbook.domain.ErpLarkRelation"
useGeneratedKeys="true" keyProperty="id">
insert into erp_lark_relation_main
insert into erp_lark_relation
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="key != null">key,</if>
<if test="method != null">method,</if>
<if test="cjtId != null and cjtId != ''">cjt_id,</if>
<if test="larkTable != null and larkTable != ''">cjt_id,</if>
<if test="key != null">`key`,</if>
<if test="method != null">`method`,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
@ -92,6 +99,8 @@
<if test="larkKey != null">lark_key,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="cjtId != null and cjtId != ''">#{cjtId},</if>
<if test="larkTable != null and larkTable != ''">#{larkTable},</if>
<if test="key != null">#{key},</if>
<if test="method != null">#{method},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
@ -105,11 +114,13 @@
</insert>
<insert id="batchInsert" parameterType="com.ruoyi.flyingbook.domain.ErpLarkRelation" useGeneratedKeys="true"
keyProperty="id">
insert into erp_lark_relation_main(`key`,`method`,create_by,create_time,flag,lark_key,remark,update_time)
insert into erp_lark_relation(cjt_id,lark_table,`key`,`method`,create_by,create_time,flag,lark_key,remark,update_time)
values
<foreach collection="erpLarkRelationList" item="relation" separator=",">
(
#{relation.key}
#{relation.cjtId}
,#{relation.larkTable}
,#{relation.key}
,#{relation.method}
,#{relation.createBy}
,#{relation.createTime}
@ -122,8 +133,10 @@
</insert>
<update id="updateErpLarkRelation" parameterType="com.ruoyi.flyingbook.domain.ErpLarkRelation">
update erp_lark_relation_main
update erp_lark_relation
<trim prefix="SET" suffixOverrides=",">
<if test="cjtId != null and cjtId != ''">cjt_id = #{cjtId},</if>
<if test="larkTable != null and larkTable != ''">lark_table = #{larkTable},</if>
<if test="key != null">key = #{key},</if>
<if test="method != null">method = #{method},</if>
<if test="createBy != null and createBy != ''">create_by = #{createBy},</if>
@ -141,12 +154,12 @@
<delete id="deleteErpLarkRelationById" parameterType="Long">
delete
from erp_lark_relation_main
from erp_lark_relation
where id = #{id}
</delete>
<delete id="deleteErpLarkRelationByIds" parameterType="Long">
delete from erp_lark_relation_main where id in
delete from erp_lark_relation where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>

@ -50,16 +50,25 @@ public class RefreshTokenJob {
return;
}
for (CjtAccountEnum value : CjtAccountEnum.values()) {
String ticket = resetTicket(value);
generateToken(value,ticket);
getToken(value);
}
}
public String getToken(CjtAccountEnum value){
String ticket = resetTicket(value);
return generateToken(value,ticket);
}
/**
* ticket,
*/
private String resetTicket(CjtAccountEnum value) {
try {
String refreshCacheKey = buildCacheUniqueKey(RedisConstants.CJT_TICKET_REFRESH_CACHE_KEY, value.getAppKey());
Boolean flag = redisCache.setCacheObjectIfAbsent(refreshCacheKey, refreshCacheKey, 5L, TimeUnit.SECONDS);
if (!flag){
return null;
}
String ticketCacheKey = buildCacheUniqueKey(RedisConstants.CJT_TICKET_CACHE_KEY, value.getAppKey());
Object cacheObject = redisCache.getCacheObject(ticketCacheKey);
//重置ticket存在响应时间提前十秒重置
@ -70,7 +79,7 @@ public class RefreshTokenJob {
, value.getAppSecret());
post(cjtRequest);
}
Thread.sleep(5000);
Thread.sleep(3000);
return ticketCacheKey;
} catch (Exception e) {
larkRobotHelper.sendMessageByBot(ROBOT_GROUP, String.format("%s 获取ticket失败请注意",value.getCode(),e));
@ -81,15 +90,14 @@ public class RefreshTokenJob {
/**
* token
*/
private void generateToken(CjtAccountEnum cjtAccountEnum, String ticketKey) {
private String generateToken(CjtAccountEnum cjtAccountEnum, String ticketKey) {
try {
if (StringUtils.isEmpty(ticketKey)){
return;
return null;
}
String ticketCacheKey = (String) redisCache.getCacheObject(ticketKey);
if (!StringUtils.isEmpty(ticketCacheKey)) {
// String tokenCacheKey = buildCacheUniqueKey(RedisConstants.CJT_TOKEN_CACHE_KEY, cjtAccountEnum.getAppKey());
String tokenCacheKey = buildCacheUniqueKey("OPEN_TOKEN_TEST", cjtAccountEnum.getAppKey());
String tokenCacheKey = buildCacheUniqueKey(RedisConstants.CJT_TOKEN_CACHE_KEY, cjtAccountEnum.getAppKey());
CJTRequest cjtRequest = new CJTRequest(REQUEST_GENERATE_TOKEN_PATH
, cjtAccountEnum.getAppKey()
, cjtAccountEnum.getAppSecret()
@ -100,10 +108,12 @@ public class RefreshTokenJob {
JSONObject value = body.getJSONObject("value");
String token = value.getString("accessToken");
redisCache.setCacheObject(tokenCacheKey, token, 24, TimeUnit.HOURS);
return token;
}
}catch (Exception e){
larkRobotHelper.sendMessageByBot(ROBOT_GROUP, String.format("%s 获取token失败请注意",cjtAccountEnum.getCode(),e));
}
return null;
}
private String buildCacheUniqueKey(String key, String appKey) {

@ -11,11 +11,10 @@ import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.flyingbook.LarkHelper.LarkRobotHelper;
import com.ruoyi.flyingbook.LarkHelper.LarkTableHelper;
import com.ruoyi.flyingbook.domain.ErpLarkRelation;
import com.ruoyi.flyingbook.domain.ErpLarkTempRelation;
import com.ruoyi.flyingbook.domain.LarkCompanyRelation;
import com.ruoyi.flyingbook.domain.LarkTableRelation;
import com.ruoyi.flyingbook.domain.lark.LarkTableRequest;
import com.ruoyi.flyingbook.mapper.ErpLarkRelationMapper;
import com.ruoyi.flyingbook.mapper.ErpLarkRelationMainMapper;
import com.ruoyi.flyingbook.mapper.LarkCompanyRelationMapper;
import com.ruoyi.flyingbook.mapper.LarkTableRelationMapper;
import com.ruoyi.quartz.domain.*;
@ -49,7 +48,7 @@ public abstract class SyncAccountsJobAbstract {
@Autowired
private RedisCache redisCache;
@Autowired
protected ErpLarkRelationMapper erpLarkRelationMapper;
protected ErpLarkRelationMainMapper erpLarkRelationMapper;
@Autowired
private LarkCompanyRelationMapper larkCompanyRelationMapper;
@Autowired
@ -64,6 +63,8 @@ public abstract class SyncAccountsJobAbstract {
DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
TransactionDefinition transactionDefinition;
@Autowired
private RefreshTokenJob refreshTokenJob;
@Value("${lark.robot.group}")
private String ROBOT_GROUP;
@ -152,7 +153,7 @@ public abstract class SyncAccountsJobAbstract {
//初始化飞书信息及相关配置
initLarkInfo(context);
//重置ticket
resetTicket(context);
// resetTicket(context);
//执行分页同步
sync(context);
} catch (Exception e) {
@ -562,23 +563,23 @@ public abstract class SyncAccountsJobAbstract {
* ticket,
*/
private void resetTicket(CJTJobContext context) {
String ticketCacheKey = buildCacheUniqueKey(RedisConstants.CJT_TICKET_CACHE_KEY, context.getAppKey());
Long expireTime = redisCache.getExpireTime(ticketCacheKey);
//重置ticket存在响应时间提前十秒重置
if (expireTime == null || expireTime < 10) {
log.info("重置ticket");
CJTRequest cjtRequest = new CJTRequest(REQUEST_RESET_TICKET_PATH
, context.getAppKey()
, context.getAppSecret());
post(cjtRequest);
}
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
String ticket = (String) redisCache.getCacheObject(ticketCacheKey);
context.setTicket(ticket);
// String ticketCacheKey = buildCacheUniqueKey(RedisConstants.CJT_TICKET_CACHE_KEY, context.getAppKey());
// Long expireTime = redisCache.getExpireTime(ticketCacheKey);
// //重置ticket存在响应时间提前十秒重置
// if (expireTime == null || expireTime < 10) {
// log.info("重置ticket");
// CJTRequest cjtRequest = new CJTRequest(REQUEST_RESET_TICKET_PATH
// , context.getAppKey()
// , context.getAppSecret());
// post(cjtRequest);
// }
// try {
// Thread.sleep(1000);
// } catch (Exception e) {
// e.printStackTrace();
// }
// String ticket = (String) redisCache.getCacheObject(ticketCacheKey);
// context.setTicket(ticket);
}
/**
@ -588,24 +589,27 @@ public abstract class SyncAccountsJobAbstract {
String tokenCacheKey = buildCacheUniqueKey(RedisConstants.CJT_TOKEN_CACHE_KEY, context.getAppKey());
String openToken = (String) redisCache.getCacheObject(tokenCacheKey);
if (StringUtils.isEmpty(openToken)) {
CJTRequest cjtRequest = new CJTRequest(REQUEST_GENERATE_TOKEN_PATH
, context.getAppKey()
, context.getAppSecret()
, context.getTicket()
, context.getCertificate());
cjtRequest.buildGenerateBody();
JSONObject body = JSONObject.parseObject(post(cjtRequest));
JSONObject value = body.getJSONObject("value");
String token = value.getString("accessToken");
context.setOpenToken(token);
redisCache.setCacheObject(tokenCacheKey, token, 5, TimeUnit.MINUTES);
return token;
CjtAccountEnum cjtAccountEnum = cjtAccount(context.getCjt());
waitForToken(cjtAccountEnum);
return refreshTokenJob.getToken(cjtAccountEnum);
} else {
context.setOpenToken(openToken);
return openToken;
}
}
private void waitForToken(CjtAccountEnum cjtAccountEnum){
try {
String refreshCacheKey = buildCacheUniqueKey(RedisConstants.CJT_TICKET_REFRESH_CACHE_KEY, cjtAccountEnum.getAppKey());
Long expireTime = redisCache.getExpireTime(refreshCacheKey);
if (expireTime != null && expireTime > 0){
Thread.sleep(expireTime);
}
}catch (Exception e){
log.info("",e);
}
}
/**
* token
*/

@ -13,7 +13,7 @@ import com.ruoyi.flyingbook.domain.ErpLarkRelation;
import com.ruoyi.flyingbook.domain.LarkCompanyRelation;
import com.ruoyi.flyingbook.domain.LarkTableRelation;
import com.ruoyi.flyingbook.domain.lark.LarkTableRequest;
import com.ruoyi.flyingbook.mapper.ErpLarkRelationMapper;
import com.ruoyi.flyingbook.mapper.ErpLarkRelationMainMapper;
import com.ruoyi.flyingbook.mapper.LarkCompanyRelationMapper;
import com.ruoyi.flyingbook.mapper.LarkTableRelationMapper;
import com.ruoyi.quartz.domain.OdooContext;
@ -43,7 +43,7 @@ import static java.util.Collections.emptyMap;
@Slf4j
public abstract class OdooAbstrackob {
@Autowired
protected ErpLarkRelationMapper erpLarkRelationMapper;
protected ErpLarkRelationMainMapper erpLarkRelationMapper;
@Autowired
private LarkCompanyRelationMapper larkCompanyRelationMapper;
@Autowired

Loading…
Cancel
Save