From 3de3c3d6003b236714a820ab668aae2b73c969f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=95=8F?= Date: Fri, 11 Oct 2024 16:13:32 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat(REQ-2960):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=B3=B0=E5=B7=9E=E4=BA=BA=E5=91=98=E5=90=8C=E6=AD=A5=EF=BC=8C?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E4=B8=80=E6=89=B9=E6=97=A5=E5=BF=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/TaiZhouServiceImpl.java | 50 +++++++++++++++++-- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java index e429f0d..8a8f239 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java @@ -29,8 +29,11 @@ import cn.axzo.riven.third.taizhou.rpc.res.TaiZhouPhoneRes; import cn.axzo.riven.third.taizhou.rpc.res.TaiZhouPrjWorkerRes; import cn.axzo.riven.third.taizhou.rpc.res.TaiZhouWorkerRes; import cn.axzo.riven.third.taizhou.rpc.res.TazZhouProjectRes; +import cn.axzo.riven.third.taizhou.service.OperateLogService; import cn.axzo.riven.third.taizhou.service.TaiZhouService; +import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; @@ -80,6 +83,9 @@ public class TaiZhouServiceImpl implements TaiZhouService { @Autowired private DingDingRobotService dingDingRobotService; + @Autowired + private OperateLogService operateLogService; + @Override public void updateProjectIdForRemote(TaiZhouProject taiZhouProject) { @@ -297,13 +303,15 @@ public class TaiZhouServiceImpl implements TaiZhouService { if (Objects.isNull(oldThirdPerson)) { //数据入库 thirdPersonDao.save(thirdPerson); + operateLogService.save(buildOperateParam(null, null, + OperateLogService.OperateType.ADD, thirdPerson, "新增泰州用户", (JSONObject) JSON.toJSON(thirdPerson))); //业务操作 newDataHandle(thirdPerson, taiZhouProject); } //反之则更新 else { //先更新数据,保持和泰州一致 - updateThirdPerson(thirdPerson); + updateThirdPerson(oldThirdPerson, thirdPerson); //业务前置检查,泰州同步关键信息不能变化,身份证,姓名不能有变化 taiZhouSyncBasicPersonCheck(thirdPerson, oldThirdPerson); @@ -343,7 +351,7 @@ public class TaiZhouServiceImpl implements TaiZhouService { .eq(ThirdPerson::getThirdUniquePersonId, oldThirdPerson.getThirdUniquePersonId()) .set(ThirdPerson::getPersonId, 0) .update(); - + operateLogService.save(buildOperateParam(oldThirdPerson.getPersonId(), 0L, OperateLogService.OperateType.UPDATE, oldThirdPerson, "清除personId", null)); } private void updateDataHandle(ThirdPerson thirdPerson, ThirdPerson oldThirdPerson, PersonProfileDto currentBindPerson) { @@ -452,6 +460,8 @@ public class TaiZhouServiceImpl implements TaiZhouService { if (personProfileDto.getRealName().contains("工友") || personProfileDto.getRealName().contains("工人")) { log.info("泰州人员:{} 关联的安心筑人员姓名是默认姓名,需要修改,修改前:{},修改后:{}", thirdPerson.getThirdPersonName(), personProfileDto.getRealName(), thirdPerson.getThirdPersonName()); userCenterRpc.updateUserName(thirdPerson); + operateLogService.save(buildOperateParam(thirdPerson.getPersonId(), thirdPerson.getPersonId(), OperateLogService.OperateType.UPDATE, + thirdPerson, String.format("更新安心筑工人姓名 %s -> %s", personProfileDto.getRealName(), thirdPerson.getThirdPersonName()), null)); } thirdPersonDao.lambdaUpdate() .eq(ThirdPerson::getThirdCode, thirdPerson.getThirdCode()) @@ -481,6 +491,9 @@ public class TaiZhouServiceImpl implements TaiZhouService { if (!(VerifyStatus.VERIFY_SUCCESS == currentBindPerson.getVerification().getVerifyStatus())) { log.info("泰州人员:{} 同步数据,新手机号在安心筑账号为空,且历史绑定数据未实名,需要覆盖安心筑手机号,安心筑personId:{}:originPhone:{},newPhone:{}", thirdPerson.getThirdPersonName(), currentBindPerson.getId(), currentBindPerson.getPhone(), thirdPerson.getThirdPersonPhone()); userCenterRpc.updateUserPhone(oldThirdPerson.getPersonId(), thirdPerson.getThirdPersonPhone()); + operateLogService.save(buildOperateParam(oldThirdPerson.getPersonId(), oldThirdPerson.getPersonId(), OperateLogService.OperateType.UPDATE, + oldThirdPerson, String.format("更新安心筑用户手机号(泰州老手机号对应安心筑手机号未实名,且新手机号未注册) - " + + "oldPhone=%s,newPhone=%s,personId=%s", oldThirdPerson.getThirdPersonPhone(), thirdPerson.getThirdPersonPhone(), oldThirdPerson.getPersonId()), new JSONObject())); return; } @@ -489,6 +502,9 @@ public class TaiZhouServiceImpl implements TaiZhouService { if (comparePersonInfo(currentBindPerson, thirdPerson)) { log.info("泰州人员:{} 同步数据,新手机号在安心筑账号为空,且历史绑定数据实名,且与泰州信息一致,需要覆盖安心筑手机号,安心筑personId:{}:originPhone:{},newPhone:{}", thirdPerson.getThirdPersonName(), currentBindPerson.getId(), currentBindPerson.getPhone(), thirdPerson.getThirdPersonPhone()); userCenterRpc.updateUserPhone(oldThirdPerson.getPersonId(), thirdPerson.getThirdPersonPhone()); + operateLogService.save(buildOperateParam(oldThirdPerson.getPersonId(), oldThirdPerson.getPersonId(), OperateLogService.OperateType.UPDATE, + oldThirdPerson, String.format("更新安心筑用户手机号(泰州老手机号对应安心筑手机号未实名,且新手机号未注册) - " + + "oldPhone=%s,newPhone=%s,personId=%s", oldThirdPerson.getThirdPersonPhone(), thirdPerson.getThirdPersonPhone(), oldThirdPerson.getPersonId()), new JSONObject())); } else { String errorLog = String.format("泰州人员:%s 基本信息和安心筑信息不一致(姓名或者脱敏身份证不一致),不修改安心筑手机号 ", thirdPerson.getThirdPersonName()); dingDingRobotService.send(errorLog); @@ -608,11 +624,14 @@ public class TaiZhouServiceImpl implements TaiZhouService { if (Objects.isNull(personProfileDto)) { throw new ServiceException("泰州人员:" + thirdPerson.getThirdPersonName() + " 创建安心筑用户失败,程序跳过处理,请人工处理,或者等待后续重试,失败手机号:" + thirdPerson.getThirdPersonPhone()); } + Long originPersonId = thirdPerson.getPersonId(); thirdPerson.setPersonId(personProfileDto.getId()); //先更新安心筑表中的姓名,在更新三方表的记录,顺序不能变 if (personProfileDto.getRealName().contains("工友") || personProfileDto.getRealName().contains("工人")) { log.info("泰州人员:{} 关联的安心筑人员姓名是默认姓名,需要修改:修改前:{},修改后:{}", thirdPerson.getThirdPersonName(), personProfileDto.getRealName(), thirdPerson.getThirdPersonName()); userCenterRpc.updateUserName(thirdPerson); + operateLogService.save(buildOperateParam(originPersonId, originPersonId, OperateLogService.OperateType.UPDATE, + thirdPerson, String.format("更新安心筑工人姓名 %s -> %s", personProfileDto.getRealName(), thirdPerson.getThirdPersonName()), null)); } log.info("泰州人员:{} 开始绑定安心筑personID:{}", thirdPerson.getThirdPersonName(), personProfileDto.getId()); @@ -624,13 +643,14 @@ public class TaiZhouServiceImpl implements TaiZhouService { .eq(ThirdPerson::getThirdUniquePersonId, thirdPerson.getThirdUniquePersonId()) .set(ThirdPerson::getPersonId, thirdPerson.getPersonId()) .update(); + operateLogService.save(buildOperateParam(originPersonId, thirdPerson.getPersonId(), + OperateLogService.OperateType.UPDATE, thirdPerson, String.format("三方用户表绑定personId %s -> %s", originPersonId, thirdPerson.getPersonId()), null)); log.info("泰州人员:{} 绑定安心筑账号结束", thirdPerson.getThirdPersonName()); } - - private void updateThirdPerson(ThirdPerson thirdPerson) { - thirdPersonDao.lambdaUpdate() + private void updateThirdPerson(ThirdPerson oldThirdPerson, ThirdPerson thirdPerson) { + boolean updated = thirdPersonDao.lambdaUpdate() .eq(ThirdPerson::getThirdCode, thirdPerson.getThirdCode()) .eq(ThirdPerson::getThirdUniquePersonId, thirdPerson.getThirdUniquePersonId()) .set(!Objects.isNull(thirdPerson.getThirdPersonName()), ThirdPerson::getThirdPersonName, thirdPerson.getThirdPersonName()) @@ -641,6 +661,13 @@ public class TaiZhouServiceImpl implements TaiZhouService { .set(!Objects.isNull(thirdPerson.getThirdPersonFaceUrl()), ThirdPerson::getThirdPersonFaceUrl, thirdPerson.getThirdPersonFaceUrl()) .set(!Objects.isNull(thirdPerson.getThirdSex()), ThirdPerson::getThirdSex, thirdPerson.getThirdSex()) .update(); + // compare and log + if (updated) { + ThirdPerson toUpdate = BeanUtil.toBean(thirdPerson, ThirdPerson.class); + toUpdate.setId(oldThirdPerson.getId()); + operateLogService.save(buildOperateParam(oldThirdPerson.getPersonId(), oldThirdPerson.getPersonId(), OperateLogService.OperateType.UPDATE, toUpdate, + "泰州用户:信息变更", new JSONObject().fluentPut("oldValue", oldThirdPerson).fluentPut("newValue", toUpdate))); + } } @@ -689,4 +716,17 @@ public class TaiZhouServiceImpl implements TaiZhouService { } } + private OperateLogService.SaveParam buildOperateParam(Long oldPersonId, Long newPersonId, OperateLogService.OperateType operateType, ThirdPerson toUpdate, String summary, JSONObject ext) { + return OperateLogService.SaveParam.builder() + .operateType(operateType) + .operatorName("系统") + .summary(summary) + .resourceType(OperateLogService.ResourceType.THIRD_PERSON) + .resourceId(toUpdate.getId() == null ? 0L : toUpdate.getId()) + .oldValue(new JSONObject().fluentPut("personId", oldPersonId)) + .newValue(new JSONObject().fluentPut("personId", newPersonId)) + .ext(ext) + .build(); + } + } From 8a57a46d912e8cd6abe8deb6834928ae2781b96a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=95=8F?= Date: Fri, 18 Oct 2024 19:22:56 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat(REQ-2960):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=B3=B0=E5=B7=9E=E4=BA=BA=E5=91=98=E5=90=8C=E6=AD=A5=E6=9C=BA?= =?UTF-8?q?=E5=88=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=A2=9E=E9=87=8F=E6=9B=B4?= =?UTF-8?q?=E6=96=B0job=E3=80=82=E5=88=87=E6=8D=A2=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit XXX:目前同步这块的代码写得过于复杂了。后续有时间,需要优化下这块的代码。 --- pom.xml | 5 + .../riven/controller/PrivateController.java | 58 ++++--- .../PrivateMQReconsumeController.java | 106 ++++++++++++ riven-third/pom.xml | 4 +- .../third/entity/ThirdProjectPerson.java | 5 + .../third/job/TaiZhouProjectPersonIncJob.java | 122 ++++++++++++++ .../third/job/TaiZhouProjectPersonJob.java | 17 +- .../service/ThirdProjectPersonService.java | 4 +- .../impl/ThirdProjectPersonServiceImpl.java | 9 +- .../riven/third/taizhou/rpc/TaiZhouRpc.java | 25 +++ .../rpc/req/TaiZhouWorkerHmcIncReq.java | 26 +++ .../third/taizhou/service/TaiZhouService.java | 15 +- .../service/impl/OperateLogServiceImpl.java | 41 ++--- .../service/impl/TaiZhouServiceImpl.java | 156 +++++++++++++----- 14 files changed, 484 insertions(+), 109 deletions(-) create mode 100644 riven-server/src/main/java/cn/axzo/riven/controller/PrivateMQReconsumeController.java create mode 100644 riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonIncJob.java create mode 100644 riven-third/src/main/java/cn/axzo/riven/third/taizhou/rpc/req/TaiZhouWorkerHmcIncReq.java diff --git a/pom.xml b/pom.xml index cebf035..74f3574 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,11 @@ pom import + + cn.axzo.platform + axzo-log-api + 1.0.0-SNAPSHOT + io.github.openfeign feign-httpclient diff --git a/riven-server/src/main/java/cn/axzo/riven/controller/PrivateController.java b/riven-server/src/main/java/cn/axzo/riven/controller/PrivateController.java index 8229a41..548934a 100644 --- a/riven-server/src/main/java/cn/axzo/riven/controller/PrivateController.java +++ b/riven-server/src/main/java/cn/axzo/riven/controller/PrivateController.java @@ -1,49 +1,61 @@ package cn.axzo.riven.controller; -import cn.axzo.framework.rocketmq.Event; -import cn.axzo.framework.rocketmq.EventConsumer; -import cn.axzo.framework.web.http.ApiResponse; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.framework.jackson.utility.JSON; +import cn.axzo.riven.third.job.TaiZhouProjectPersonIncJob; +import cn.axzo.riven.third.job.TaiZhouProjectPersonJob; +import com.alibaba.fastjson.JSONObject; import com.google.common.collect.ImmutableMap; +import com.xxl.job.core.biz.model.ReturnT; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.validation.Valid; +import java.util.Optional; +import java.util.function.Function; @RestController -@RequestMapping("/private") +@RequestMapping("/api/private") +@RequiredArgsConstructor public class PrivateController { - @Autowired - private EventConsumer eventConsumer; + private final TaiZhouProjectPersonJob taiZhouProjectPersonJob; + private final TaiZhouProjectPersonIncJob taiZhouProjectPersonIncJob; - /** - * 探活 - */ - @PostMapping("/event/consume") - public ApiResponse consumeEvent(@RequestBody @Valid ConsumeEventParam param) { - EventConsumer.Context context = EventConsumer.Context.builder() - .msgId("privateEventConsumer-" + System.currentTimeMillis()) - .ext(ImmutableMap.of("topic", "topic-private-dummy")) - .headers(ImmutableMap.of()) - .lagSupplier(() -> 1L) + @PostMapping("/job/run") + public ApiResult reconsumeMessage(@RequestBody RunJobParam param) throws Exception { + ImmutableMap>> jobRunners = ImmutableMap.>>builder() + .put("taiZhouProjectPersonJob", p -> { + try { + return taiZhouProjectPersonJob.execute(p.getParam() == null ? null : p.getParam().toString()); + } catch (Exception e) { + throw new RuntimeException(e); + } + }) + .put("taiZhouProjectPersonIncJob", p -> { + try { + return taiZhouProjectPersonIncJob.execute(p.getParam() == null ? null : p.getParam().toString()); + } catch (Exception e) { + throw new RuntimeException(e); + } + }) .build(); - eventConsumer.onEvent(param.event.toJsonString(), context); - return ApiResponse.ok(); + Optional.ofNullable(jobRunners.get(param.getJobName())).ifPresent(c -> c.apply(param)); + return ApiResult.ok("job ran. -> " + JSON.toJSONString(param)); } @NoArgsConstructor @AllArgsConstructor @Data @Builder - public static class ConsumeEventParam { - private String topic; - private Event event; + public static class RunJobParam { + private String jobName; + private JSONObject param; } } diff --git a/riven-server/src/main/java/cn/axzo/riven/controller/PrivateMQReconsumeController.java b/riven-server/src/main/java/cn/axzo/riven/controller/PrivateMQReconsumeController.java new file mode 100644 index 0000000..39d9970 --- /dev/null +++ b/riven-server/src/main/java/cn/axzo/riven/controller/PrivateMQReconsumeController.java @@ -0,0 +1,106 @@ +package cn.axzo.riven.controller; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.framework.rocketmq.Event; +import cn.axzo.framework.rocketmq.EventConsumer; +import com.google.common.collect.ImmutableMap; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.util.ReflectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.lang.reflect.Method; + +@RestController +public class PrivateMQReconsumeController { + + @Autowired + private ApplicationContext appCtx; + + /** + *
+     * {
+     *     "bean": "nodeUserEventHandler",
+     *     "method": "onEvent",
+     *     "event": {
+     *         "eventId": "maokai_a753b5b34cf54a019e11a7846ed19779",
+     *         "eventModule": "node-user",
+     *         "eventName": "node-user-delete",
+     *         "eventTime": 1729064347240,
+     *         "operatorId": "system",
+     *         "operatorType": "system",
+     *         "schemaHash": "505167ebaddc9c832ac862447780c617",
+     *         "shardingKey": "262970",
+     *         "targetId": "262970",
+     *         "targetType": "node-user",
+     *         "data": {
+     *             "createAt": 1729064238000,
+     *             "extra": {
+     *                 "directManager": "",
+     *                 "directManagerId": null,
+     *                 "directManagerPersonId": 0,
+     *                 "directManagerType": null,
+     *                 "oldOrgJobId": null,
+     *                 "title": "",
+     *                 "workspaceId": null
+     *             },
+     *             "groupIdentityIds": "",
+     *             "groupJobIds": "",
+     *             "groupNodeIds": "",
+     *             "id": 262970,
+     *             "idNumber": "532127197608120055",
+     *             "identityId": 85608,
+     *             "identityType": 1,
+     *             "isAllowed": 2,
+     *             "isDelete": 0,
+     *             "jobNumber": null,
+     *             "joinAt": 1729064238000,
+     *             "leaveAt": null,
+     *             "manager": false,
+     *             "organizationalJobId": 369,
+     *             "organizationalNodeId": 16994,
+     *             "organizationalUnitId": 5314,
+     *             "personId": 81819,
+     *             "phone": "14787057685",
+     *             "primaryJob": 1,
+     *             "realName": "王宗平",
+     *             "syncDataId": 0,
+     *             "tempSourceId": 0,
+     *             "topNodeId": 6178,
+     *             "updateAt": 1729064238000,
+     *             "workspaceId": 0
+     *         }
+     *     }
+     * }
+     * 
+ * @param param + * @return + * @throws Exception + */ + @PostMapping("/api/private/message/re-consume") + public ApiResult reconsumeMessage(@RequestBody ReconsumeMessage param) throws Exception { + Object bean = appCtx.getBean(param.getBean()); + Method method = ReflectionUtils.findMethod(bean.getClass(), param.getMethod(), Event.class, EventConsumer.Context.class); + if (method == null) { + return ApiResult.err("bean not found -> " + param.getBean() + "." + param.getMethod()); + } + ReflectionUtils.invokeMethod(method, bean, param.getEvent(), EventConsumer.Context.builder().logEnabled(true).headers(ImmutableMap.of()).build()); + return ApiResult.ok("success"); + } + + @NoArgsConstructor + @AllArgsConstructor + @Data + @Builder + public static class ReconsumeMessage { + Event event; + private String bean; + private String method; + } +} diff --git a/riven-third/pom.xml b/riven-third/pom.xml index d5d338d..d412d05 100644 --- a/riven-third/pom.xml +++ b/riven-third/pom.xml @@ -85,8 +85,8 @@ 2.0.0-SNAPSHOT
- cn.axzo.tyr - tyr-api + cn.axzo.platform + axzo-log-api diff --git a/riven-third/src/main/java/cn/axzo/riven/third/entity/ThirdProjectPerson.java b/riven-third/src/main/java/cn/axzo/riven/third/entity/ThirdProjectPerson.java index 6a08724..e2e3e77 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/entity/ThirdProjectPerson.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/entity/ThirdProjectPerson.java @@ -60,6 +60,11 @@ public class ThirdProjectPerson extends BaseEntity{ */ private String thirdPostName; + /** + * 最后一次同步时间 + */ + private Date lastSyncAt; + /** * 三方ext,扩展域等等,工种信息等等 */ diff --git a/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonIncJob.java b/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonIncJob.java new file mode 100644 index 0000000..74b1a13 --- /dev/null +++ b/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonIncJob.java @@ -0,0 +1,122 @@ +package cn.axzo.riven.third.job; + +import cn.axzo.riven.third.entity.ThirdPerson; +import cn.axzo.riven.third.entity.ThirdProjectPerson; +import cn.axzo.riven.third.service.ThirdPersonService; +import cn.axzo.riven.third.service.ThirdProjectPersonService; +import cn.axzo.riven.third.service.ThirdProjectService; +import cn.axzo.riven.third.taizhou.entity.TaiZhouProject; +import cn.axzo.riven.third.taizhou.service.TaiZhouService; +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSON; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.IJobHandler; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 增量新增job + */ +@Slf4j +@Component +public class TaiZhouProjectPersonIncJob extends IJobHandler { + + + @Autowired + ThirdProjectPersonService thirdProjectPersonService; + + @Autowired + ThirdProjectService thirdProjectService; + + @Autowired + ThirdPersonService thirdPersonService; + + @Autowired + TaiZhouService taiZhouService; + + @XxlJob("taiZhouProjectPersonIncJob") + @Override + public ReturnT execute(String s) throws Exception { + + log.info("taiZhouProjectPersonJob-inc start"); + + //获取泰州所有的项目信息 + List taiZhouProjectList = taiZhouService.queryThirdProjectForTaiZhou(); + + if (CollectionUtils.isEmpty(taiZhouProjectList)) { + log.info("DB中泰州项目为空,同步结束"); + return ReturnT.SUCCESS; + } + log.info("taiZhouProjectPersonJob-inc--项目list:{}", JSON.toJSONString(taiZhouProjectList)); + + + log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--开始"); + Map> incThirdProjectPeople = new HashMap<>(); + taiZhouProjectList.forEach(x -> { + log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--项目ID:{} 远程获取开始", x.getThirdProjectId()); + //基于项目维度进行获取项目下的员工信息 + List thirdProjectPersonList = taiZhouService.remoteQueryProjectPersonInc(x); + + //更新入库 + if (!CollectionUtils.isEmpty(thirdProjectPersonList)) { + log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--项目ID:{},size:{}", x.getThirdProjectId(), thirdProjectPersonList.size()); + thirdProjectPersonList.forEach(thirdProjectPerson -> { + thirdProjectPersonService.addOrUpdateThirdProjectPerson(thirdProjectPerson, true); + }); + incThirdProjectPeople.put(x.getThirdProjectId(), thirdProjectPersonList); + } else { + log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--项目ID:{},size:0", x.getThirdProjectId()); + } + }); + log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--结束"); + + if (incThirdProjectPeople.isEmpty()) { + log.info("taiZhouProjectPersonJob-inc 泰州job同步项目人员信息--本次无新增数据,无需处理"); + return ReturnT.SUCCESS; + } + + log.info("泰州job同步项目人员信息--开始"); + + //根据项目信息获取调用泰州的项目人员接口 + taiZhouProjectList.forEach(x -> { + log.info("taiZhouProjectPersonJob-inc 同步项目人员信息--项目ID:{} 开始", x.getThirdProjectId()); + + List thirdProjectPeople = incThirdProjectPeople.get(x.getThirdProjectId()); + if (CollUtil.isEmpty(thirdProjectPeople)) { + log.info("taiZhouProjectPersonJob-inc 同步项目人员信息--项目ID:{} 结束 - 当前项目没有新增的项目用工信息", x.getThirdProjectId()); + return; + } + + List thirdPersonList = taiZhouService.remoteQueryPerson(x, thirdProjectPeople); + + //更新入库 + if (!CollectionUtils.isEmpty(thirdPersonList)) { + log.info("taiZhouProjectPersonJob-inc 同步项目人员信息--项目ID:{},size:{}", x.getThirdProjectId(), thirdPersonList.size()); + + thirdPersonList.forEach(thirdPerson -> { + try { + taiZhouService.handlePerson(thirdPerson, x, TaiZhouService.HandlerPersonType.ADD); + } catch (Exception e) { + log.error("泰州人员:{} 处理异常,对应泰州ID:{}", thirdPerson.getThirdPersonName(), thirdPerson.getThirdUniquePersonId(), e); + } + + }); + } else { + log.info("taiZhouProjectPersonJob-inc 同步项目人员信息--项目ID:{},size:0", x.getThirdProjectId()); + } + }); + log.info("taiZhouProjectPersonIncJob 泰州job同步项目用工信息--结束"); + + log.info("taiZhouProjectPersonIncJob end"); + + return ReturnT.SUCCESS; + } +} diff --git a/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonJob.java b/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonJob.java index c64ef92..ba77044 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonJob.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonJob.java @@ -8,6 +8,7 @@ import cn.axzo.riven.third.service.ThirdProjectService; import cn.axzo.riven.third.taizhou.entity.TaiZhouProject; import cn.axzo.riven.third.taizhou.service.TaiZhouService; import com.alibaba.fastjson.JSON; +import com.google.common.collect.ImmutableList; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.XxlJob; @@ -16,11 +17,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import java.util.ArrayList; import java.util.List; /** - * Author: zhongpeng - * Date: 2024/6/25 14:12 + * 全量更新 */ @Slf4j @Component @@ -65,7 +66,8 @@ public class TaiZhouProjectPersonJob extends IJobHandler { if (!CollectionUtils.isEmpty(thirdProjectPersonList)) { log.info("taiZhouProjectPersonJob 同步项目用工信息--项目ID:{},size:{}", x.getThirdProjectId(), thirdProjectPersonList.size()); thirdProjectPersonList.forEach(thirdProjectPerson -> { - thirdProjectPersonService.addOrUpdateThirdProjectPerson(thirdProjectPerson); + // 全量更新不插入thirdProjectPerson数据。只做更新操作。新增由增量更新处理 + thirdProjectPersonService.addOrUpdateThirdProjectPerson(thirdProjectPerson, false); }); } else { log.info("taiZhouProjectPersonJob 同步项目用工信息--项目ID:{},size:0", x.getThirdProjectId()); @@ -73,14 +75,15 @@ public class TaiZhouProjectPersonJob extends IJobHandler { }); log.info("taiZhouProjectPersonJob 同步项目用工信息--结束"); - log.info("泰州job同步项目人员信息--开始"); + log.info("taiZhouProjectPersonJob 泰州job同步项目人员信息--开始"); //根据项目信息获取调用泰州的项目人员接口 taiZhouProjectList.forEach(x -> { log.info("taiZhouProjectPersonJob 同步项目人员信息--项目ID:{} 开始", x.getThirdProjectId()); - List thirdPersonList = taiZhouService.remoteQueryPerson(x); + // 全量更新接口,直接返回全量的用户数据,主要处理人员信息变更的情况 + List thirdPersonList = taiZhouService.remoteQueryPerson(x, ImmutableList.of()); //更新入库 if (!CollectionUtils.isEmpty(thirdPersonList)) { @@ -88,7 +91,7 @@ public class TaiZhouProjectPersonJob extends IJobHandler { thirdPersonList.forEach(thirdPerson -> { try { - taiZhouService.handlePerson(thirdPerson, x); + taiZhouService.handlePerson(thirdPerson, x, TaiZhouService.HandlerPersonType.UPDATE); } catch (Exception e) { log.error("泰州人员:{} 处理异常,对应泰州ID:{}", thirdPerson.getThirdPersonName(), thirdPerson.getThirdUniquePersonId(), e); } @@ -98,7 +101,7 @@ public class TaiZhouProjectPersonJob extends IJobHandler { log.info("taiZhouProjectPersonJob 同步项目人员信息--项目ID:{},size:0", x.getThirdProjectId()); } }); - log.info("泰州job同步项目用工信息--结束"); + log.info("taiZhouProjectPersonJob 泰州job同步项目人员信息--结束"); log.info("taiZhouProjectPersonJob end"); diff --git a/riven-third/src/main/java/cn/axzo/riven/third/service/ThirdProjectPersonService.java b/riven-third/src/main/java/cn/axzo/riven/third/service/ThirdProjectPersonService.java index ac7d8d5..50df14d 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/service/ThirdProjectPersonService.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/service/ThirdProjectPersonService.java @@ -10,8 +10,8 @@ import java.util.List; */ public interface ThirdProjectPersonService { - public void addOrUpdateThirdProjectPerson(ThirdProjectPerson thirdProjectPerson); + void addOrUpdateThirdProjectPerson(ThirdProjectPerson thirdProjectPerson, boolean add); - public ThirdProjectPerson queryThirdProjectPerson(String thirdCode,String thirdProjectId,String thirdUniquePersonId); + ThirdProjectPerson queryThirdProjectPerson(String thirdCode,String thirdProjectId,String thirdUniquePersonId); } diff --git a/riven-third/src/main/java/cn/axzo/riven/third/service/impl/ThirdProjectPersonServiceImpl.java b/riven-third/src/main/java/cn/axzo/riven/third/service/impl/ThirdProjectPersonServiceImpl.java index aee83c8..994e821 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/service/impl/ThirdProjectPersonServiceImpl.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/service/impl/ThirdProjectPersonServiceImpl.java @@ -1,6 +1,7 @@ package cn.axzo.riven.third.service.impl; import cn.axzo.riven.third.dao.ThirdProjectPersonDao; +import cn.axzo.riven.third.entity.ThirdPerson; import cn.axzo.riven.third.entity.ThirdProjectPerson; import cn.axzo.riven.third.service.ThirdProjectPersonService; import com.alibaba.fastjson.JSON; @@ -8,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.Date; import java.util.List; import java.util.Objects; @@ -23,7 +25,7 @@ public class ThirdProjectPersonServiceImpl implements ThirdProjectPersonService private ThirdProjectPersonDao thirdProjectPersonDao; @Override - public void addOrUpdateThirdProjectPerson(ThirdProjectPerson thirdProjectPerson) { + public void addOrUpdateThirdProjectPerson(ThirdProjectPerson thirdProjectPerson, boolean add) { ThirdProjectPerson db = thirdProjectPersonDao.lambdaQuery() .eq(ThirdProjectPerson::getThirdCode, thirdProjectPerson.getThirdCode()) @@ -32,8 +34,8 @@ public class ThirdProjectPersonServiceImpl implements ThirdProjectPersonService .one(); log.info("thirdProjectPerson:{}",JSON.toJSON(thirdProjectPerson)); - //如果数据库为空,则插入 - if (Objects.isNull(db)) { + //如果数据库为空,并且是新增的时候,才新增,避免竞争 + if (Objects.isNull(db) && add) { thirdProjectPersonDao.save(thirdProjectPerson); } //反之则更新 @@ -49,6 +51,7 @@ public class ThirdProjectPersonServiceImpl implements ThirdProjectPersonService .set(!Objects.isNull(thirdProjectPerson.getThirdDepartmentId()),ThirdProjectPerson::getThirdDepartmentId, thirdProjectPerson.getThirdDepartmentId()) .set(!Objects.isNull(thirdProjectPerson.getThirdPostName()),ThirdProjectPerson::getThirdPostName, thirdProjectPerson.getThirdPostName()) .set(!Objects.isNull(thirdProjectPerson.getThirdExt()),ThirdProjectPerson::getThirdExt, thirdProjectPerson.getThirdExt()) + .set(thirdProjectPerson.getLastSyncAt() != null, ThirdProjectPerson::getLastSyncAt, thirdProjectPerson.getLastSyncAt()) .update(); } diff --git a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/rpc/TaiZhouRpc.java b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/rpc/TaiZhouRpc.java index d474192..e2137ad 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/rpc/TaiZhouRpc.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/rpc/TaiZhouRpc.java @@ -3,6 +3,7 @@ package cn.axzo.riven.third.taizhou.rpc; import cn.axzo.riven.third.taizhou.constant.enums.TaiZhouApiEnum; import cn.axzo.riven.third.taizhou.rpc.req.TaiZhouParamReq; import cn.axzo.riven.third.taizhou.rpc.req.TaiZhouPhoneReq; +import cn.axzo.riven.third.taizhou.rpc.req.TaiZhouWorkerHmcIncReq; import cn.axzo.riven.third.taizhou.rpc.res.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; @@ -57,6 +58,30 @@ public class TaiZhouRpc { } + /** + * 调用泰州平台查询:项目用工信息(增量)(GetWorkerHmc_Inc) + */ + public List getWorkerHmcInc(TaiZhouWorkerHmcIncReq req) { + List resList = new ArrayList<>(); + try { + ResponseEntity response = client.post(TaiZhouApiEnum.GET_WORKER_HMC_INC.getPath(), req, EMPTY_JSON_STR); + TaiZhouRes taiZhouRes = client.parseResult(response, String.class); + if (!taiZhouRes.getResultSuccess()) { + log.info("taizhou: GetWorkerHmc_Inc failed, res={}", JSON.toJSONString(taiZhouRes)); + return resList; + } + List list = JSON.parseObject(taiZhouRes.getResultData(), new TypeReference>() { + }); + if (CollectionUtils.isNotEmpty(list)) { + resList = list; + } + } catch (Exception e) { + log.error("泰州获取调用项目人员接口GetWorkerHmcInc异常",e); + } + return resList; + } + + /** * 调用泰州平台查询:人员基本信息(GB_Worker) * diff --git a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/rpc/req/TaiZhouWorkerHmcIncReq.java b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/rpc/req/TaiZhouWorkerHmcIncReq.java new file mode 100644 index 0000000..663dccd --- /dev/null +++ b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/rpc/req/TaiZhouWorkerHmcIncReq.java @@ -0,0 +1,26 @@ +package cn.axzo.riven.third.taizhou.rpc.req; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class TaiZhouWorkerHmcIncReq extends TaiZhouParamReq { + /** + * 人员状态(0在场,1离场,空所有) + */ + private String ryzt; + + /** + * 开始时间(yyyy-mm-dd) + */ + @JSONField(name = "BeginDate") + private String beginDate; + + /** + * 结束时间(yyyy-mm-dd) + */ + @JSONField(name = "EndDate") + private String endDate; +} diff --git a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/TaiZhouService.java b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/TaiZhouService.java index 9800b3b..0baabd8 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/TaiZhouService.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/TaiZhouService.java @@ -14,16 +14,21 @@ import java.util.List; public interface TaiZhouService { - public void updateProjectIdForRemote(TaiZhouProject taiZhouProject); + void updateProjectIdForRemote(TaiZhouProject taiZhouProject); - public List queryThirdProjectForTaiZhou(); + List queryThirdProjectForTaiZhou(); - public List remoteQueryProjectPerson(TaiZhouProject taiZhouProject); + List remoteQueryProjectPerson(TaiZhouProject taiZhouProject); + List remoteQueryProjectPersonInc(TaiZhouProject taiZhouProject); - public List remoteQueryPerson(TaiZhouProject taiZhouProject); + List remoteQueryPerson(TaiZhouProject taiZhouProject, List needReturnPeople); - public void handlePerson(ThirdPerson thirdPerson, TaiZhouProject taiZhouProject); + void handlePerson(ThirdPerson thirdPerson, TaiZhouProject taiZhouProject, HandlerPersonType handlerPersonType); + + enum HandlerPersonType{ + ADD,UPDATE; + } } diff --git a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/OperateLogServiceImpl.java b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/OperateLogServiceImpl.java index 3a51ec3..58b0ab9 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/OperateLogServiceImpl.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/OperateLogServiceImpl.java @@ -1,20 +1,16 @@ package cn.axzo.riven.third.taizhou.service.impl; import cn.axzo.framework.jackson.utility.JSON; +import cn.axzo.log.platform.client.feign.LogApi; +import cn.axzo.log.platform.client.model.req.LogAddReq; import cn.axzo.riven.third.taizhou.service.OperateLogService; -import cn.axzo.tyr.client.feign.PermissionOperateLogApi; -import cn.axzo.tyr.client.model.req.PermissionOperateLogReq; -import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.ImmutableList; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Service; -import java.util.Optional; import java.util.concurrent.ExecutorService; @Service @@ -22,14 +18,14 @@ import java.util.concurrent.ExecutorService; @RefreshScope public class OperateLogServiceImpl implements OperateLogService { + private static final String OPERATE_LOG_SCENE = "riven_taizhou_sync"; + @Qualifier("operateLogSyncExecutor") @Autowired private ExecutorService executorService; @Autowired - private PermissionOperateLogApi permissionOperateLogApi; - @Value("${operateLog.saveToTyr:true}") - private Boolean saveToTyr; + private LogApi logApi; @Override public void save(SaveParam param) { @@ -47,24 +43,17 @@ public class OperateLogServiceImpl implements OperateLogService { public void doSave(SaveParam param) { try { param.check(); - log.info("OperateLogServiceImpl doSave, saveToTyr = {}, saveParam = {}", saveToTyr, JSON.toJSONString(param)); - if (BooleanUtils.isTrue(saveToTyr)) { - // 暂时存在tyr的日志。后续如果需要切换,再调整 - permissionOperateLogApi.save(PermissionOperateLogReq.builder() - .operatorId(param.getOperatorId() == null || param.getOperatorId() < 1 ? null : param.getOperatorId()) - .operatorName(StringUtils.firstNonBlank(param.getOperatorName(), "unknown")) - .requestData(param.getOldValue()) - .operateData(param.getNewValue()) - .scene(String.format("%s_%s", param.getResourceType().name(), param.getOperateType().name())) - .sceneId(param.getResourceId() + "") - .tableName(param.getResourceType().getTableName()) - .ext(Optional.ofNullable(param.getExt()).orElseGet(JSONObject::new) - .fluentPut("summary", param.getSummary())) - .build()); - } + log.info("OperateLogServiceImpl doSave, saveParam = {}", JSON.toJSONString(param)); + LogAddReq logAddReq = LogAddReq.builder() + .scene(OPERATE_LOG_SCENE) + .level("INFO") + .tags(ImmutableList.of(param.getResourceId() + "")) + .message(JSON.toJSONString(param)) + .build(); + logApi.addLog(logAddReq); } catch (Throwable e) { log.warn("OperateLogServiceImpl doSave caught exception, msg = {}, param = {}", e.getMessage(), JSON.toJSONString(param), e); } } -} +} \ No newline at end of file diff --git a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java index 8a8f239..9fb52e8 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java @@ -24,6 +24,7 @@ import cn.axzo.riven.third.taizhou.entity.TaiZhouThirdProjectExt; import cn.axzo.riven.third.taizhou.rpc.TaiZhouRpc; import cn.axzo.riven.third.taizhou.rpc.req.TaiZhouParamReq; import cn.axzo.riven.third.taizhou.rpc.req.TaiZhouPhoneReq; +import cn.axzo.riven.third.taizhou.rpc.req.TaiZhouWorkerHmcIncReq; import cn.axzo.riven.third.taizhou.rpc.req.TaiZhouWorkerHmcReq; import cn.axzo.riven.third.taizhou.rpc.res.TaiZhouPhoneRes; import cn.axzo.riven.third.taizhou.rpc.res.TaiZhouPrjWorkerRes; @@ -32,8 +33,12 @@ import cn.axzo.riven.third.taizhou.rpc.res.TazZhouProjectRes; import cn.axzo.riven.third.taizhou.service.OperateLogService; import cn.axzo.riven.third.taizhou.service.TaiZhouService; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; @@ -44,8 +49,10 @@ import org.springframework.util.CollectionUtils; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; /** @@ -164,6 +171,8 @@ public class TaiZhouServiceImpl implements TaiZhouService { req.setBagsBH(ext.getBagsBH()); req.setDataNumber(ext.getDataNumber()); req.setRyzt(""); + Date now = new Date(); + List resList = rpc.GetWorkerHmc(req); @@ -171,6 +180,47 @@ public class TaiZhouServiceImpl implements TaiZhouService { return projectPersonList; } //转化对象 + return buildThirdProjectPeople(resList, now); + + } + + + @Override + public List remoteQueryProjectPersonInc(TaiZhouProject taiZhouProject) { + ThirdProjectPerson latestSyncProjectPerson = thirdProjectPersonDao.lambdaQuery() + .eq(ThirdProjectPerson::getThirdProjectId, taiZhouProject.getThirdProjectId()) + .eq(ThirdProjectPerson::getThirdCode, ThirdCodeEnum.TAI_ZHOU.getCode()) + .orderByDesc(ThirdProjectPerson::getLastSyncAt) + .last(" limit 1") + .one(); + // 没有取到最晚同步时间,走全量同步 + if (latestSyncProjectPerson == null || latestSyncProjectPerson.getLastSyncAt() == null) { + log.info("增加查询项目用工信息, 没有找到最后一次同步时间,走全量同步"); + return remoteQueryProjectPerson(taiZhouProject); + } + + TaiZhouThirdProjectExt ext = taiZhouProject.getTaiZhouThirdProjectExt(); + String beginDate = DateUtil.formatDate(latestSyncProjectPerson.getLastSyncAt()); + Date endTime = new Date(); + String endDate = DateUtil.formatDate(endTime); + TaiZhouWorkerHmcIncReq req = new TaiZhouWorkerHmcIncReq(); + req.setDataNumber(ext.getDataNumber()); + req.setBagsBH(ext.getBagsBH()); + req.setRyzt(""); + req.setBeginDate(beginDate); + req.setEndDate(endDate); + List resList = rpc.getWorkerHmcInc(req); + + // 没有查询到人 + if (CollectionUtils.isEmpty(resList)) { + return ImmutableList.of(); + } + //转化对象 + return buildThirdProjectPeople(resList, endTime); + + } + + private List buildThirdProjectPeople(List resList, Date syncTime) { return resList.stream().map(x -> { ThirdProjectPerson projectPerson = new ThirdProjectPerson(); projectPerson.setThirdCode(ThirdCodeEnum.TAI_ZHOU.getCode()); @@ -185,16 +235,16 @@ public class TaiZhouServiceImpl implements TaiZhouService { projectPerson.setThirdDepartmentId(""); projectPerson.setThirdPostName(""); projectPerson.setCreateAt(new Date()); + projectPerson.setLastSyncAt(syncTime); //填充扩展域 projectPerson.setThirdExt(buildThirdExt(x)); return projectPerson; }).collect(Collectors.toList()); - } @Override - public List remoteQueryPerson(TaiZhouProject taiZhouProject) { + public List remoteQueryPerson(TaiZhouProject taiZhouProject, List needReturnPeople) { List personList = new ArrayList<>(); @@ -209,14 +259,23 @@ public class TaiZhouServiceImpl implements TaiZhouService { req.setDataNumber(ext.getDataNumber()); List resList = rpc.gBWorker(req); if (CollectionUtils.isEmpty(resList)) { + log.info("获取泰州人员信息(gBWorker) - projectTotalPersonCount = {}, returnCount = {}, needReturnCount = {}", 0, 0, CollUtil.size(needReturnPeople)); return personList; } - resList.forEach(x -> { + Set needReturnWorkerIds = needReturnPeople == null ? ImmutableSet.of() : + needReturnPeople.stream().map(ThirdProjectPerson::getThirdUniquePersonId).collect(Collectors.toSet()); + List needReturns = resList.stream() + // 如果指定了需要返回的people,只需要返回这些即可(主要是为了节约换取手机号接口调用的时间,这里耗时最严重) + .filter(r -> needReturnWorkerIds.isEmpty() || needReturnWorkerIds.contains(r.getWorkerId())) + .collect(Collectors.toList()); + + needReturns.forEach(x -> { ThirdPerson person = buildPerson(taiZhouProject, x); personList.add(person); }); - + log.info("获取泰州人员信息(gBWorker) - projectTotalPersonCount = {}, returnCount = {}, needReturnCount = {}" + , resList.size(), needReturns.size(), CollUtil.size(needReturnPeople)); return personList; } @@ -290,7 +349,7 @@ public class TaiZhouServiceImpl implements TaiZhouService { } @Override - public void handlePerson(ThirdPerson thirdPerson, TaiZhouProject taiZhouProject) { + public void handlePerson(ThirdPerson thirdPerson, TaiZhouProject taiZhouProject, HandlerPersonType handlerPersonType) { // 如果手机号解密失败了,本次不处理,待下次同步 if (StringUtils.contains(thirdPerson.getThirdPersonPhone(), "*")) { log.warn("泰州人员:{},{},{} 手机号解密失败,本次忽略处理", @@ -299,43 +358,58 @@ public class TaiZhouServiceImpl implements TaiZhouService { } log.info("泰州人员:{} 开始处理", thirdPerson.getThirdPersonName()); ThirdPerson oldThirdPerson = queryThirdPerson(thirdPerson); - //如果数据库为空,则插入 - if (Objects.isNull(oldThirdPerson)) { - //数据入库 - thirdPersonDao.save(thirdPerson); - operateLogService.save(buildOperateParam(null, null, - OperateLogService.OperateType.ADD, thirdPerson, "新增泰州用户", (JSONObject) JSON.toJSON(thirdPerson))); - //业务操作 - newDataHandle(thirdPerson, taiZhouProject); + Set updateIgnoredWorkerNames = new HashSet<>(); + + if (handlerPersonType == HandlerPersonType.ADD){ + if (oldThirdPerson == null) { + //数据入库 + thirdPersonDao.save(thirdPerson); + operateLogService.save(buildOperateParam(null, null, + OperateLogService.OperateType.ADD, thirdPerson, "新增泰州用户", (JSONObject) JSON.toJSON(thirdPerson))); + //业务操作 + newDataHandle(thirdPerson, taiZhouProject); + } else { + // 如果用户已经存在,则走全量刷新的接口,进行刷新操作。 + log.info("泰州人员:{} 本次不处理,ADD 已经存在的ThirdPerson. db.id = {}", oldThirdPerson.getThirdPersonName(), oldThirdPerson.getId()); + } + }else if (handlerPersonType == HandlerPersonType.UPDATE) { + if (oldThirdPerson != null) { + //先更新数据,保持和泰州一致 + updateThirdPerson(oldThirdPerson, thirdPerson); + + //业务前置检查,泰州同步关键信息不能变化,身份证,姓名不能有变化 + taiZhouSyncBasicPersonCheck(thirdPerson, oldThirdPerson); + + //如果没有绑定,直接使用新手机号绑定 + if (oldThirdPerson.getPersonId() == 0L) { + log.info("泰州人员:{},历史数据未绑定安心筑账号,重新执行绑定业务(根据业务条件尝试绑定,不一定会绑定)", thirdPerson.getThirdPersonName()); + newDataHandle(thirdPerson, taiZhouProject); + return; + } + + //查询当前绑定的安心筑信息 + PersonProfileDto currentBindPerson = userCenterRpc.queryPersonByPersonId(oldThirdPerson.getPersonId()); + //如果数据不为空,且状态是删除状态,清除绑定关系后,重新走绑定流程 + if (Objects.isNull(currentBindPerson)) { + log.info("泰州人员:{},历史绑定数据personID:{} 被删除,清除绑定关系后,重新执行绑定业务(根据业务条件尝试绑定,不一定会绑定)", thirdPerson.getThirdPersonName(), oldThirdPerson.getPersonId()); + clearBindPerson(oldThirdPerson); + newDataHandle(thirdPerson, taiZhouProject); + return; + } + + //业务操作 + updateDataHandle(thirdPerson, oldThirdPerson, currentBindPerson); + } else { + // 全量更新的时候,该数据还没有被增量接口写入,无需处理。下次增量同步会更新进来。 + updateIgnoredWorkerNames.add(thirdPerson.getThirdPersonName()); + } } - //反之则更新 - else { - //先更新数据,保持和泰州一致 - updateThirdPerson(oldThirdPerson, thirdPerson); - - //业务前置检查,泰州同步关键信息不能变化,身份证,姓名不能有变化 - taiZhouSyncBasicPersonCheck(thirdPerson, oldThirdPerson); - - //如果没有绑定,直接使用新手机号绑定 - if (oldThirdPerson.getPersonId() == 0L) { - log.info("泰州人员:{},历史数据未绑定安心筑账号,重新执行绑定业务(根据业务条件尝试绑定,不一定会绑定)", thirdPerson.getThirdPersonName()); - newDataHandle(thirdPerson, taiZhouProject); - return; - } - - //查询当前绑定的安心筑信息 - PersonProfileDto currentBindPerson = userCenterRpc.queryPersonByPersonId(oldThirdPerson.getPersonId()); - //如果数据不为空,且状态是删除状态,清除绑定关系后,重新走绑定流程 - if (Objects.isNull(currentBindPerson)) { - log.info("泰州人员:{},历史绑定数据personID:{} 被删除,清除绑定关系后,重新执行绑定业务(根据业务条件尝试绑定,不一定会绑定)", thirdPerson.getThirdPersonName(), oldThirdPerson.getPersonId()); - clearBindPerson(oldThirdPerson); - newDataHandle(thirdPerson, taiZhouProject); - return; - } - - //业务操作 - updateDataHandle(thirdPerson, oldThirdPerson, currentBindPerson); - + // 存在本次未处理的数据() + if (!updateIgnoredWorkerNames.isEmpty()) { + String errorLog = String.format("泰州人员:%s 处理中 - 发现用户尚未增量新增(如连续多次告警,请确认),workerNames = %s" + , thirdPerson.getThirdPersonName(), JSON.toJSONString(updateIgnoredWorkerNames)); + log.info(errorLog); + dingDingRobotService.send(errorLog); } log.info("泰州人员:{} 处理结束", thirdPerson.getThirdPersonName()); } From 03be21796afd90ec8eafb572eccfa7ea6840b4f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=95=8F?= Date: Mon, 21 Oct 2024 15:54:54 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat(REQ-2960):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=B3=B0=E5=B7=9E=E4=BA=BA=E5=91=98=E5=90=8C=E6=AD=A5=E6=9C=BA?= =?UTF-8?q?=E5=88=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0=E9=93=BE=E8=B7=AF=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 + .../main/java/cn/axzo/riven/Application.java | 2 +- riven-third/pom.xml | 5 +- .../riven/third/common/MdcLogConstant.java | 8 + .../third/job/TaiZhouProjectPersonIncJob.java | 145 +++++++++--------- .../third/job/TaiZhouProjectPersonJob.java | 121 ++++++++------- .../impl/ThirdProjectPersonServiceImpl.java | 1 - .../third/taizhou/rpc/TaiZhouClient.java | 3 +- .../service/impl/TaiZhouServiceImpl.java | 20 ++- 9 files changed, 177 insertions(+), 133 deletions(-) create mode 100644 riven-third/src/main/java/cn/axzo/riven/third/common/MdcLogConstant.java diff --git a/pom.xml b/pom.xml index 74f3574..f07e2c7 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,11 @@ axzo-log-api 1.0.0-SNAPSHOT + + cn.axzo.framework.logging + axzo-common-trace + 1.0.0-SNAPSHOT + io.github.openfeign feign-httpclient diff --git a/riven-server/src/main/java/cn/axzo/riven/Application.java b/riven-server/src/main/java/cn/axzo/riven/Application.java index 793c8a2..b604880 100644 --- a/riven-server/src/main/java/cn/axzo/riven/Application.java +++ b/riven-server/src/main/java/cn/axzo/riven/Application.java @@ -9,7 +9,7 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.Environment; @Slf4j -@SpringBootApplication(scanBasePackages = "cn.axzo") +@SpringBootApplication(scanBasePackages = {"cn.axzo", "com.axzo.framework"}) @EnableFeignClients(basePackages = {"cn.axzo"}) public class Application { public static void main(String[] args) { diff --git a/riven-third/pom.xml b/riven-third/pom.xml index d412d05..8b5b195 100644 --- a/riven-third/pom.xml +++ b/riven-third/pom.xml @@ -88,7 +88,10 @@ cn.axzo.platform axzo-log-api - + + cn.axzo.framework.logging + axzo-common-trace + com.aliyun alibaba-dingtalk-service-sdk diff --git a/riven-third/src/main/java/cn/axzo/riven/third/common/MdcLogConstant.java b/riven-third/src/main/java/cn/axzo/riven/third/common/MdcLogConstant.java new file mode 100644 index 0000000..446e94b --- /dev/null +++ b/riven-third/src/main/java/cn/axzo/riven/third/common/MdcLogConstant.java @@ -0,0 +1,8 @@ +package cn.axzo.riven.third.common; + +public class MdcLogConstant { + /** + * MDC 日志 KEY + */ + public static final String CTX_LOG_ID_MDC = "ctxLogId"; +} diff --git a/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonIncJob.java b/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonIncJob.java index 74b1a13..8d8aae6 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonIncJob.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonIncJob.java @@ -1,5 +1,6 @@ package cn.axzo.riven.third.job; +import cn.axzo.riven.third.common.MdcLogConstant; import cn.axzo.riven.third.entity.ThirdPerson; import cn.axzo.riven.third.entity.ThirdProjectPerson; import cn.axzo.riven.third.service.ThirdPersonService; @@ -7,6 +8,7 @@ import cn.axzo.riven.third.service.ThirdProjectPersonService; import cn.axzo.riven.third.service.ThirdProjectService; import cn.axzo.riven.third.taizhou.entity.TaiZhouProject; import cn.axzo.riven.third.taizhou.service.TaiZhouService; +import cn.azxo.framework.common.logger.JobLoggerTemplate; import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSON; import com.xxl.job.core.biz.model.ReturnT; @@ -17,7 +19,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,7 +30,6 @@ import java.util.Map; @Component public class TaiZhouProjectPersonIncJob extends IJobHandler { - @Autowired ThirdProjectPersonService thirdProjectPersonService; @@ -42,81 +42,86 @@ public class TaiZhouProjectPersonIncJob extends IJobHandler { @Autowired TaiZhouService taiZhouService; + @Autowired + JobLoggerTemplate jobLoggerTemplate; + @XxlJob("taiZhouProjectPersonIncJob") @Override public ReturnT execute(String s) throws Exception { + return jobLoggerTemplate.execute(MdcLogConstant.CTX_LOG_ID_MDC, () -> { - log.info("taiZhouProjectPersonJob-inc start"); + log.info("taiZhouProjectPersonJob-inc start"); - //获取泰州所有的项目信息 - List taiZhouProjectList = taiZhouService.queryThirdProjectForTaiZhou(); + //获取泰州所有的项目信息 + List taiZhouProjectList = taiZhouService.queryThirdProjectForTaiZhou(); + + if (CollectionUtils.isEmpty(taiZhouProjectList)) { + log.info("DB中泰州项目为空,同步结束"); + return ReturnT.SUCCESS; + } + log.info("taiZhouProjectPersonJob-inc--项目list:{}", JSON.toJSONString(taiZhouProjectList)); + + + log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--开始"); + Map> incThirdProjectPeople = new HashMap<>(); + taiZhouProjectList.forEach(x -> { + log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--项目ID:{} 远程获取开始", x.getThirdProjectId()); + //基于项目维度进行获取项目下的员工信息 + List thirdProjectPersonList = taiZhouService.remoteQueryProjectPersonInc(x); + + //更新入库 + if (!CollectionUtils.isEmpty(thirdProjectPersonList)) { + log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--项目ID:{},size:{}", x.getThirdProjectId(), thirdProjectPersonList.size()); + thirdProjectPersonList.forEach(thirdProjectPerson -> { + thirdProjectPersonService.addOrUpdateThirdProjectPerson(thirdProjectPerson, true); + }); + incThirdProjectPeople.put(x.getThirdProjectId(), thirdProjectPersonList); + } else { + log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--项目ID:{},size:0", x.getThirdProjectId()); + } + }); + log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--结束"); + + if (incThirdProjectPeople.isEmpty()) { + log.info("taiZhouProjectPersonJob-inc 泰州job同步项目人员信息--本次无新增数据,无需处理"); + return ReturnT.SUCCESS; + } + + log.info("泰州job同步项目人员信息--开始"); + + //根据项目信息获取调用泰州的项目人员接口 + taiZhouProjectList.forEach(x -> { + log.info("taiZhouProjectPersonJob-inc 同步项目人员信息--项目ID:{} 开始", x.getThirdProjectId()); + + List thirdProjectPeople = incThirdProjectPeople.get(x.getThirdProjectId()); + if (CollUtil.isEmpty(thirdProjectPeople)) { + log.info("taiZhouProjectPersonJob-inc 同步项目人员信息--项目ID:{} 结束 - 当前项目没有新增的项目用工信息", x.getThirdProjectId()); + return; + } + + List thirdPersonList = taiZhouService.remoteQueryPerson(x, thirdProjectPeople); + + //更新入库 + if (!CollectionUtils.isEmpty(thirdPersonList)) { + log.info("taiZhouProjectPersonJob-inc 同步项目人员信息--项目ID:{},size:{}", x.getThirdProjectId(), thirdPersonList.size()); + + thirdPersonList.forEach(thirdPerson -> { + try { + taiZhouService.handlePerson(thirdPerson, x, TaiZhouService.HandlerPersonType.ADD); + } catch (Exception e) { + log.error("泰州人员:{} 处理异常,对应泰州ID:{}", thirdPerson.getThirdPersonName(), thirdPerson.getThirdUniquePersonId(), e); + } + + }); + } else { + log.info("taiZhouProjectPersonJob-inc 同步项目人员信息--项目ID:{},size:0", x.getThirdProjectId()); + } + }); + log.info("taiZhouProjectPersonIncJob 泰州job同步项目用工信息--结束"); + + log.info("taiZhouProjectPersonIncJob end"); - if (CollectionUtils.isEmpty(taiZhouProjectList)) { - log.info("DB中泰州项目为空,同步结束"); return ReturnT.SUCCESS; - } - log.info("taiZhouProjectPersonJob-inc--项目list:{}", JSON.toJSONString(taiZhouProjectList)); - - - log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--开始"); - Map> incThirdProjectPeople = new HashMap<>(); - taiZhouProjectList.forEach(x -> { - log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--项目ID:{} 远程获取开始", x.getThirdProjectId()); - //基于项目维度进行获取项目下的员工信息 - List thirdProjectPersonList = taiZhouService.remoteQueryProjectPersonInc(x); - - //更新入库 - if (!CollectionUtils.isEmpty(thirdProjectPersonList)) { - log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--项目ID:{},size:{}", x.getThirdProjectId(), thirdProjectPersonList.size()); - thirdProjectPersonList.forEach(thirdProjectPerson -> { - thirdProjectPersonService.addOrUpdateThirdProjectPerson(thirdProjectPerson, true); - }); - incThirdProjectPeople.put(x.getThirdProjectId(), thirdProjectPersonList); - } else { - log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--项目ID:{},size:0", x.getThirdProjectId()); - } }); - log.info("taiZhouProjectPersonJob-inc 同步项目用工信息--结束"); - - if (incThirdProjectPeople.isEmpty()) { - log.info("taiZhouProjectPersonJob-inc 泰州job同步项目人员信息--本次无新增数据,无需处理"); - return ReturnT.SUCCESS; - } - - log.info("泰州job同步项目人员信息--开始"); - - //根据项目信息获取调用泰州的项目人员接口 - taiZhouProjectList.forEach(x -> { - log.info("taiZhouProjectPersonJob-inc 同步项目人员信息--项目ID:{} 开始", x.getThirdProjectId()); - - List thirdProjectPeople = incThirdProjectPeople.get(x.getThirdProjectId()); - if (CollUtil.isEmpty(thirdProjectPeople)) { - log.info("taiZhouProjectPersonJob-inc 同步项目人员信息--项目ID:{} 结束 - 当前项目没有新增的项目用工信息", x.getThirdProjectId()); - return; - } - - List thirdPersonList = taiZhouService.remoteQueryPerson(x, thirdProjectPeople); - - //更新入库 - if (!CollectionUtils.isEmpty(thirdPersonList)) { - log.info("taiZhouProjectPersonJob-inc 同步项目人员信息--项目ID:{},size:{}", x.getThirdProjectId(), thirdPersonList.size()); - - thirdPersonList.forEach(thirdPerson -> { - try { - taiZhouService.handlePerson(thirdPerson, x, TaiZhouService.HandlerPersonType.ADD); - } catch (Exception e) { - log.error("泰州人员:{} 处理异常,对应泰州ID:{}", thirdPerson.getThirdPersonName(), thirdPerson.getThirdUniquePersonId(), e); - } - - }); - } else { - log.info("taiZhouProjectPersonJob-inc 同步项目人员信息--项目ID:{},size:0", x.getThirdProjectId()); - } - }); - log.info("taiZhouProjectPersonIncJob 泰州job同步项目用工信息--结束"); - - log.info("taiZhouProjectPersonIncJob end"); - - return ReturnT.SUCCESS; } } diff --git a/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonJob.java b/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonJob.java index ba77044..53be321 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonJob.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/job/TaiZhouProjectPersonJob.java @@ -1,5 +1,6 @@ package cn.axzo.riven.third.job; +import cn.axzo.riven.third.common.MdcLogConstant; import cn.axzo.riven.third.entity.ThirdPerson; import cn.axzo.riven.third.entity.ThirdProjectPerson; import cn.axzo.riven.third.service.ThirdPersonService; @@ -7,6 +8,7 @@ import cn.axzo.riven.third.service.ThirdProjectPersonService; import cn.axzo.riven.third.service.ThirdProjectService; import cn.axzo.riven.third.taizhou.entity.TaiZhouProject; import cn.axzo.riven.third.taizhou.service.TaiZhouService; +import cn.azxo.framework.common.logger.JobLoggerTemplate; import com.alibaba.fastjson.JSON; import com.google.common.collect.ImmutableList; import com.xxl.job.core.biz.model.ReturnT; @@ -40,71 +42,74 @@ public class TaiZhouProjectPersonJob extends IJobHandler { @Autowired TaiZhouService taiZhouService; + @Autowired + JobLoggerTemplate jobLoggerTemplate; @XxlJob("taiZhouProjectPersonJob") @Override public ReturnT execute(String s) throws Exception { + return jobLoggerTemplate.execute(MdcLogConstant.CTX_LOG_ID_MDC, () -> { + log.info("taiZhouProjectPersonJob start"); - log.info("taiZhouProjectPersonJob start"); + //获取泰州所有的项目信息 + List taiZhouProjectList = taiZhouService.queryThirdProjectForTaiZhou(); - //获取泰州所有的项目信息 - List taiZhouProjectList = taiZhouService.queryThirdProjectForTaiZhou(); + if (CollectionUtils.isEmpty(taiZhouProjectList)) { + log.info("DB中泰州项目为空,同步结束"); + return ReturnT.SUCCESS; + } + log.info("taiZhouProjectPersonJob--项目list:{}", JSON.toJSONString(taiZhouProjectList)); + + + log.info("taiZhouProjectPersonJob 同步项目用工信息--开始"); + taiZhouProjectList.forEach(x -> { + log.info("taiZhouProjectPersonJob 同步项目用工信息--项目ID:{} 远程获取开始", x.getThirdProjectId()); + //基于项目维度进行获取项目下的员工信息 + List thirdProjectPersonList = taiZhouService.remoteQueryProjectPerson(x); + + //更新入库 + if (!CollectionUtils.isEmpty(thirdProjectPersonList)) { + log.info("taiZhouProjectPersonJob 同步项目用工信息--项目ID:{},size:{}", x.getThirdProjectId(), thirdProjectPersonList.size()); + thirdProjectPersonList.forEach(thirdProjectPerson -> { + // 全量更新不插入thirdProjectPerson数据。只做更新操作。新增由增量更新处理 + thirdProjectPersonService.addOrUpdateThirdProjectPerson(thirdProjectPerson, false); + }); + } else { + log.info("taiZhouProjectPersonJob 同步项目用工信息--项目ID:{},size:0", x.getThirdProjectId()); + } + }); + log.info("taiZhouProjectPersonJob 同步项目用工信息--结束"); + + log.info("taiZhouProjectPersonJob 泰州job同步项目人员信息--开始"); + + //根据项目信息获取调用泰州的项目人员接口 + taiZhouProjectList.forEach(x -> { + + log.info("taiZhouProjectPersonJob 同步项目人员信息--项目ID:{} 开始", x.getThirdProjectId()); + + // 全量更新接口,直接返回全量的用户数据,主要处理人员信息变更的情况 + List thirdPersonList = taiZhouService.remoteQueryPerson(x, ImmutableList.of()); + + //更新入库 + if (!CollectionUtils.isEmpty(thirdPersonList)) { + log.info("taiZhouProjectPersonJob 同步项目人员信息--项目ID:{},size:{}", x.getThirdProjectId(), thirdPersonList.size()); + + thirdPersonList.forEach(thirdPerson -> { + try { + taiZhouService.handlePerson(thirdPerson, x, TaiZhouService.HandlerPersonType.UPDATE); + } catch (Exception e) { + log.error("泰州人员:{} 处理异常,对应泰州ID:{}", thirdPerson.getThirdPersonName(), thirdPerson.getThirdUniquePersonId(), e); + } + + }); + } else { + log.info("taiZhouProjectPersonJob 同步项目人员信息--项目ID:{},size:0", x.getThirdProjectId()); + } + }); + log.info("taiZhouProjectPersonJob 泰州job同步项目人员信息--结束"); + + log.info("taiZhouProjectPersonJob end"); - if (CollectionUtils.isEmpty(taiZhouProjectList)) { - log.info("DB中泰州项目为空,同步结束"); return ReturnT.SUCCESS; - } - log.info("taiZhouProjectPersonJob--项目list:{}", JSON.toJSONString(taiZhouProjectList)); - - - log.info("taiZhouProjectPersonJob 同步项目用工信息--开始"); - taiZhouProjectList.forEach(x -> { - log.info("taiZhouProjectPersonJob 同步项目用工信息--项目ID:{} 远程获取开始", x.getThirdProjectId()); - //基于项目维度进行获取项目下的员工信息 - List thirdProjectPersonList = taiZhouService.remoteQueryProjectPerson(x); - - //更新入库 - if (!CollectionUtils.isEmpty(thirdProjectPersonList)) { - log.info("taiZhouProjectPersonJob 同步项目用工信息--项目ID:{},size:{}", x.getThirdProjectId(), thirdProjectPersonList.size()); - thirdProjectPersonList.forEach(thirdProjectPerson -> { - // 全量更新不插入thirdProjectPerson数据。只做更新操作。新增由增量更新处理 - thirdProjectPersonService.addOrUpdateThirdProjectPerson(thirdProjectPerson, false); - }); - } else { - log.info("taiZhouProjectPersonJob 同步项目用工信息--项目ID:{},size:0", x.getThirdProjectId()); - } }); - log.info("taiZhouProjectPersonJob 同步项目用工信息--结束"); - - log.info("taiZhouProjectPersonJob 泰州job同步项目人员信息--开始"); - - //根据项目信息获取调用泰州的项目人员接口 - taiZhouProjectList.forEach(x -> { - - log.info("taiZhouProjectPersonJob 同步项目人员信息--项目ID:{} 开始", x.getThirdProjectId()); - - // 全量更新接口,直接返回全量的用户数据,主要处理人员信息变更的情况 - List thirdPersonList = taiZhouService.remoteQueryPerson(x, ImmutableList.of()); - - //更新入库 - if (!CollectionUtils.isEmpty(thirdPersonList)) { - log.info("taiZhouProjectPersonJob 同步项目人员信息--项目ID:{},size:{}", x.getThirdProjectId(), thirdPersonList.size()); - - thirdPersonList.forEach(thirdPerson -> { - try { - taiZhouService.handlePerson(thirdPerson, x, TaiZhouService.HandlerPersonType.UPDATE); - } catch (Exception e) { - log.error("泰州人员:{} 处理异常,对应泰州ID:{}", thirdPerson.getThirdPersonName(), thirdPerson.getThirdUniquePersonId(), e); - } - - }); - } else { - log.info("taiZhouProjectPersonJob 同步项目人员信息--项目ID:{},size:0", x.getThirdProjectId()); - } - }); - log.info("taiZhouProjectPersonJob 泰州job同步项目人员信息--结束"); - - log.info("taiZhouProjectPersonJob end"); - - return ReturnT.SUCCESS; } } diff --git a/riven-third/src/main/java/cn/axzo/riven/third/service/impl/ThirdProjectPersonServiceImpl.java b/riven-third/src/main/java/cn/axzo/riven/third/service/impl/ThirdProjectPersonServiceImpl.java index 994e821..66929d4 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/service/impl/ThirdProjectPersonServiceImpl.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/service/impl/ThirdProjectPersonServiceImpl.java @@ -55,7 +55,6 @@ public class ThirdProjectPersonServiceImpl implements ThirdProjectPersonService .update(); } - } @Override diff --git a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/rpc/TaiZhouClient.java b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/rpc/TaiZhouClient.java index 60f94d2..5e52a36 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/rpc/TaiZhouClient.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/rpc/TaiZhouClient.java @@ -119,9 +119,10 @@ public class TaiZhouClient { RestTemplateUtils restTemplateUtils = new RestTemplateUtils(taiZhouConfig.getHttpConnectTimeout(), taiZhouConfig.getHttpReadTimeout()); if (StringUtils.hasText(requestBody)) { String body = AesUtil.encryptPkcs5(requestBody, taiZhouConfig.getKey()); - log.info("请求泰州住建局body:{}", body); + log.info("请求泰州住建局,apiFullUrl = {}, paramReq = {}, originBody = {} ,encodedBody = {}", apiFullUrl, JSON.toJSONString(paramReq), requestBody, body); responseEntity = restTemplateUtils.post(apiFullUrl, headers, body, String.class); } else { + log.info("请求泰州住建局,apiFullUrl = {}, paramReq = {}", apiFullUrl, JSON.toJSONString(paramReq)); responseEntity = restTemplateUtils.post(apiFullUrl, headers, String.class); } diff --git a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java index 9fb52e8..f009f0d 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java @@ -724,6 +724,16 @@ public class TaiZhouServiceImpl implements TaiZhouService { } private void updateThirdPerson(ThirdPerson oldThirdPerson, ThirdPerson thirdPerson) { + if (isNotChanged(thirdPerson.getThirdPersonName(), oldThirdPerson.getThirdPersonName()) + && isNotChanged(thirdPerson.getThirdPersonPhone(), oldThirdPerson.getThirdPersonPhone()) + && isNotChanged(thirdPerson.getThirdPersonPhoto(), oldThirdPerson.getThirdPersonPhoto()) + && isNotChanged(thirdPerson.getThirdAuthority(), oldThirdPerson.getThirdAuthority()) + && isNotChanged(thirdPerson.getThirdIdNumber(), oldThirdPerson.getThirdIdNumber()) + && isNotChanged(thirdPerson.getThirdPersonFaceUrl(), oldThirdPerson.getThirdPersonFaceUrl()) + && isNotChanged(thirdPerson.getThirdSex(), oldThirdPerson.getThirdSex())) { + log.info("泰州人员:{} thirdPerson 泰州侧关键信息未变更,不更新ThirdPerson表泰州侧信息", thirdPerson.getThirdPersonName()); + return; + } boolean updated = thirdPersonDao.lambdaUpdate() .eq(ThirdPerson::getThirdCode, thirdPerson.getThirdCode()) .eq(ThirdPerson::getThirdUniquePersonId, thirdPerson.getThirdUniquePersonId()) @@ -735,15 +745,23 @@ public class TaiZhouServiceImpl implements TaiZhouService { .set(!Objects.isNull(thirdPerson.getThirdPersonFaceUrl()), ThirdPerson::getThirdPersonFaceUrl, thirdPerson.getThirdPersonFaceUrl()) .set(!Objects.isNull(thirdPerson.getThirdSex()), ThirdPerson::getThirdSex, thirdPerson.getThirdSex()) .update(); + // compare and log if (updated) { ThirdPerson toUpdate = BeanUtil.toBean(thirdPerson, ThirdPerson.class); toUpdate.setId(oldThirdPerson.getId()); operateLogService.save(buildOperateParam(oldThirdPerson.getPersonId(), oldThirdPerson.getPersonId(), OperateLogService.OperateType.UPDATE, toUpdate, - "泰州用户:信息变更", new JSONObject().fluentPut("oldValue", oldThirdPerson).fluentPut("newValue", toUpdate))); + String.format("泰州用户 %s:信息变更", thirdPerson.getThirdPersonName()), + new JSONObject().fluentPut("oldValue", oldThirdPerson).fluentPut("newValue", toUpdate))); } } + private boolean isNotChanged(Object oldValue, Object newValue) { + if (newValue == null) { + return true; + } + return Objects.equals(oldValue, newValue); + } private void convertPhone(ThirdPerson thirdPerson, TaiZhouProject taiZhouProject) { From d09fcc4b50ca31e963df4cd6c9ab8b4d4851a28d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=95=8F?= Date: Wed, 23 Oct 2024 16:26:28 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat(REQ-2960):=20=E6=B3=B0=E5=B7=9E?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E5=90=8C=E6=AD=A5=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=8B=89=E5=8F=96=E5=88=B0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=9A=84=E5=91=8A=E8=AD=A6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../third/taizhou/service/impl/TaiZhouServiceImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java index f009f0d..c56630a 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/taizhou/service/impl/TaiZhouServiceImpl.java @@ -177,6 +177,9 @@ public class TaiZhouServiceImpl implements TaiZhouService { if (CollectionUtils.isEmpty(resList)) { + // 暂不收敛告警,遇到后做告警抑制处理。 + log.error("三方项目用工信息获取失败,taiZhouProjectId = {}, dataNumber = {},resList.size = 0,如连续多次出现,可能是项目数据指纹发生变更,请和群耀进行确认。" + , taiZhouProject.getThirdProjectId(), ext.getDataNumber()); return projectPersonList; } //转化对象 @@ -260,6 +263,9 @@ public class TaiZhouServiceImpl implements TaiZhouService { List resList = rpc.gBWorker(req); if (CollectionUtils.isEmpty(resList)) { log.info("获取泰州人员信息(gBWorker) - projectTotalPersonCount = {}, returnCount = {}, needReturnCount = {}", 0, 0, CollUtil.size(needReturnPeople)); + // 暂不收敛告警,遇到后做告警抑制处理。 + log.error("三方工人基本信息获取失败,taiZhouProjectId = {}, dataNumber = {},resList.size = 0,如连续多次出现,可能是项目数据指纹发生变更,请和群耀进行确认。" + , taiZhouProject.getThirdProjectId(), ext.getDataNumber()); return personList; }