fix:实时查军令状时间&所有人员任务完成情况统计
This commit is contained in:
@@ -193,6 +193,16 @@ public class SimulationNodeController implements ISimulationNodeFeignClient {
|
||||
return nodeService.getUserGroupTaskCompleteStatistics(req);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 所有项目的人员任务完成情况统计
|
||||
*/
|
||||
@PostMapping("/getAllUserTaskCompleteStatistics")
|
||||
@Operation(summary = "所有项目的人员任务完成情况统计", description = "所有项目的人员任务完成情况统计")
|
||||
public SdmResponse getAllUserTaskCompleteStatistics(@RequestBody @Validated GetAllUserTaskCompleteStatisticsReq req) {
|
||||
return nodeService.getAllUserTaskCompleteStatistics(req);
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户组难度系数统计
|
||||
*
|
||||
|
||||
@@ -78,6 +78,8 @@ public interface SimulationNodeMapper extends BaseMapper<SimulationNode> {
|
||||
|
||||
List<UserGroupTaskCompleteVo> getUserGroupTaskCompleteStatistics(@Param("req") GetUserGroupTaskCompleteStatisticsReq req);
|
||||
|
||||
List<UserGroupTaskCompleteVo> getAllUserTaskCompleteStatistics(@Param("req") GetAllUserTaskCompleteStatisticsReq req);
|
||||
|
||||
List<UserGroupDifficultyVo> getUserGroupDifficultyStatistics(@Param("req") GetUserGroupTaskCompleteStatisticsReq req);
|
||||
|
||||
List<CommonGetCompleteFromTaskVo> getCommonCompleteStatisticsFromTask(@Param("req") CommonGetCompleteStatisticsReq req);
|
||||
|
||||
@@ -170,6 +170,15 @@ public class ProjectNodePo extends NodeAllBase {
|
||||
* 军令状时间
|
||||
*/
|
||||
private String commitmentDeadline;
|
||||
/**
|
||||
* 项目来源
|
||||
*/
|
||||
private String projectSource;
|
||||
/**
|
||||
* 同步EP项目id
|
||||
*/
|
||||
private String projectId;
|
||||
|
||||
|
||||
private long finishTaskNum = 0;
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.sdm.project.model.req;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 所有项目的人员任务完成情况统计
|
||||
*/
|
||||
@Data
|
||||
@Schema(description = "所有项目的人员任务完成情况统计")
|
||||
public class GetAllUserTaskCompleteStatisticsReq {
|
||||
|
||||
@Schema(description = "用户列表")
|
||||
private List<Long> userIds;
|
||||
|
||||
@Schema(description = "标签1")
|
||||
private List<String> tag1List;
|
||||
|
||||
@Schema(description = "标签2")
|
||||
private List<String> tag2List;
|
||||
|
||||
}
|
||||
@@ -13,4 +13,6 @@ public class ProjectTreeTagReq {
|
||||
|
||||
private List<TaskNodeTag> tagMap;
|
||||
|
||||
private String projectNodeId;
|
||||
|
||||
}
|
||||
|
||||
@@ -46,6 +46,8 @@ public interface INodeService extends IService<SimulationNode> {
|
||||
|
||||
SdmResponse getUserGroupTaskCompleteStatistics(GetUserGroupTaskCompleteStatisticsReq req);
|
||||
|
||||
SdmResponse getAllUserTaskCompleteStatistics(GetAllUserTaskCompleteStatisticsReq req);
|
||||
|
||||
//用户组难度系数统计
|
||||
SdmResponse getUserGroupDifficultyStatistics(GetUserGroupTaskCompleteStatisticsReq req);
|
||||
|
||||
|
||||
@@ -16,10 +16,13 @@ import com.sdm.common.entity.enums.NodeTypeEnum;
|
||||
import com.sdm.common.entity.req.data.*;
|
||||
import com.sdm.common.entity.req.project.*;
|
||||
import com.sdm.common.entity.req.system.QueryGroupDetailReq;
|
||||
import com.sdm.common.entity.req.system.UserListReq;
|
||||
import com.sdm.common.entity.req.system.UserQueryReq;
|
||||
import com.sdm.common.entity.resp.AllNodeByProjectIdAndTypeResp;
|
||||
import com.sdm.common.entity.resp.PageDataResp;
|
||||
import com.sdm.common.entity.resp.project.SimulationNodeResp;
|
||||
import com.sdm.common.entity.resp.project.SimulationRunResp;
|
||||
import com.sdm.common.entity.resp.system.CIDStaffResp;
|
||||
import com.sdm.common.entity.resp.system.CIDUserResp;
|
||||
import com.sdm.common.entity.resp.system.SysUserGroupDetailResp;
|
||||
import com.sdm.common.feign.impl.data.DataClientFeignClientImpl;
|
||||
@@ -1271,6 +1274,63 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
|
||||
|
||||
// 转换为列表返回
|
||||
List<UserGroupTaskCompleteStatisticsVo> result = new ArrayList<>(userStatisticsMap.values());
|
||||
result = result.stream().sorted(Comparator.comparing(UserGroupTaskCompleteStatisticsVo::getTotalTasks).reversed()).collect(Collectors.toList());
|
||||
JSONObject resultResponse = new JSONObject();
|
||||
resultResponse.put("allExeStatus", allExeStatus);
|
||||
resultResponse.put("result", result);
|
||||
return SdmResponse.success(resultResponse);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SdmResponse getAllUserTaskCompleteStatistics(GetAllUserTaskCompleteStatisticsReq req) {
|
||||
Map<Long, String> userId2Nickname = new HashMap<>();
|
||||
if (CollectionUtils.isEmpty(req.getUserIds())) {
|
||||
UserListReq userListReq = new UserListReq();
|
||||
userListReq.setTenantId(ThreadLocalContext.getTenantId());
|
||||
userListReq.setCurrent(1);
|
||||
userListReq.setSize(9999);
|
||||
SdmResponse<PageDataResp<List<CIDUserResp>>> pageDataRespSdmResponse = sysUserFeignClient.listUser(userListReq);
|
||||
if (!pageDataRespSdmResponse.isSuccess()) {
|
||||
return SdmResponse.success();
|
||||
}
|
||||
List<Long> userIds = pageDataRespSdmResponse.getData().getData().stream().map(CIDUserResp::getUserId).toList();
|
||||
req.setUserIds(userIds);
|
||||
userId2Nickname = pageDataRespSdmResponse.getData().getData().stream().collect(Collectors.toMap(CIDUserResp::getUserId, CIDUserResp::getNickname));
|
||||
}
|
||||
|
||||
List<UserGroupTaskCompleteVo> userGroupTaskCompleteStatistics = this.baseMapper.getAllUserTaskCompleteStatistics(req);
|
||||
|
||||
// 按用户分组统计任务状态
|
||||
Map<Long, UserGroupTaskCompleteStatisticsVo> userStatisticsMap = new HashMap<>();
|
||||
|
||||
// 所有任务执行状态
|
||||
Set<String> allExeStatus = new HashSet<>();
|
||||
// 统计每个用户的各种状态任务数量
|
||||
for (UserGroupTaskCompleteVo item : userGroupTaskCompleteStatistics) {
|
||||
Long userId = item.getUserId();
|
||||
String exeStatus = item.getExeStatus();
|
||||
|
||||
allExeStatus.add(exeStatus);
|
||||
|
||||
UserGroupTaskCompleteStatisticsVo userStat = userStatisticsMap.getOrDefault(userId, new UserGroupTaskCompleteStatisticsVo());
|
||||
userStat.setUserId(userId);
|
||||
userStat.setUserName(userId2Nickname.getOrDefault(userId, "Unknown User"));
|
||||
|
||||
Map<String, Integer> statusCount = userStat.getStatusCount();
|
||||
if (statusCount == null) {
|
||||
statusCount = new HashMap<>();
|
||||
userStat.setStatusCount(statusCount);
|
||||
}
|
||||
|
||||
statusCount.put(exeStatus, statusCount.getOrDefault(exeStatus, 0) + 1);
|
||||
userStat.setTotalTasks(userStat.getTotalTasks() == null ? 1 : userStat.getTotalTasks() + 1);
|
||||
|
||||
userStatisticsMap.put(userId, userStat);
|
||||
}
|
||||
|
||||
// 转换为列表返回
|
||||
List<UserGroupTaskCompleteStatisticsVo> result = new ArrayList<>(userStatisticsMap.values());
|
||||
result = result.stream().sorted(Comparator.comparing(UserGroupTaskCompleteStatisticsVo::getTotalTasks).reversed()).collect(Collectors.toList());
|
||||
JSONObject resultResponse = new JSONObject();
|
||||
resultResponse.put("allExeStatus", allExeStatus);
|
||||
resultResponse.put("result", result);
|
||||
|
||||
@@ -23,6 +23,8 @@ import com.sdm.common.service.BaseService;
|
||||
import com.sdm.common.utils.RandomUtil;
|
||||
import com.sdm.common.utils.SystemOperate;
|
||||
import com.sdm.common.utils.excel.ExcelUtil;
|
||||
import com.sdm.outbridge.entity.LyricVProjectStationPlanToDM;
|
||||
import com.sdm.outbridge.service.lyric.LyricVProjectStationPlanToDmService;
|
||||
import com.sdm.project.bo.ExportOperate;
|
||||
import com.sdm.project.common.MemberTypeEnum;
|
||||
import com.sdm.project.common.TaskExeStatusEnum;
|
||||
@@ -31,7 +33,9 @@ import com.sdm.project.dao.SimulationNodeMapper;
|
||||
import com.sdm.project.dao.SimulationProjectMapper;
|
||||
import com.sdm.project.dao.SimulationTaskMapper;
|
||||
import com.sdm.project.model.bo.*;
|
||||
import com.sdm.project.model.entity.SimulationNode;
|
||||
import com.sdm.project.model.entity.SimulationPerformanceExtra;
|
||||
import com.sdm.project.model.entity.SimulationTask;
|
||||
import com.sdm.project.model.entity.SimulationTaskMember;
|
||||
import com.sdm.project.model.po.*;
|
||||
import com.sdm.project.model.req.*;
|
||||
@@ -46,6 +50,7 @@ import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.cache.CacheManager;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -53,6 +58,9 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
||||
|
||||
import java.io.File;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -90,6 +98,12 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
|
||||
@Autowired
|
||||
private ExportOperate exportOperate;
|
||||
|
||||
@Autowired
|
||||
private LyricVProjectStationPlanToDmService lyricVProjectStationPlanToDmService;
|
||||
|
||||
@Value("${commitmentDeadlineStatusTask.schedule.calculationInterval:5}")
|
||||
private int calculationInterval;
|
||||
|
||||
private String currentTopNodeType = "";
|
||||
|
||||
List<TaskNodeTag> tagMap;
|
||||
@@ -325,10 +339,54 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
|
||||
return SdmResponse.success(new ArrayList<>());
|
||||
}
|
||||
log.info("查询到的节点为:{}", taskTreeNodeList.stream().map(ProjectNodePo::getId).toList());
|
||||
// 筛选工位节点 来自EP项目同步的工位需要实时查询军令状时间
|
||||
Map<String, String> nodeMap = new HashMap<>();
|
||||
if (CollectionUtils.isNotEmpty(taskTreeNodeList)) {
|
||||
ProjectNodePo topNode = mapper.queryNodeListByNodeId(req.getProjectNodeId()).get(0);
|
||||
List<ProjectNodePo> workspaceNodeList = taskTreeNodeList.stream().filter(node -> NodeTypeEnum.WORKSPACE.getValue().equals(node.getNodeType()) && "EP".equals(node.getProjectSource())).collect(Collectors.toList());
|
||||
if (CollectionUtils.isNotEmpty(workspaceNodeList)) {
|
||||
List<LyricVProjectStationPlanToDM> eachStationPlanList;
|
||||
List<String> workspaceCodeList = workspaceNodeList.stream().map(ProjectNodePo::getNodeCode).distinct().toList();
|
||||
List<LyricVProjectStationPlanToDM> stationPlanList = lyricVProjectStationPlanToDmService.lambdaQuery().in(LyricVProjectStationPlanToDM::getStationNum, workspaceCodeList)
|
||||
.eq(LyricVProjectStationPlanToDM::getProjectId, topNode.getProjectId())
|
||||
.eq(LyricVProjectStationPlanToDM::getSubject, "设计发图")
|
||||
.list();
|
||||
log.info("stationPlanList为:{}",stationPlanList);
|
||||
if (CollectionUtils.isNotEmpty(stationPlanList)) {
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
Map<String, List<LyricVProjectStationPlanToDM>> stationPlanMap = stationPlanList.stream().collect(Collectors.groupingBy(LyricVProjectStationPlanToDM::getStationNum));
|
||||
for (ProjectNodePo workspaceNode : workspaceNodeList) {
|
||||
eachStationPlanList = stationPlanMap.get(workspaceNode.getNodeCode());
|
||||
if (CollectionUtils.isEmpty(eachStationPlanList)) {
|
||||
continue;
|
||||
}
|
||||
eachStationPlanList.stream().filter(stationPlan -> ObjectUtils.isNotEmpty(stationPlan.getTargetFinishTime()))
|
||||
.max(Comparator.comparing(LyricVProjectStationPlanToDM::getTargetFinishTime))
|
||||
.ifPresent(lyricVProjectStationPlanToDM -> workspaceNode.setCommitmentDeadline(lyricVProjectStationPlanToDM.getTargetFinishTime().format(formatter)));
|
||||
}
|
||||
}
|
||||
}
|
||||
nodeMap = workspaceNodeList.stream().filter(node -> StringUtils.isNotBlank(node.getCommitmentDeadline()))
|
||||
.collect(Collectors.toMap(ProjectNodePo::getUuid,ProjectNodePo::getCommitmentDeadline));
|
||||
}
|
||||
|
||||
taskTreeTaskList = mapper.getTaskListByTag(taskTreeReq);
|
||||
if (CollectionUtils.isNotEmpty(taskTreeTaskList)) {
|
||||
log.info("查询到的任务为:{}", taskTreeTaskList.stream().map(TaskNodePo::getId).toList());
|
||||
taskTreeTaskList.forEach(task -> task.setNodeType("task"));
|
||||
// 对比军令状时间设置任务执行状态
|
||||
for (TaskNodePo taskNodePo : taskTreeTaskList) {
|
||||
// 取工位的军令状时间
|
||||
String workspaceNodeId = taskNodePo.getTag5();
|
||||
if (StringUtils.isBlank(workspaceNodeId)) {
|
||||
continue;
|
||||
}
|
||||
taskNodePo.setCommitmentDeadline(nodeMap.get(workspaceNodeId));
|
||||
if (ObjectUtils.isNotEmpty(taskNodePo.getCommitmentDeadline())) {
|
||||
updateTaskStatus(taskNodePo, calculationInterval);
|
||||
}
|
||||
}
|
||||
|
||||
taskTreePerformanceList = mapper.getPerformanceListByNodeIdList(taskTreeTaskList.stream().map(TaskNodePo::getUuid).toList());
|
||||
if (CollectionUtils.isNotEmpty(taskTreePerformanceList)) {
|
||||
log.info("查询到的指标为:{}", taskTreePerformanceList.stream().map(PerformanceNodePo::getId).toList());
|
||||
@@ -372,6 +430,25 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
|
||||
return SdmResponse.success(realTopProjectNodeList.stream().flatMap(item -> item.getChildren().stream().filter(Objects::nonNull)).toList());
|
||||
}
|
||||
|
||||
private void updateTaskStatus(TaskNodePo task, int calculationInterval) {
|
||||
// 1. 判空
|
||||
if (task.getCommitmentDeadline().trim().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
// 2. 字符串转日期对象
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
LocalDateTime deadlineTime = LocalDateTime.parse(task.getCommitmentDeadline().trim(), formatter);
|
||||
LocalDateTime currentTime = LocalDateTime.now();
|
||||
// 3. 先计算两个时间的毫秒差值
|
||||
long diffMillis = ChronoUnit.MILLIS.between(currentTime, deadlineTime);
|
||||
// 1天 = 24*60*60*1000 毫秒 = 86400000L 毫秒,换算成带小数的天数
|
||||
double daysBetween = diffMillis / 86400000.0D;
|
||||
// 4. 业务判断:精准天数 > 配置间隔天数 → 更新状态为:已延期
|
||||
if (daysBetween < calculationInterval) {
|
||||
task.setExeStatus(TaskExeStatusEnum.POSTPONED.getCode());
|
||||
}
|
||||
}
|
||||
|
||||
private void summaryWorkspaceNode(ProjectNodePo projectNodePo,List<NodeAllBase> children) {
|
||||
if (!NodeTypeEnum.WORKSPACE.getValue().equals(projectNodePo.getNodeType())) {
|
||||
List<NodeAllBase> fChildren = projectNodePo.getChildren();
|
||||
|
||||
@@ -394,6 +394,60 @@
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<select id="getAllUserTaskCompleteStatistics"
|
||||
parameterType="com.sdm.project.model.req.GetAllUserTaskCompleteStatisticsReq"
|
||||
resultType="com.sdm.project.model.vo.UserGroupTaskCompleteVo">
|
||||
select task.exe_status as exeStatus,
|
||||
task_member.user_id as userId
|
||||
from simulation_task task
|
||||
left join simulation_task_member task_member on task.uuid = task_member.task_id
|
||||
<where>
|
||||
task_member.user_id in
|
||||
(
|
||||
<foreach collection='req.userIds' item='userId' index='index' separator=','>
|
||||
#{userId}
|
||||
</foreach>
|
||||
)
|
||||
|
||||
<if test="req.tag1List != null and req.tag1List.size > 0">
|
||||
and task.tag1 in
|
||||
<foreach collection='req.tag1List' item='tag1' index='index' separator=','>
|
||||
#{tag1}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="req.tag2List != null and req.tag2List.size > 0">
|
||||
and task.tag2 in
|
||||
<foreach collection='req.tag2List' item='tag2' index='index' separator=','>
|
||||
#{tag2}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="req.tag3 != null and req.tag3 !='' ">
|
||||
and task.tag3 = #{req.tag3}
|
||||
</if>
|
||||
<if test="req.tag4 != null and req.tag4 !='' ">
|
||||
and task.tag4 = #{req.tag4}
|
||||
</if>
|
||||
<if test="req.tag5 != null and req.tag5 !='' ">
|
||||
and task.tag5 = #{req.tag5}
|
||||
</if>
|
||||
<if test="req.tag6 != null and req.tag6 !='' ">
|
||||
and task.tag6 = #{req.tag6}
|
||||
</if>
|
||||
<if test="req.tag7 != null and req.tag7 !='' ">
|
||||
and task.tag7 = #{req.tag7}
|
||||
</if>
|
||||
<if test="req.tag8 != null and req.tag8 !='' ">
|
||||
and task.tag8 = #{req.tag8}
|
||||
</if>
|
||||
<if test="req.tag9 != null and req.tag9 !='' ">
|
||||
and task.tag9 = #{req.tag9}
|
||||
</if>
|
||||
<if test="req.tag10 != null and req.tag10 !='' ">
|
||||
and task.tag10 = #{req.tag10}
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<select id="getUserGroupDifficultyStatistics"
|
||||
parameterType="com.sdm.project.model.req.GetUserGroupTaskCompleteStatisticsReq"
|
||||
resultType="com.sdm.project.model.vo.UserGroupDifficultyVo">
|
||||
|
||||
Reference in New Issue
Block a user