gongchunyi
3 天以前 f833aea25970ebc7171815fd0b44e45473082691
src/main/java/com/ruoyi/framework/util/AliDingUtils.java
@@ -46,11 +46,28 @@
     * @return 对应表单的数据
     */
    public static <T> JSONArray getFormDataList(AliDingConfig aliDingConfig, String formUuid, String searchFieldJson, IService<T> service, SFunction<T, ?> timeField) {
        return getFormDataList(aliDingConfig, formUuid, searchFieldJson, service, timeField, new LambdaQueryWrapper<>());
    }
    /**
     * 根据表单 ID 获取宜搭数据,带自定义记录数查询条件,用于判断是否进行全量同步
     */
    public static <T> JSONArray getFormDataList(AliDingConfig aliDingConfig, String formUuid, String searchFieldJson, IService<T> service, SFunction<T, ?> timeField, LambdaQueryWrapper<T> countWrapper) {
        //  获取 accessToken
        String accessToken = getAccessToken(aliDingConfig);
        //  获取最后同步时间
        LocalDateTime lastSyncTime = getLastSyncTime(service, timeField);
        log.info("开始同步数据,本地最后修改时间: {}", lastSyncTime);
        //  先获取宜搭总数(不带时间参数)与本地记录数对比
        long remoteTotalCount = getRemoteTotalCount(aliDingConfig, formUuid, searchFieldJson, accessToken);
        long localCount = service.count(countWrapper);
        //  判断是否需要全部更新
        LocalDateTime lastSyncTime = null;
        if (remoteTotalCount == localCount) {
             lastSyncTime = getLastSyncTime(service, timeField);
             log.info("开始增量同步数据,本地最后修改时间: {}", lastSyncTime);
        } else {
             log.info("本地数据条数({})与远程数据总条数({})不一致,进行全量同步", localCount, remoteTotalCount);
        }
        JSONArray allData = new JSONArray();
        int pageNumber = 1;
@@ -116,6 +133,37 @@
    }
    /**
     * 获取远程查询的总数量(不带时间参数限制)
     */
    private static long getRemoteTotalCount(AliDingConfig aliDingConfig, String formUuid, String searchFieldJson, String accessToken) {
        JSONObject searchParam = new JSONObject();
        searchParam.put("appType", aliDingConfig.getAppType());
        searchParam.put("systemToken", aliDingConfig.getSystemToken());
        searchParam.put("userId", aliDingConfig.getUserId());
        searchParam.put("formUuid", formUuid);
        searchParam.put("currentPage", 1);
        searchParam.put("pageSize", 1);
        if (StringUtils.isNotEmpty(searchFieldJson)) {
            searchParam.put("searchFieldJson", searchFieldJson);
        }
        String dataRes = HttpUtils.sendPostJson(
                aliDingConfig.getSearchFormDataUrl(),
                searchParam.toJSONString(),
                StandardCharsets.UTF_8.name(),
                null,
                accessToken
        );
        if (StringUtils.isEmpty(dataRes)) {
            return 0;
        }
        JSONObject resultObj = JSON.parseObject(dataRes);
        return resultObj.getLongValue("totalCount");
    }
    /**
     * 获取钉钉 AccessToken
     */
    private static String getAccessToken(AliDingConfig aliDingConfig) {
@@ -152,22 +200,15 @@
        LambdaQueryWrapper<T> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByDesc(timeField).last("LIMIT 1");
        T lastRecord = service.getOne(queryWrapper);
        if (lastRecord == null) {
            return null;
        }
        try {
            Method writeReplace = timeField.getClass().getDeclaredMethod("writeReplace");
            writeReplace.setAccessible(true);
            SerializedLambda lambda = (SerializedLambda) writeReplace.invoke(timeField);
            // 获取方法名
            String methodName = lambda.getImplMethodName();
            // 转字段名
            String fieldName = methodName.substring(3, 4).toLowerCase() + methodName.substring(4);
            Field field = lastRecord.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            return (LocalDateTime) field.get(lastRecord);
        } catch (Exception e) {
            throw new RuntimeException("获取最后同步时间失败", e);
        Object value = timeField.apply(lastRecord);
        if (value instanceof LocalDateTime) {
            return (LocalDateTime) value;
        }
        return null;
    }
}