From e796a0000e2d5744410f314f47355c16fa74f103 Mon Sep 17 00:00:00 2001 From: "xuetao.li" Date: Tue, 18 Apr 2023 11:53:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=9F=BA=E6=9C=AC=E6=A1=86?= =?UTF-8?q?=E6=9E=B6=E5=A4=84=E7=90=86=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/application-dev.properties | 15 +- adc-da-sys/pom.xml | 5 + .../com/adc/da/sync/service/SyncIAMTimer.java | 226 ++++++++++++++++++ .../da/sync/service/enums/SyncTypeEnum.java | 6 +- .../adc/da/sys/constant/UserBelongEnum.java | 26 ++ .../da/sys/controller/UserEOController.java | 2 +- .../adc/da/sys/service/UserEOServiceImpl.java | 7 +- 7 files changed, 270 insertions(+), 17 deletions(-) create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/constant/UserBelongEnum.java diff --git a/adc-da-main/src/main/resources/application-dev.properties b/adc-da-main/src/main/resources/application-dev.properties index b53670e..458e4cc 100644 --- a/adc-da-main/src/main/resources/application-dev.properties +++ b/adc-da-main/src/main/resources/application-dev.properties @@ -86,11 +86,6 @@ MAIL_POP_PORT=110 #MAIL_USERNAME=64459@Any3.com #MAIL_PASSWORD=65316975Xiaoq - - - - - IPANDPORT=http://localhost:7061/ #redis @@ -133,10 +128,8 @@ huawei.OBS.fileMaxSize=10 #文件上传最大M数 logging.level.com.adc: debug - -# ======= ddm权限接口 集成 ========= -ddm-identity=changan_test -ddm-company=9 -ddm-ras-public-key= - +# ==== IAM???? +iam.url=https://iamuat.faw-vw.com/ +iam.appkey=xxxx +iam.appSecret=xxx diff --git a/adc-da-sys/pom.xml b/adc-da-sys/pom.xml index 1784a17..6ad4eea 100644 --- a/adc-da-sys/pom.xml +++ b/adc-da-sys/pom.xml @@ -170,6 +170,11 @@ 1.4.7 + + com.auth0 + java-jwt + 3.10.2 + diff --git a/adc-da-sys/src/main/java/com/adc/da/sync/service/SyncIAMTimer.java b/adc-da-sys/src/main/java/com/adc/da/sync/service/SyncIAMTimer.java index a0b9512..7c37348 100644 --- a/adc-da-sys/src/main/java/com/adc/da/sync/service/SyncIAMTimer.java +++ b/adc-da-sys/src/main/java/com/adc/da/sync/service/SyncIAMTimer.java @@ -1,4 +1,230 @@ package com.adc.da.sync.service; +import cn.hutool.core.util.IdUtil; +import cn.hutool.http.Header; +import cn.hutool.http.HttpRequest; +import com.adc.da.sync.service.dao.mysql.SyncIAMLogDao; +import com.adc.da.sync.service.entity.SyncIAMLogEO; +import com.adc.da.sync.service.enums.SyncTypeEnum; +import com.adc.da.sys.dao.mysql.OrgEODao; +import com.adc.da.sys.entity.OrgEO; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.service.OrgEOService; +import com.adc.da.sys.service.iservice.IUserEoService; +import com.adc.da.sys.vo.iam.OrgVoIAM; +import com.adc.da.sys.vo.iam.UserVoIAM; +import com.adc.da.util.utils.GsonUtil; +import com.auth0.jwt.JWT; +import com.auth0.jwt.algorithms.Algorithm; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +@Service public class SyncIAMTimer { + + /** + * IAM的前缀地址 + */ + @Value("${iam.url}") + private String iamUrl; + + @Value("${iam.appkey}") + private String appkey; + + @Value("${iam.appSecret}") + private String appSecret; + + /** + * 组织机构全量同步接口地址 + */ + public static final String ORG_FULL_URL = "/esc-idm/api/v1/org/listAll"; + + /** + * 组织机构增量同步接口地址 + */ + public static final String ORG_INCREMENT_URL = "/esc-idm/api/v1/org/list"; + + /** + * 用户全量同步接口地址 + */ + public static final String USER_FULL_URL = "/esc-idm/api/v1/account/listAll"; + + /** + * 用户增量同步接口地址 + */ + public static final String USER_INCREMENT_URL = "/esc-idm/api/v1/account/list"; + + @Resource + SyncIAMLogDao syncIAMLogDao; + + @Resource + OrgEOService orgEOService; + + @Resource + IUserEoService iUserEoService; + + /** + * 同步组织机构-全量数据并入库 + * @Param syncModel 同步模式 + */ + public void syncOrgFullData(){ + String syncUrl = this.iamUrl + ORG_FULL_URL; + String jwtToken = this.getJwtToken(appkey, appSecret); + + Date syncStartTime = new Date(); + + String orgDataStr = HttpRequest.post(syncUrl) + .header("Content-Type", "application/json") + .header("Authorization", jwtToken)//头信息,多个头信息多次调用此方法即可 + .timeout(10 * 60 * 1000) //超时,毫秒 + .execute().body(); + + List orgVoIAMList = GsonUtil.json2Collection(orgDataStr, OrgVoIAM.class); + + // 同步的VO 转换成 数据库EO + List orgEOList = new ArrayList<>(); + for (OrgVoIAM orgVoIAM : orgVoIAMList){ + OrgEO orgEO = this.transOrgIAMVoToOrgEO(orgVoIAM); + orgEOList.add(orgEO); + } + + // 需要处理 ,比较后再更新 + this.orgEOService.saveBatch(orgEOList); + + this.addSyncLog(null, syncStartTime, SyncTypeEnum.ORG_FULL_DATA.getValue()); + } + + /** + * 同步组织机构-增量数据并入库 + * @Param syncModel 同步模式 + */ + public void syncOrgIncrData(){ + String syncUrl = this.iamUrl + ORG_INCREMENT_URL; + String jwtToken = this.getJwtToken(appkey, appSecret); + + Date syncStartTime = new Date(); + + Calendar c = Calendar.getInstance(); + c.set(Calendar.HOUR_OF_DAY, (c.get(Calendar.HOUR_OF_DAY) - 24));//HOUR_OF_DAY 指一天中的小时 + Long incrementStartTime = c.getTimeInMillis(); // 每天同步前一天的数据,需要当前时间往前诺一天 + + String orgDataStr = HttpRequest.post(syncUrl) + .header("Content-Type", "application/json") + .header("Authorization", jwtToken)//头信息,多个头信息多次调用此方法即可 + .form("startTime", incrementStartTime) + .timeout(10 * 60 * 1000) //超时,毫秒 + .execute().body(); + + List orgVoIAMList = GsonUtil.json2Collection(orgDataStr, OrgVoIAM.class); + + // 同步的VO 转换成 数据库EO + List orgEOList = new ArrayList<>(); + for (OrgVoIAM orgVoIAM : orgVoIAMList){ + OrgEO orgEO = this.transOrgIAMVoToOrgEO(orgVoIAM); + orgEOList.add(orgEO); + } + + this.orgEOService.saveBatch(orgEOList); + + this.addSyncLog(null, syncStartTime, SyncTypeEnum.ORG_INCREMENT_DATA.getValue()); + } + + /** + * 同步用户-全量数据并入库 + * @Param syncModel 同步模式 + */ + public void syncUserFullData(){ + String syncUrl = this.iamUrl + USER_FULL_URL; + String jwtToken = this.getJwtToken(appkey, appSecret); + + Date syncStartTime = new Date(); + + String userDataStr = HttpRequest.post(syncUrl) + .header("Content-Type", "application/json") + .header("Authorization", jwtToken)//头信息,多个头信息多次调用此方法即可 + .timeout(10 * 60 * 1000) //超时,毫秒 + .execute().body(); + + List userVoIAMList = GsonUtil.json2Collection(userDataStr, UserVoIAM.class); + + // 同步的VO 转换成 数据库EO,并存库 + for (UserVoIAM userVoIAM : userVoIAMList){ + UserEO userEO = this.transUserIAMVoToUserEO(userVoIAM); + // 需要处理 ,比较后再更新 + this.iUserEoService.save(userEO); + } + + this.addSyncLog(null, syncStartTime, SyncTypeEnum.ORG_FULL_DATA.getValue()); + } + + /** + * 根据key和secret获取JWT_TOKEN + * @param appKey + * @param appSecret + * @return + */ + public String getJwtToken(String appKey, String appSecret) { + String token = JWT.create() + .withIssuer(appKey) + .withIssuedAt(new Date()) + .withJWTId(IdUtil.fastSimpleUUID()) + .sign(Algorithm.HMAC256(appSecret)); + return String.join(" ", "Bearer", token); + } + + /** + * 添加同步日志到库中 + * @param incrementStartTime 增量同步时间,可能为空 + */ + private void addSyncLog(String incrementStartTime, Date syncStartDate, String syncType) { + SyncIAMLogEO syncIAMLogEO = new SyncIAMLogEO(); + syncIAMLogEO.setIncrementStartTime(incrementStartTime); + syncIAMLogEO.setSyncStartDate(syncStartDate); + syncIAMLogEO.setSyncEndDate(new Date()); + syncIAMLogEO.setSyncType(syncType); + this.syncIAMLogDao.insert(syncIAMLogEO); + } + + /** + * 对 对接的组织机构实体 转换为 数据库的实体 + * @param orgVoIAM + * @return + */ + public OrgEO transOrgIAMVoToOrgEO(OrgVoIAM orgVoIAM) { + OrgEO orgEO = new OrgEO(); + orgEO.setOrgCode(orgVoIAM.getOrgCode()); + orgEO.setOrgName(orgVoIAM.getOrgName()); + orgEO.setOrgLevel(orgVoIAM.getOrgLevel()); + orgEO.setSupOrgCode(orgVoIAM.getSupOrgCode()); + orgEO.setOrgShortName(orgVoIAM.getOrgShortName()); + orgEO.setAttribution(orgVoIAM.getAttribution()); + orgEO.setBmdm14(orgVoIAM.getBmdm14()); + orgEO.setStatus(orgVoIAM.getStatus()); + orgEO.setUpdateTime(orgVoIAM.getUpdateTime()); + + return orgEO; + } + + /** + * 对 对接的用户实体 转换为 数据库的实体 + * @param userVoIAM + * @return + */ + public UserEO transUserIAMVoToUserEO(UserVoIAM userVoIAM) { + UserEO userEO = new UserEO(); + + // 转换基础数据 + + // 转换org的关联数据 + + return userEO; + } + } diff --git a/adc-da-sys/src/main/java/com/adc/da/sync/service/enums/SyncTypeEnum.java b/adc-da-sys/src/main/java/com/adc/da/sync/service/enums/SyncTypeEnum.java index 941d805..41d2b1d 100644 --- a/adc-da-sys/src/main/java/com/adc/da/sync/service/enums/SyncTypeEnum.java +++ b/adc-da-sys/src/main/java/com/adc/da/sync/service/enums/SyncTypeEnum.java @@ -4,8 +4,10 @@ package com.adc.da.sync.service.enums; */ public enum SyncTypeEnum { - USER_DATA("USER_DATA","用户数据"), - ORG_DATA("ORG_DATA","组织机构数据"); + USER_FULL_DATA("USER_FULL_DATA","用户数据-全量同步"), + USER_INCREMENT_DATA("USER_INCREMENT_DATA","用户数据-增量同步"), + ORG_FULL_DATA("ORG_FULL_DATA","组织机构数据-全量同步"), + ORG_INCREMENT_DATA("ORG_INCREMENT_DATA","组织机构数据-增量同步"); private String label; private String value; diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/constant/UserBelongEnum.java b/adc-da-sys/src/main/java/com/adc/da/sys/constant/UserBelongEnum.java new file mode 100644 index 0000000..2ae0ffb --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/constant/UserBelongEnum.java @@ -0,0 +1,26 @@ +package com.adc.da.sys.constant; +/*** + * 同步类型枚举 + */ +public enum UserBelongEnum { + + LOCAL("1","本地新增用户"), + IAM("0","IAm同步用户"); + + private String label; + private String value; + + private UserBelongEnum(String value, String label) { + this.value = value; + this.label = label; + } + public String getValue() { + return value; + } + + public String getLabel() { + return label; + } + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserEOController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserEOController.java index 31acb10..dcecb09 100644 --- a/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserEOController.java +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserEOController.java @@ -74,7 +74,7 @@ public class UserEOController extends BaseController { JsonElement element = parser.parse(data); UserEO eo = gson.fromJson(element, UserEO.class); - eo.setPassword("HZWLsoft.com123"); + eo.setPassword("catarc2013"); if (StringUtils.isBlank(eo.getAccount())) { return Result.error("用户名不能为空!"); } diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/UserEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/UserEOServiceImpl.java index 1fda33e..f72ee8f 100644 --- a/adc-da-sys/src/main/java/com/adc/da/sys/service/UserEOServiceImpl.java +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/UserEOServiceImpl.java @@ -3,6 +3,7 @@ package com.adc.da.sys.service; import java.text.SimpleDateFormat; import java.util.*; +import com.adc.da.sys.constant.UserBelongEnum; import com.adc.da.sys.dao.mysql.UserRoleEODao; import com.adc.da.sys.entity.RoleEO; import com.adc.da.sys.entity.UserRoleEO; @@ -86,7 +87,7 @@ public class UserEOServiceImpl implements IUserEoService { * 1代表本系统自建用户 * 0代表同步过来的用户 */ - eo.setIsSelf("1"); + eo.setIsSelf(UserBelongEnum.LOCAL.getValue()); eo.setUsid(com.adc.da.util.utils.UUID.randomUUID10()); dao.insert(eo); } else { @@ -206,10 +207,10 @@ public class UserEOServiceImpl implements IUserEoService { UserEO userEO = new UserEO(); BeanUtils.copyProperties(userImportVO, userEO); userEO.setDelFlag(0); - userEO.setIsSelf("1"); + userEO.setIsSelf(UserBelongEnum.LOCAL.getValue()); userEO.setUsid(com.adc.da.util.utils.UUID.randomUUID10()); userEO.setCellPhoneNumber(userImportVO.getCellPhoneNumber() == null ? EncryptUtil.encrypt("") : EncryptUtil.encrypt(userImportVO.getCellPhoneNumber())); - userEO.setPassword(EncryptUtil.encrypt("EI$XIL@vdc9ptev7")); + userEO.setPassword(EncryptUtil.encrypt("catarc2013")); userEO.setEmail(userImportVO.getEmail() == null ? EncryptUtil.encrypt("") : EncryptUtil.encrypt(userImportVO.getEmail())); userEO.setCreateTime(simpleDateFormat.format(date)); userEO.setUpdateTime(simpleDateFormat.format(date));