From 6f1b59748f7c9181e5eedb1fc31578679331898f Mon Sep 17 00:00:00 2001 From: wxyclub Date: Fri, 10 Nov 2023 11:26:10 +0800 Subject: [PATCH] =?UTF-8?q?bug:=20=E4=BF=AE=E6=94=B9=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E6=97=B6=E9=97=B4=E6=88=B3=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=85=A8=E9=87=8F=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/adc/da/scheduled/ScheduledSync.java | 2 +- .../da/slrs/DataSync/DataSyncController.java | 6 ++ .../DataSync/service/IDataSyncService.java | 4 +- .../service/impl/DataSyncServiceImpl.java | 95 +++++++++++++++++++ .../adc/da/sync/service/SyncUserService.java | 48 +++++++++- .../java/com/adc/da/sync/util/AuthUtils.java | 7 +- 6 files changed, 156 insertions(+), 6 deletions(-) diff --git a/adc-da-slrs/src/main/java/com/adc/da/scheduled/ScheduledSync.java b/adc-da-slrs/src/main/java/com/adc/da/scheduled/ScheduledSync.java index edd20a8d..61a0c4a1 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/scheduled/ScheduledSync.java +++ b/adc-da-slrs/src/main/java/com/adc/da/scheduled/ScheduledSync.java @@ -48,7 +48,7 @@ public class ScheduledSync { public void syncSchedulingTasks() { if(isNotScheduled){ log.info("======================================开始同步基础数据========================================"); - iDataSyncService.orgDataSync2(); //时间短 + iDataSyncService.orgDataSync3(); //时间短 iDataSyncService.dataSync3(); //时间长 log.info("======================================结束同步基础数据========================================"); } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/DataSync/DataSyncController.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/DataSync/DataSyncController.java index c117d5bf..6274e720 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/DataSync/DataSyncController.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/DataSync/DataSyncController.java @@ -47,6 +47,12 @@ public class DataSyncController { return iDataSyncService.dataSync2(chuo); } + @ApiOperation("同步用户数据3,不带时间戳,全量同步") + @PostMapping("/importUserData3") + public String importUserData3() throws Exception { + return iDataSyncService.dataSync3(); + } + @ApiOperation("同步组织机构") @PostMapping("/importOrgData") public String importOrgData() throws Exception { diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/DataSync/service/IDataSyncService.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/DataSync/service/IDataSyncService.java index d9f84de7..6ce35a64 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/DataSync/service/IDataSyncService.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/DataSync/service/IDataSyncService.java @@ -12,8 +12,10 @@ public interface IDataSyncService { public String dataSync3(); // 定时增量同步 public String orgDataSync(); - // 手动全量同步 + public String orgDataSync2(); + // 全量同步 + public String orgDataSync3(); public String updateByOrgs(); } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/DataSync/service/impl/DataSyncServiceImpl.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/DataSync/service/impl/DataSyncServiceImpl.java index 7971f426..3ef873b1 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/DataSync/service/impl/DataSyncServiceImpl.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/DataSync/service/impl/DataSyncServiceImpl.java @@ -764,6 +764,101 @@ public class DataSyncServiceImpl implements IDataSyncService { return "1"; } + + // 手动全量同步部门信息 + @Override + @Transactional(rollbackFor = {RuntimeException.class,Exception.class}) + public String orgDataSync3(){ + try{ + SyncUserService syncUserService = new SyncUserService(); + List res = syncUserService.syncFotonOrg3(); + if(res!=null && !res.isEmpty()){ + res.forEach(each -> logger.info("同步部门数据:"+each)); + //获取到所有用户数据 + List strings=new ArrayList<>(); + //tsInstitutionService.clearData(); + for (String s : res) { + JSONArray jsonArray = JSONArray.parseArray(JSONObject.parseObject(s.toString()).getString("results")); + jsonArray.forEach(object -> { + JSONObject jsonObject = JSONObject.parseObject(object.toString()); + strings.add(jsonObject.getString("parentOrgNumber")); + }); + } + List allTsInstitutionList = tsInstitutionService.list(); + List addTsInstitutionList = new ArrayList<>(); + List updateTsInstitutionList = new ArrayList<>(); + List delTsInstitutionList = new ArrayList<>(); + Set syncAllIdList = new HashSet<>(); + for (String s : res) { + JSONArray jsonArray = JSONArray.parseArray(JSONObject.parseObject(s.toString()).getString("results")); + if(jsonArray!=null){ + jsonArray.forEach(object -> { + JSONObject jsonObject = JSONObject.parseObject(object.toString()); + TsInstitution tsInstitution=new TsInstitution(); + tsInstitution.setId(jsonObject.getString("orgNumber")); + tsInstitution.setName(jsonObject.getString("orgName")); + tsInstitution.setHasChild(strings.contains(jsonObject.getString("orgNumber"))?"1":"0"); + tsInstitution.setParentId(jsonObject.getString("parentOrgNumber")); + //部门为"null"的数据不保存 + if (!"null".equals(jsonObject.getString("orgName"))){ + TsInstitution institution = tsInstitutionService.getById(tsInstitution.getId()); + if(institution!=null){ + updateTsInstitutionList.add(tsInstitution); + }else{ + addTsInstitutionList.add(tsInstitution); + } + syncAllIdList.add(tsInstitution.getId()); + } + }); + } + } + //遍历出来需要删除的数据 + for(TsInstitution data :allTsInstitutionList){ + if(!syncAllIdList.contains(data.getId())){ + delTsInstitutionList.add(data); + } + } + //需要新增的数据 + if(!addTsInstitutionList.isEmpty()){ + logger.debug("本次新增的组织机构为:"+JSONObject.toJSONString(addTsInstitutionList)); + tsInstitutionService.saveBatch(addTsInstitutionList); + } + //需要更新的数据 + if(!updateTsInstitutionList.isEmpty()){ + logger.debug("本次更新的组织机构为:"+JSONObject.toJSONString(updateTsInstitutionList)); + tsInstitutionService.updateBatchById(updateTsInstitutionList); + } + //需要删除的数据 + // 先行注释,会删除所有部门 + if(!delTsInstitutionList.isEmpty()){ + logger.debug("本次删除的组织机构为:"+JSONObject.toJSONString(delTsInstitutionList)); + List delIdList = new ArrayList<>(); + for(TsInstitution data : delTsInstitutionList){ + delIdList.add(data.getId()); + } + tsInstitutionService.removeByIds(delIdList); + } + //全部部门 + List allTsInstitutionListForPids = new ArrayList<>(addTsInstitutionList); + allTsInstitutionListForPids.addAll(updateTsInstitutionList); + for (TsInstitution tsInstitution : allTsInstitutionListForPids){ + List parentIds = new ArrayList<>(); + getParentTaxCompanyIds(allTsInstitutionListForPids, tsInstitution.getId(), parentIds); + tsInstitution.setParentIds(String.join(",",parentIds)); + } + if (! allTsInstitutionListForPids.isEmpty()) { + tsInstitutionService.updateBatchById(allTsInstitutionListForPids); + } + }else{ + logger.info("本次获取组织机构的数据为空,原因有2种:1、没有同步数据 2、请求接口报错"); + } + }catch(Exception e){ + logger.error(e.getMessage(),e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + } + return "1"; + } + public String updateByOrgs(){ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.ne("id",""); diff --git a/adc-da-sys/src/main/java/com/adc/da/sync/service/SyncUserService.java b/adc-da-sys/src/main/java/com/adc/da/sync/service/SyncUserService.java index 55076885..233a4cad 100644 --- a/adc-da-sys/src/main/java/com/adc/da/sync/service/SyncUserService.java +++ b/adc-da-sys/src/main/java/com/adc/da/sync/service/SyncUserService.java @@ -129,12 +129,12 @@ public class SyncUserService { do { Map params = new HashMap(); params.put("cookie", Base64.encodeBase64String(cookie)); - params.put("timestamp", ""); +// params.put("timestamp", ""); // 用户参数 params.put("filter", "(userid=*)"); params.put("basedn", "ou=People,o=foton.com.cn,o=isp"); - log.info("RequestBody:" + params.toString()); + params.forEach((key, value) -> log.info("同步用户数据的请求参数:" + key + " : " + value)); // 用户测试 String rs = util.getResponseFromServer("http://idmsync.foton.com.cn/rest/users/getUserList", params); log.info("远程调用同步的员工数据:"+rs); @@ -255,4 +255,48 @@ public class SyncUserService { } while (cookie != null); return json; } + + // 不添加时间戳,全量同步部门信息 + public List syncFotonOrg3()throws Exception{ + String appuser = "app_slrs"; + String appkey = "Fxi5LHbI5yGbQQDpVp86GcCdXeC5Bjfe"; + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss'Z'"); + AuthUtils util = new AuthUtils(appuser, appkey, null); + + byte[] cookie = null; + List json=new ArrayList<>(); + do { + Map params = new HashMap(); + params.put("cookie", Base64.encodeBase64String(cookie)); +// params.put("timestamp",""); + // 组织参数 + params.put("filter", "(orgNumber=*)"); + params.put("basedn", "ou=Organizations,o=foton.com.cn,o=isp"); + // 组织测试 + String rs = util.getResponseFromServer("http://idmsync.foton.com.cn/rest/orgs/getOrgList", params); + log.info("远程调用同步的部门数据:"+rs); + JSONObject responseStr = JSONObject.parseObject(rs); + if(responseStr.containsKey("status") && responseStr.getBoolean("status")){ + json.add(rs); + } + if (responseStr.containsKey("cookie")) { + try { + JSONArray entries = responseStr.getJSONArray("cookie"); + if(entries==null){ + break; + } + cookie = new byte[entries.size()]; + for (int i = 0; i < entries.size(); i++) { + cookie[i] = (byte) entries.getByte(i); + } + } catch (Exception e) { + log.error(e.getMessage(),e); + if (e.getMessage().contains("is not a JSONArray")) { + cookie = null; + } + } + } + } while (cookie != null); + return json; + } } diff --git a/adc-da-sys/src/main/java/com/adc/da/sync/util/AuthUtils.java b/adc-da-sys/src/main/java/com/adc/da/sync/util/AuthUtils.java index a5cf5057..93962857 100644 --- a/adc-da-sys/src/main/java/com/adc/da/sync/util/AuthUtils.java +++ b/adc-da-sys/src/main/java/com/adc/da/sync/util/AuthUtils.java @@ -39,8 +39,11 @@ public class AuthUtils { public String getResponseFromServer(String url, Map params) throws Exception { HttpPost httpPost = new HttpPost(url); createSignHeader(httpPost, params); + Header[] allHeaders = httpPost.getAllHeaders(); + for (Header header : allHeaders) { + logger.info("请求头:" + header.getName() + ":" + header.getValue()); + } JSONObject object = JSONObject.fromObject(params); - params.forEach((key,value) -> logger.info("请求参数:{}:{}",key,value)); httpPost.setEntity(new ByteArrayEntity(object.toString().getBytes(), ContentType.APPLICATION_JSON)); return execute(httpPost); } @@ -52,7 +55,7 @@ public class AuthUtils { client = HttpClientBuilder.create().build(); logger.info("请求地址:"+request.getURI().toString()); for (Header header : request.getAllHeaders()) { - logger.info("请求头:"+header.toString()); + logger.info("请求头:"+header.getName() + ":" + header.getValue()); } resp = client.execute(request); return EntityUtils.toString(resp.getEntity());