From 2a087cc9e3863f68d1b99a64e4f1715af345287f Mon Sep 17 00:00:00 2001 From: zhaokai Date: Mon, 22 Jun 2026 09:48:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(facade):=20=E6=B7=BB=E5=8A=A0=E5=85=AB?= =?UTF-8?q?=E5=A4=A7=E4=BD=9C=E4=B8=9A=E9=97=A8=E9=9D=A2=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现用户待处理八大作业查询功能 - 实现八大作业工作交接功能 --- .../facade/ZcloudEightWorkFacadeImpl.java | 296 ++++++++++++++++++ 1 file changed, 296 insertions(+) create mode 100644 web-adapter/src/main/java/com/zcloud/eightwork/facade/ZcloudEightWorkFacadeImpl.java diff --git a/web-adapter/src/main/java/com/zcloud/eightwork/facade/ZcloudEightWorkFacadeImpl.java b/web-adapter/src/main/java/com/zcloud/eightwork/facade/ZcloudEightWorkFacadeImpl.java new file mode 100644 index 0000000..c3c6784 --- /dev/null +++ b/web-adapter/src/main/java/com/zcloud/eightwork/facade/ZcloudEightWorkFacadeImpl.java @@ -0,0 +1,296 @@ +package com.zcloud.eightwork.facade; + +import com.alibaba.cola.dto.MultiResponse; +import com.alibaba.cola.dto.SingleResponse; +import com.alibaba.cola.exception.BizException; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zcloud.eightwork.domain.model.enums.TaskLogStatus; +import com.zcloud.eightwork.domain.model.enums.WorkCodeEnum; +import com.zcloud.eightwork.persistence.dataobject.EightworkInfoDO; +import com.zcloud.eightwork.persistence.dataobject.TaskLogDO; +import com.zcloud.eightwork.persistence.repository.EightworkInfoRepository; +import com.zcloud.eightwork.persistence.repository.TaskLogRepository; +import com.zcloud.gbscommon.todolistmq.TodoListEventPusherUtil; +import com.zcloud.gbscommon.todolistmq.event.TodoListAddEvent; +import com.zcloud.gbscommon.todolistmq.event.TodoListDeleteByForeignEvent; +import com.zcloud.gbscommon.zcloudeightwork.facade.ZcloudEightWorkFacade; +import com.zcloud.gbscommon.zcloudeightwork.request.EightWorkChangeCmd; +import com.zcloud.gbscommon.zcloudeightwork.request.EightWorkQry; +import com.zcloud.gbscommon.zcloudeightwork.response.EightWorkListByUserCO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +@DubboService +@Slf4j +public class ZcloudEightWorkFacadeImpl implements ZcloudEightWorkFacade { + + private static final Integer PC_FLAG = 0; + private static final Integer APP_FLAG = 1; + @Resource + private TaskLogRepository taskLogRepository; + @Resource + private EightworkInfoRepository eightworkInfoRepository; + @Resource + private TodoListEventPusherUtil todoListEventPusherUtil; + + @Override + public MultiResponse eightWorkByUserId(EightWorkQry eightWorkQry) { + if (eightWorkQry == null || eightWorkQry.getUserId() == null) { + throw new BizException("用户id不能为空"); + } + + log.info("开始查询用户待处理八大作业,userId={}, corpinfoId={}", + eightWorkQry.getUserId(), eightWorkQry.getCorpinfoId()); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(TaskLogDO::getActUser, eightWorkQry.getUserId()) + .in(TaskLogDO::getStatus, TaskLogStatus.NOT_STARTED.getCode(), TaskLogStatus.IN_PROGRESS.getCode()) + .orderByDesc(TaskLogDO::getCreateTime); + + List taskLogDOList = taskLogRepository.list(queryWrapper); + if (taskLogDOList == null || taskLogDOList.isEmpty()) { + log.info("未查询到用户待处理八大作业,userId={}", eightWorkQry.getUserId()); + return MultiResponse.of(Collections.emptyList()); + } + + // 同一作业可能存在多个未开始步骤,这里按 workId 去重后返回作业维度的数据。 + Map workTaskLogMap = new LinkedHashMap<>(); + for (TaskLogDO taskLogDO : taskLogDOList) { + workTaskLogMap.putIfAbsent(taskLogDO.getWorkId(), taskLogDO); + } + + List workIdList = new ArrayList<>(workTaskLogMap.keySet()); + Map workInfoMap = eightworkInfoRepository.listAllByWorkIds(workIdList).stream() + .collect(Collectors.toMap(EightworkInfoDO::getWorkId, item -> item, (left, right) -> left)); + + List result = new ArrayList<>(); + for (Map.Entry entry : workTaskLogMap.entrySet()) { + TaskLogDO taskLogDO = entry.getValue(); + EightworkInfoDO infoDO = workInfoMap.get(entry.getKey()); + + EightWorkListByUserCO co = new EightWorkListByUserCO(); + co.setWorkId(taskLogDO.getWorkId()); + co.setWorkProject(resolveWorkProject(taskLogDO)); + co.setWorkContent(resolveWorkContent(infoDO, taskLogDO)); + result.add(co); + } + + log.info("查询用户待处理八大作业完成,userId={}, count={}", eightWorkQry.getUserId(), result.size()); + return MultiResponse.of(result); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public SingleResponse updateEightWorkChange(EightWorkChangeCmd eightWorkChangeCmd) { + validateWorkChangeCmd(eightWorkChangeCmd); + + log.info("开始处理八大作业工作交接,workId={}, oldUserId={}, newUserId={}, deptId={}, corpId={}", + eightWorkChangeCmd.getWorkId(), + eightWorkChangeCmd.getOldUserId(), + eightWorkChangeCmd.getUserId(), + eightWorkChangeCmd.getDeptId(), + eightWorkChangeCmd.getCorpId()); + + EightworkInfoDO infoDO = eightworkInfoRepository.getOne(new LambdaQueryWrapper() + .eq(EightworkInfoDO::getWorkId, eightWorkChangeCmd.getWorkId())); + if (infoDO == null) { + throw new BizException("作业不存在"); + } + + List handoverLogs = taskLogRepository.list(new LambdaQueryWrapper() + .eq(TaskLogDO::getWorkId, eightWorkChangeCmd.getWorkId()) + .eq(TaskLogDO::getActUser, eightWorkChangeCmd.getOldUserId()) + .in(TaskLogDO::getStatus, TaskLogStatus.NOT_STARTED.getCode(), TaskLogStatus.IN_PROGRESS.getCode()) + .orderByAsc(TaskLogDO::getStepOrder) + .orderByAsc(TaskLogDO::getCreateTime)); + + if (handoverLogs == null || handoverLogs.isEmpty()) { + log.warn("未找到需要交接的八大作业步骤,workId={}, oldUserId={}", + eightWorkChangeCmd.getWorkId(), eightWorkChangeCmd.getOldUserId()); + return SingleResponse.buildSuccess(); + } + + for (TaskLogDO taskLogDO : handoverLogs) { + taskLogDO.setActUser(eightWorkChangeCmd.getUserId()); + taskLogDO.setActUserName(eightWorkChangeCmd.getUserName()); + taskLogDO.setActUserDepartment(eightWorkChangeCmd.getDeptId()); + taskLogDO.setActUserDepartmentName(eightWorkChangeCmd.getDeptName()); + if (eightWorkChangeCmd.getCorpId() != null) { + taskLogDO.setCorpinfoId(eightWorkChangeCmd.getCorpId()); + } + log.info("更新 task_log 处理人成功,taskLogId={}, stepId={}, stepName={}, status={}, newUserId={}", + taskLogDO.getId(), taskLogDO.getStepId(), taskLogDO.getStepName(), taskLogDO.getStatus(), + eightWorkChangeCmd.getUserId()); + taskLogRepository.updateById(taskLogDO); + } + + syncEightworkInfoAssignee(infoDO, handoverLogs, eightWorkChangeCmd); + refreshTodoEvent(infoDO, eightWorkChangeCmd.getWorkId()); + + log.info("八大作业工作交接完成,workId={}, changedCount={}, newUserId={}", + eightWorkChangeCmd.getWorkId(), handoverLogs.size(), eightWorkChangeCmd.getUserId()); + return SingleResponse.buildSuccess(); + } + + private void validateWorkChangeCmd(EightWorkChangeCmd cmd) { + if (cmd == null || StringUtils.isBlank(cmd.getWorkId())) { + throw new BizException("作业id不能为空"); + } + if (cmd.getOldUserId() == null) { + throw new BizException("原处理人不能为空"); + } + if (cmd.getUserId() == null || StringUtils.isBlank(cmd.getUserName())) { + throw new BizException("新处理人不能为空"); + } + if (cmd.getDeptId() == null || StringUtils.isBlank(cmd.getDeptName())) { + throw new BizException("新处理部门不能为空"); + } + } + + private String resolveWorkProject(TaskLogDO taskLogDO) { + String workProject = WorkCodeEnum.getNameByWorkType(taskLogDO.getWorkType()); + if (StringUtils.isBlank(workProject)) { + return "危险作业"; + } + return workProject; + } + + private String resolveWorkContent(EightworkInfoDO infoDO, TaskLogDO taskLogDO) { + JSONObject infoJson = parseInfoJson(infoDO); + String workContent = infoJson.getString("workContent"); + if (StringUtils.isNotBlank(workContent)) { + return workContent; + } + if (infoDO != null && StringUtils.isNotBlank(infoDO.getCheckNo())) { + return infoDO.getCheckNo(); + } + return taskLogDO.getStepName(); + } + + private void syncEightworkInfoAssignee(EightworkInfoDO infoDO, List handoverLogs, EightWorkChangeCmd cmd) { + JSONObject infoJson = parseInfoJson(infoDO); + Set stepIdSet = handoverLogs.stream().map(TaskLogDO::getStepId).collect(Collectors.toSet()); + + // 主表 info 会缓存每个步骤的处理人信息,交接后需要同步替换,避免详情页显示旧处理人。 + for (String key : infoJson.keySet()) { + if (!key.startsWith("step_")) { + continue; + } + Long stepId = parseStepId(key); + if (stepId == null || !stepIdSet.contains(stepId)) { + continue; + } + + Object value = infoJson.get(key); + if (!(value instanceof JSONObject)) { + continue; + } + + JSONObject stepInfo = (JSONObject) value; + Integer status = stepInfo.getInteger("status"); + Long actUser = stepInfo.getLong("actUser"); + if (!cmd.getOldUserId().equals(actUser)) { + continue; + } + if (!TaskLogStatus.NOT_STARTED.equalsCode(status) && !TaskLogStatus.IN_PROGRESS.equalsCode(status)) { + continue; + } + + stepInfo.put("actUser", cmd.getUserId()); + stepInfo.put("actUserName", cmd.getUserName()); + stepInfo.put("actUserDepartment", cmd.getDeptId()); + stepInfo.put("actUserDepartmentName", cmd.getDeptName()); + log.info("同步主表步骤处理人成功,workId={}, stepKey={}, newUserId={}", + infoDO.getWorkId(), key, cmd.getUserId()); + } + + infoDO.setInfo(infoJson.toJSONString()); + eightworkInfoRepository.updateById(infoDO); + } + + private void refreshTodoEvent(EightworkInfoDO infoDO, String workId) { + if (infoDO == null || infoDO.getId() == null) { + return; + } + + try { + TodoListDeleteByForeignEvent deleteEvent = new TodoListDeleteByForeignEvent(); + deleteEvent.setForeignKey(infoDO.getId()); + todoListEventPusherUtil.sendMessageDeleteByForeignBatchEvent(deleteEvent); + log.info("删除旧待办成功,workId={}, foreignKey={}", workId, infoDO.getId()); + } catch (Exception e) { + log.error("删除旧待办失败,workId={}", workId, e); + } + + List currentLogs = taskLogRepository.list(new LambdaQueryWrapper() + .eq(TaskLogDO::getWorkId, workId) + .eq(TaskLogDO::getStatus, TaskLogStatus.IN_PROGRESS.getCode()) + .orderByAsc(TaskLogDO::getStepOrder) + .orderByAsc(TaskLogDO::getCreateTime)); + + for (TaskLogDO taskLogDO : currentLogs) { + if (taskLogDO.getActUser() == null) { + log.info("当前进行中步骤未指定处理人,跳过重发待办,taskLogId={}, stepId={}", + taskLogDO.getId(), taskLogDO.getStepId()); + continue; + } + try { + TodoListAddEvent addEvent = new TodoListAddEvent(); + addEvent.setTitle("您有一条【" + resolveWorkProject(taskLogDO) + "】流程待处理"); + addEvent.setContent(taskLogDO.getStepName()); + addEvent.setForeignKey(infoDO.getId()); + addEvent.setForeignSubsidiaryKey(taskLogDO.getId()); + addEvent.setReceiveUser(taskLogDO.getActUser()); + addEvent.setPcFlag(PC_FLAG); + addEvent.setAppFlag(APP_FLAG); + addEvent.setOtherParams(new JSONObject()); + todoListEventPusherUtil.sendMessageAddEvent(addEvent); + log.info("重发待办成功,workId={}, taskLogId={}, receiveUser={}", + workId, taskLogDO.getId(), taskLogDO.getActUser()); + } catch (Exception e) { + log.error("重发待办失败,workId={}, taskLogId={}", workId, taskLogDO.getId(), e); + } + } + } + + private JSONObject parseInfoJson(EightworkInfoDO infoDO) { + if (infoDO == null || StringUtils.isBlank(infoDO.getInfo())) { + return new JSONObject(); + } + try { + return JSONObject.parseObject(infoDO.getInfo()); + } catch (Exception e) { + log.warn("解析主表 info 失败,workId={}", infoDO.getWorkId(), e); + return new JSONObject(); + } + } + + private Long parseStepId(String stepKey) { + if (StringUtils.isBlank(stepKey) || !stepKey.startsWith("step_")) { + return null; + } + String stepIdText = stepKey.substring("step_".length()); + int splitIndex = stepIdText.indexOf('_'); + if (splitIndex >= 0) { + stepIdText = stepIdText.substring(0, splitIndex); + } + if (!StringUtils.isNumeric(stepIdText)) { + return null; + } + return Long.valueOf(stepIdText); + } +}