From a5c9796320805cc4648765e10020d77fab59a60c Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Fri, 1 Sep 2023 16:09:25 +0800 Subject: [PATCH] =?UTF-8?q?=E7=95=85=E6=8D=B7=E9=80=9A=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LarkHelper/LarkTableHelper.java | 25 +++ .../domain/ErpLarkTempRelation.java | 34 ++++ .../domain/lark/LarkTableRequest.java | 3 +- .../mapper/ErpLarkRelationMapper.java | 1 + .../mapper/ErpLarkTempRelationMapper.java | 71 +++++++ .../service/IErpLarkTempRelationService.java | 63 ++++++ .../impl/ErpLarkTempRelationServiceImpl.java | 97 +++++++++ .../mapper/ErpLarkRelationMapper.xml | 2 + .../mapper/ErpLarkTempRelationMapper.xml | 115 +++++++++++ .../quartz/controller/MailInfoController.java | 4 +- .../ruoyi/quartz/task/CJT/SyncReportJob.java | 192 +++++++++++------- 11 files changed, 531 insertions(+), 76 deletions(-) create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/ErpLarkTempRelation.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/ErpLarkTempRelationMapper.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IErpLarkTempRelationService.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/ErpLarkTempRelationServiceImpl.java create mode 100644 ruoyi-flyingbook/src/main/resources/mapper/ErpLarkTempRelationMapper.xml diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java index 108f296..508b0c3 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableHelper.java @@ -182,6 +182,31 @@ public class LarkTableHelper extends LarkHelper{ } } + public BatchCreateAppTableRecordRespBody addTableRecordBatch(LarkTableRequest request) { + BatchCreateAppTableRecordResp batchCreateAppTableRecordResp = null; + try { + batchCreateAppTableRecordResp = buildClient(request).bitable().appTableRecord() + .batchCreate( + BatchCreateAppTableRecordReq.newBuilder() + .appToken(request.getAppToken()) + .tableId(request.getAppTable()) + .batchCreateAppTableRecordReqBody( + BatchCreateAppTableRecordReqBody.newBuilder() + .records(request.getAppTableRecords()) + .build() + ) + .build() + ); + } catch (Exception e) { + throw new RuntimeException(new LarkException("LarkTableHelper.addTableRecord",e.getMessage(),request).getErrorMessageBody()); + } + if (batchCreateAppTableRecordResp != null && batchCreateAppTableRecordResp.getCode() == 0){ + return batchCreateAppTableRecordResp.getData(); + }else { + throw new RuntimeException(new LarkException("LarkTableHelper.addTableRecordBatch",batchCreateAppTableRecordResp.getMsg(),request).getErrorMessageBody()); + } + } + public DeleteAppTableRecordRespBody deleteTableRecord(LarkTableRequest request) { DeleteAppTableRecordResp delete = null; try { diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/ErpLarkTempRelation.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/ErpLarkTempRelation.java new file mode 100644 index 0000000..0e01a40 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/ErpLarkTempRelation.java @@ -0,0 +1,34 @@ +package com.ruoyi.flyingbook.domain; + +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; + +/** + * 【请填写功能名称】对象 erp_lark_temp_relation + * + * @author ruoyi + * @date 2023-09-01 + */ +@Data +public class ErpLarkTempRelation extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 唯一键,判断新增删除的依据 */ + private String key; + + /** 飞书行id */ + private String larkKey; + + /** 数据来源 */ + private String method; + + /** + * @see com.ruoyi.common.enums.FlagStatus + */ + private Long flag; + +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkTableRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkTableRequest.java index 348731a..d1b97f2 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkTableRequest.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkTableRequest.java @@ -1,6 +1,7 @@ package com.ruoyi.flyingbook.domain.lark; import com.lark.oapi.service.bitable.v1.model.AppTableCreateHeader; +import com.lark.oapi.service.bitable.v1.model.AppTableRecord; import lombok.Data; import lombok.NoArgsConstructor; @@ -23,7 +24,7 @@ public class LarkTableRequest extends LarkRequest{ private String defaultViewName; private Map body; private AppTableCreateHeader[] fields; - + private AppTableRecord[] appTableRecords; public LarkTableRequest(String appId,String appSecret,String tableName) { super(appId,appSecret); this.tableName = tableName; diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/ErpLarkRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/ErpLarkRelationMapper.java index f4f6b17..1f71f0a 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/ErpLarkRelationMapper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/ErpLarkRelationMapper.java @@ -46,6 +46,7 @@ public interface ErpLarkRelationMapper */ public int updateErpLarkRelation(ErpLarkRelation erpLarkRelation); + /** * 删除【请填写功能名称】 * diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/ErpLarkTempRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/ErpLarkTempRelationMapper.java new file mode 100644 index 0000000..163ab0f --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/ErpLarkTempRelationMapper.java @@ -0,0 +1,71 @@ +package com.ruoyi.flyingbook.mapper; + + +import com.ruoyi.flyingbook.domain.ErpLarkTempRelation; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2023-09-01 + */ +public interface ErpLarkTempRelationMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public ErpLarkTempRelation selectErpLarkTempRelationById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param erpLarkTempRelation 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectErpLarkTempRelationList(ErpLarkTempRelation erpLarkTempRelation); + + /** + * 新增【请填写功能名称】 + * + * @param erpLarkTempRelation 【请填写功能名称】 + * @return 结果 + */ + public int insertErpLarkTempRelation(ErpLarkTempRelation erpLarkTempRelation); + + /** + * 修改【请填写功能名称】 + * + * @param erpLarkTempRelation 【请填写功能名称】 + * @return 结果 + */ + public int updateErpLarkTempRelation(ErpLarkTempRelation erpLarkTempRelation); + + /** + * 删除【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteErpLarkTempRelationById(Long id); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteErpLarkTempRelationByIds(Long[] ids); + + public int updateByMethod(@Param("method") String method, @Param("flag") Long flag); + + public int deleteByMethod(@Param("method") String method,@Param("flag") Long flag); + + public int batchInsert(@Param("erpLarkTempRelationList") List erpLarkTempRelationList); + +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IErpLarkTempRelationService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IErpLarkTempRelationService.java new file mode 100644 index 0000000..84a8bba --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IErpLarkTempRelationService.java @@ -0,0 +1,63 @@ +package com.ruoyi.flyingbook.service; + + +import com.ruoyi.flyingbook.domain.ErpLarkTempRelation; + +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2023-09-01 + */ +public interface IErpLarkTempRelationService +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + public ErpLarkTempRelation selectErpLarkTempRelationById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param erpLarkTempRelation 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectErpLarkTempRelationList(ErpLarkTempRelation erpLarkTempRelation); + + /** + * 新增【请填写功能名称】 + * + * @param erpLarkTempRelation 【请填写功能名称】 + * @return 结果 + */ + public int insertErpLarkTempRelation(ErpLarkTempRelation erpLarkTempRelation); + + /** + * 修改【请填写功能名称】 + * + * @param erpLarkTempRelation 【请填写功能名称】 + * @return 结果 + */ + public int updateErpLarkTempRelation(ErpLarkTempRelation erpLarkTempRelation); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + public int deleteErpLarkTempRelationByIds(Long[] ids); + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + public int deleteErpLarkTempRelationById(Long id); +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/ErpLarkTempRelationServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/ErpLarkTempRelationServiceImpl.java new file mode 100644 index 0000000..3b59daa --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/ErpLarkTempRelationServiceImpl.java @@ -0,0 +1,97 @@ +package com.ruoyi.flyingbook.service.impl; + +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.flyingbook.domain.ErpLarkTempRelation; +import com.ruoyi.flyingbook.mapper.ErpLarkTempRelationMapper; +import com.ruoyi.flyingbook.service.IErpLarkTempRelationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2023-09-01 + */ +@Service +public class ErpLarkTempRelationServiceImpl implements IErpLarkTempRelationService +{ + @Autowired + private ErpLarkTempRelationMapper erpLarkTempRelationMapper; + + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】ID + * @return 【请填写功能名称】 + */ + @Override + public ErpLarkTempRelation selectErpLarkTempRelationById(Long id) + { + return erpLarkTempRelationMapper.selectErpLarkTempRelationById(id); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param erpLarkTempRelation 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectErpLarkTempRelationList(ErpLarkTempRelation erpLarkTempRelation) + { + return erpLarkTempRelationMapper.selectErpLarkTempRelationList(erpLarkTempRelation); + } + + /** + * 新增【请填写功能名称】 + * + * @param erpLarkTempRelation 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertErpLarkTempRelation(ErpLarkTempRelation erpLarkTempRelation) + { + erpLarkTempRelation.setCreateTime(DateUtils.getNowDate()); + return erpLarkTempRelationMapper.insertErpLarkTempRelation(erpLarkTempRelation); + } + + /** + * 修改【请填写功能名称】 + * + * @param erpLarkTempRelation 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateErpLarkTempRelation(ErpLarkTempRelation erpLarkTempRelation) + { + erpLarkTempRelation.setUpdateTime(DateUtils.getNowDate()); + return erpLarkTempRelationMapper.updateErpLarkTempRelation(erpLarkTempRelation); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteErpLarkTempRelationByIds(Long[] ids) + { + return erpLarkTempRelationMapper.deleteErpLarkTempRelationByIds(ids); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】ID + * @return 结果 + */ + @Override + public int deleteErpLarkTempRelationById(Long id) + { + return erpLarkTempRelationMapper.deleteErpLarkTempRelationById(id); + } +} diff --git a/ruoyi-flyingbook/src/main/resources/mapper/ErpLarkRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/ErpLarkRelationMapper.xml index 7509669..ddf6af6 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/ErpLarkRelationMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/ErpLarkRelationMapper.xml @@ -136,6 +136,8 @@ where id = #{id} + + delete from erp_lark_relation diff --git a/ruoyi-flyingbook/src/main/resources/mapper/ErpLarkTempRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/ErpLarkTempRelationMapper.xml new file mode 100644 index 0000000..0978915 --- /dev/null +++ b/ruoyi-flyingbook/src/main/resources/mapper/ErpLarkTempRelationMapper.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + select id, key, lark_key, method, create_by, create_time, update_by, update_time, flag, remark from erp_lark_temp_relation + + + + + + + + insert into erp_lark_temp_relation + + key, + lark_key, + method, + create_by, + create_time, + update_by, + update_time, + flag, + remark, + + + #{key}, + #{larkKey}, + #{method}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{flag}, + #{remark}, + + + + + update erp_lark_temp_relation + + key = #{key}, + lark_key = #{larkKey}, + method = #{method}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + flag = #{flag}, + remark = #{remark}, + + where id = #{id} + + + + delete from erp_lark_temp_relation where id = #{id} + + + + delete from erp_lark_temp_relation where id in + + #{id} + + + + + update erp_lark_relation + set flag = #{flag} + where method = #{method} + + + + delete from erp_lark_relation + where method = #{method} and flag = #{flag} + + + + insert into erp_lark_temp_relation(lark_key,`method`,create_by,create_time,flag) + values + ( + #{item.larkKey}, + #{item.method}, + #{item.createBy}, + #{item.createTime}, + #{item.flag} + ) + + + \ No newline at end of file diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/MailInfoController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/MailInfoController.java index 98c8638..d591bea 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/MailInfoController.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/MailInfoController.java @@ -58,9 +58,9 @@ public class MailInfoController extends BaseController { public void scheduledReminders(Integer number,String cjt) { // odoo(number); // if (number > 10){ -// cjtCreateLarkTableJob.execute(); + cjtCreateLarkTableJob.execute(); // }else { - cjt(number,cjt); +// cjt(number,cjt); // } } diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SyncReportJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SyncReportJob.java index 8e0dafd..0ff711d 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SyncReportJob.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SyncReportJob.java @@ -1,33 +1,32 @@ package com.ruoyi.quartz.task.CJT; import com.alibaba.fastjson.JSONObject; -import com.lark.oapi.service.bitable.v1.model.CreateAppTableRecordRespBody; +import com.lark.oapi.service.bitable.v1.model.AppTableRecord; +import com.lark.oapi.service.bitable.v1.model.BatchCreateAppTableRecordRespBody; import com.ruoyi.common.constant.RedisConstants; import com.ruoyi.common.core.redis.RedisCache; -import com.ruoyi.common.enums.*; -import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.enums.AppType; +import com.ruoyi.common.enums.CjtAccountEnum; +import com.ruoyi.common.enums.FlagStatus; +import com.ruoyi.common.enums.TableRelationTypeEnum; 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.ErpLarkTempRelationMapper; import com.ruoyi.flyingbook.mapper.LarkCompanyRelationMapper; import com.ruoyi.flyingbook.mapper.LarkTableRelationMapper; import com.ruoyi.quartz.domain.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; import static com.ruoyi.quartz.helper.OkHttpHelper.post; @@ -38,22 +37,20 @@ import static com.ruoyi.quartz.helper.OkHttpHelper.post; * @create 2023-07-17 20:29 */ @Slf4j -public abstract class SyncReportJob { +public class SyncReportJob { @Autowired private RedisCache redisCache; @Autowired - protected ErpLarkRelationMapper erpLarkRelationMapper; - @Autowired private LarkCompanyRelationMapper larkCompanyRelationMapper; @Autowired private LarkTableRelationMapper larkTableRelationMapper; @Autowired + private ErpLarkTempRelationMapper erpLarkTempRelationMapper; + @Autowired private LarkTableHelper larkTableHelper; @Autowired private LarkRobotHelper larkRobotHelper; - @Autowired - private CJTCreateLarkTableJob cjtCreateLarkTableJob; @Value("${lark.robot.group}") private String ROBOT_GROUP; @Value("${sync.flag}") @@ -95,8 +92,10 @@ public abstract class SyncReportJob { initLarkInfo(context); //重置ticket resetTicket(context); + preSync(context); //执行分页同步 sync(context); + finish(context); } catch (Exception e) { log.error("{} 执行失败", getClassName(), e); larkRobotHelper.sendMessageByBot(ROBOT_GROUP, buildRobotErrorCountMessage(e)); @@ -113,7 +112,7 @@ public abstract class SyncReportJob { JSONObject jsonObject = new JSONObject(); jsonObject.put("同步报表任务", getClassName()); String errorMessage = e.getMessage(); - if (org.apache.commons.lang3.StringUtils.isNotBlank(errorMessage)) { + if (StringUtils.isNotBlank(errorMessage)) { errorMessage = errorMessage.replaceAll("\\\\", ""); } jsonObject.put("异常信息", errorMessage); @@ -153,15 +152,12 @@ public abstract class SyncReportJob { /** * 获取待查询的字段 */ - protected String getQueryFields(){ + protected String getQueryFields() { return "Warehouse,InventoryCode,Inventory,BaseQuantity,canuseBaseQuantity"; - }; + } + ; - /** - * 获取查询条件 - */ - protected abstract String getQueryKey(); /** * 获取当前执行类名 @@ -170,76 +166,102 @@ public abstract class SyncReportJob { return this.getClass().getSimpleName(); } - ; - /** * 同步数据 * * @param context */ protected void sync(CJTJobContext context) { - String errorMessage = null; - + List errorMessageList = new ArrayList<>(); JSONObject cjtRequestReport = new JSONObject(); - CJTRequestReportBody cjtRequestBody = new CJTRequestReportBody(0, PAGE_SIZE, getReportName(),getQueryFields()); + CJTRequestReportBody cjtRequestBody = new CJTRequestReportBody(0, PAGE_SIZE, getReportName(), getQueryFields()); cjtRequestReport.put("request", cjtRequestBody); CJTRequest cjtRequest = buildCJTRequest(context, cjtRequestReport); + List pageList = new ArrayList<>(); + LarkCompanyRelation companyRelation = context.getCompanyRelation(); LarkTableRelation tableRelation = context.getTableRelation(); LarkTableRequest addRecordRequest = new LarkTableRequest(companyRelation.getAppId(), companyRelation.getSecret(), tableRelation.getToAppToken(), tableRelation.getToTableId()); - List rows = new ArrayList<>(); + Boolean flag = Boolean.TRUE; do { try { - cjtRequest.setOpenToken(generateToken(context)); - //请求接口并序列化数据 - CJTResponseReportBodyDetail bodyDetail = request(cjtRequest); - //实际返回数据 - rows = bodyDetail.getRows(); - if (!CollectionUtils.isEmpty(rows)) { - //批量同步飞书 - List errorCodeList = syncLarkBatch(rows, addRecordRequest, context.getCjt()); - if (!CollectionUtils.isEmpty(errorCodeList)) { - String errorKey = String.join(",", errorCodeList); - throw new RuntimeException(String.format("存在同步失败的记录 %s", errorKey)); - } - } + flag = executeDetail(context, cjtRequest, addRecordRequest); } catch (Exception e) { log.error("{} exception", this.getClassName(), e); - errorMessage = buildErrorBody(cjtRequest, e.getMessage()); + pageList.add(cjtRequestBody.getPageIndex()); } finally { cjtRequestBody.addPage(); } - } while (!CollectionUtils.isEmpty(rows)); - if (!StringUtils.isEmpty(errorMessage)) { - throw new RuntimeException(errorMessage); + } while (flag); + for (Integer pageIndex : pageList) { + try { + cjtRequestBody.setPageIndex(pageIndex); + executeDetail(context, cjtRequest, addRecordRequest); + } catch (Exception e) { + errorMessageList.add(String.valueOf(pageIndex)); + } + } + if (CollectionUtils.isNotEmpty(errorMessageList)) { + throw new RuntimeException(buildErrorBody(cjtRequest, errorMessageList)); } } + private void preSync(CJTJobContext context) { + erpLarkTempRelationMapper.updateByMethod(getReportName(), FlagStatus.DELETED.getCode()); + } - private Object changeValueType(String value, CJTSyncTypeRelation cjtSyncTypeRelation) { - TableFieldTypeEnum type = cjtSyncTypeRelation.getType(); - if (org.apache.commons.lang3.StringUtils.isBlank(value) || type == null) { - return value; + private void finish(CJTJobContext context) { + try { + LarkCompanyRelation companyRelation = context.getCompanyRelation(); + LarkTableRelation tableRelation = context.getTableRelation(); + LarkTableRequest request = new LarkTableRequest(companyRelation.getAppId(), companyRelation.getSecret(), tableRelation.getToAppToken(), tableRelation.getToTableId()); + ErpLarkTempRelation query = new ErpLarkTempRelation(); + query.setMethod(getReportName()); + query.setFlag(FlagStatus.DELETED.getCode()); + List erpLarkTempRelations = erpLarkTempRelationMapper.selectErpLarkTempRelationList(query); + List larkKeyList = new ArrayList<>(); + for (ErpLarkTempRelation erpLarkTempRelation : erpLarkTempRelations) { + String larkKey = erpLarkTempRelation.getLarkKey(); + if (StringUtils.isBlank(larkKey)) { + continue; + } + larkKeyList.add(larkKey); + if (larkKeyList.size() == 500) { + request.setRecords(larkKeyList.toArray(new String[0])); + larkTableHelper.deleteTableRecordBatch(request); + larkKeyList = new ArrayList<>(); + } + } + erpLarkTempRelationMapper.deleteByMethod(getReportName(), FlagStatus.DELETED.getCode()); + } catch (Exception e) { + log.info("Sync report job finish error", e); } + } - switch (type) { - case NUMBER: - return Double.valueOf(value); - case DATE: - LocalDateTime localDateTime = DateUtils.str2ldt(value, cjtSyncTypeRelation.getPattern()); - return DateUtils.ldt2Long(localDateTime); - default: - return value; + private Boolean executeDetail(CJTJobContext context, CJTRequest cjtRequest, LarkTableRequest addRecordRequest) { + cjtRequest.setOpenToken(generateToken(context)); + //请求接口并序列化数据 + CJTResponseReportBodyDetail bodyDetail = request(cjtRequest); + //实际返回数据 + List rows = bodyDetail.getRows(); + if (CollectionUtils.isNotEmpty(rows)) { + //批量同步飞书 + List errorCodeList = syncLarkBatch(rows, addRecordRequest, context.getCjt()); + if (!CollectionUtils.isEmpty(errorCodeList)) { + String errorKey = String.join(",", errorCodeList); + throw new RuntimeException(String.format("存在同步失败的记录 %s", errorKey)); + } } + return CollectionUtils.isNotEmpty(rows); } - protected Map buildLarkBody(CJTResponseReportBodyDetailRow rowDetail){ + protected Map buildLarkBody(CJTResponseReportBodyDetailRow rowDetail) { Map body = new HashMap<>(); - body.put("仓库",rowDetail.getWarehouse()); - body.put("存货编码",rowDetail.getInventoryCode()); - body.put("现存量",rowDetail.getBaseQuantity()); - body.put("可用量",rowDetail.getCanuseBaseQuantity()); + body.put("仓库", rowDetail.getWarehouse()); + body.put("存货编码", rowDetail.getInventoryCode()); + body.put("现存量", rowDetail.getBaseQuantity()); + body.put("可用量", rowDetail.getCanuseBaseQuantity()); return body; } @@ -247,21 +269,45 @@ public abstract class SyncReportJob { * 执行字段映射 */ protected List syncLarkBatch(List rows, LarkTableRequest addRecordRequest, String cjt) { - //错误唯一键 List errorKey = new ArrayList<>(); - for (CJTResponseReportBodyDetailRow row : rows) { - try { + try { + //错误唯一键 + List list = new ArrayList<>(); + List waitCreateList = new ArrayList<>(); + for (CJTResponseReportBodyDetailRow row : rows) { Map body = buildLarkBody(row); addRecordRequest.setBody(body); + AppTableRecord appTableRecord = new AppTableRecord(); + appTableRecord.setFields(body); + list.add(appTableRecord); + } + if (CollectionUtils.isNotEmpty(list)){ + addRecordRequest.setAppTableRecords(list.toArray(new AppTableRecord[0])); //在飞书创建一行,并根据创建返回的行id在本地保留一条映射纪律 - larkTableHelper.addTableRecord(addRecordRequest); - } catch (Exception e) { - log.error("{} addOrUpdate exception", this.getClassName(), e); + BatchCreateAppTableRecordRespBody resp = larkTableHelper.addTableRecordBatch(addRecordRequest); + for (AppTableRecord record : resp.getRecords()) { + buildTempList(waitCreateList,record.getRecordId()); + } + if (CollectionUtils.isNotEmpty(waitCreateList)){ + erpLarkTempRelationMapper.batchInsert(waitCreateList); + } } + } catch (Exception e) { + log.error("{} addOrUpdate exception", this.getClassName(), e); } return errorKey; } + private void buildTempList(List waitCreateList,String recordId){ + ErpLarkTempRelation erpLarkTempRelation = new ErpLarkTempRelation(); + erpLarkTempRelation.setCreateTime(new Date()); + erpLarkTempRelation.setCreateBy("System"); + erpLarkTempRelation.setMethod(getReportName()); + erpLarkTempRelation.setFlag(FlagStatus.OK.getCode()); + erpLarkTempRelation.setLarkKey(recordId); + waitCreateList.add(erpLarkTempRelation); + } + private String buildCacheUniqueKey(String key, String appKey) { return String.format("%s:%s", key, appKey); @@ -296,7 +342,7 @@ public abstract class SyncReportJob { private String generateToken(CJTJobContext context) { String tokenCacheKey = buildCacheUniqueKey(RedisConstants.CJT_TOKEN_CACHE_KEY, context.getAppKey()); String openToken = (String) redisCache.getCacheObject(tokenCacheKey); - if (StringUtils.isEmpty(openToken)) { + if (StringUtils.isBlank(openToken)) { CJTRequest cjtRequest = new CJTRequest(REQUEST_GENERATE_TOKEN_PATH , context.getAppKey() , context.getAppSecret() @@ -357,16 +403,16 @@ public abstract class SyncReportJob { CJTResponseReportBody responseBody = JSONObject.parseObject(post, CJTResponseReportBody.class); if (!"0".equals(responseBody.getStatus())) { log.error("{} exception", this.getClassName(), responseBody.getErrorMessage()); - throw new RuntimeException(buildErrorBody(req, responseBody.getErrorMessage())); + throw new RuntimeException(buildErrorBody(req, Arrays.asList(responseBody.getErrorMessage()))); } return responseBody.getDataSource(); } - protected String buildErrorBody(CJTRequest req, String errorMessage) { + protected String buildErrorBody(CJTRequest req, List errorPageIndexList) { JSONObject errorInfo = new JSONObject(); errorInfo.put("url", req.getUrl()); errorInfo.put("body", JSONObject.toJSONString(req.getBody())); - errorInfo.put("errorMessage", errorMessage); + errorInfo.put("errorMessage", String.join(",", errorPageIndexList)); return errorInfo.toJSONString(); } }