feat(facade): 添加八大作业门面服务实现

- 实现用户待处理八大作业查询功能
- 实现八大作业工作交接功能
dev_workchange
zhaokai 2026-06-22 09:48:50 +08:00
parent 8d497c65f0
commit 2a087cc9e3
1 changed files with 296 additions and 0 deletions

View File

@ -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<EightWorkListByUserCO> eightWorkByUserId(EightWorkQry eightWorkQry) {
if (eightWorkQry == null || eightWorkQry.getUserId() == null) {
throw new BizException("用户id不能为空");
}
log.info("开始查询用户待处理八大作业userId={}, corpinfoId={}",
eightWorkQry.getUserId(), eightWorkQry.getCorpinfoId());
LambdaQueryWrapper<TaskLogDO> queryWrapper = new LambdaQueryWrapper<TaskLogDO>()
.eq(TaskLogDO::getActUser, eightWorkQry.getUserId())
.in(TaskLogDO::getStatus, TaskLogStatus.NOT_STARTED.getCode(), TaskLogStatus.IN_PROGRESS.getCode())
.orderByDesc(TaskLogDO::getCreateTime);
List<TaskLogDO> taskLogDOList = taskLogRepository.list(queryWrapper);
if (taskLogDOList == null || taskLogDOList.isEmpty()) {
log.info("未查询到用户待处理八大作业userId={}", eightWorkQry.getUserId());
return MultiResponse.of(Collections.emptyList());
}
// 同一作业可能存在多个未开始步骤,这里按 workId 去重后返回作业维度的数据。
Map<String, TaskLogDO> workTaskLogMap = new LinkedHashMap<>();
for (TaskLogDO taskLogDO : taskLogDOList) {
workTaskLogMap.putIfAbsent(taskLogDO.getWorkId(), taskLogDO);
}
List<String> workIdList = new ArrayList<>(workTaskLogMap.keySet());
Map<String, EightworkInfoDO> workInfoMap = eightworkInfoRepository.listAllByWorkIds(workIdList).stream()
.collect(Collectors.toMap(EightworkInfoDO::getWorkId, item -> item, (left, right) -> left));
List<EightWorkListByUserCO> result = new ArrayList<>();
for (Map.Entry<String, TaskLogDO> 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<EightworkInfoDO>()
.eq(EightworkInfoDO::getWorkId, eightWorkChangeCmd.getWorkId()));
if (infoDO == null) {
throw new BizException("作业不存在");
}
List<TaskLogDO> handoverLogs = taskLogRepository.list(new LambdaQueryWrapper<TaskLogDO>()
.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<TaskLogDO> handoverLogs, EightWorkChangeCmd cmd) {
JSONObject infoJson = parseInfoJson(infoDO);
Set<Long> 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<TaskLogDO> currentLogs = taskLogRepository.list(new LambdaQueryWrapper<TaskLogDO>()
.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);
}
}