Compare commits
No commits in common. "dev_workchange" and "master" have entirely different histories.
dev_workchange
...
master
|
|
@ -1,296 +0,0 @@
|
|||
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);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue