feat:EP报工改造
This commit is contained in:
3
1-sql/2026-03-09/simulation_work.sql
Normal file
3
1-sql/2026-03-09/simulation_work.sql
Normal file
@@ -0,0 +1,3 @@
|
||||
ALTER TABLE spdm_baseline.simulation_work ADD approveStatus varchar(100) NULL COMMENT 'EP审批状态';
|
||||
ALTER TABLE spdm_baseline.simulation_work ADD planBeginTime datetime NULL COMMENT '任务计划开始时间';
|
||||
ALTER TABLE spdm_baseline.simulation_work ADD planFinishTime datetime NULL COMMENT '任务计划完成时间';
|
||||
@@ -32,4 +32,13 @@ public class TaskProgressService {
|
||||
}
|
||||
return taskProgressStatusList.getData().stream().collect(Collectors.toMap(DataDictionary::getDictName, DataDictionary::getDictValue));
|
||||
}
|
||||
|
||||
public Map<String, String> getNameByValueMap() {
|
||||
SdmResponse<List<DataDictionary>> taskProgressStatusList = sysConfigFeignClient.getDictionaryData(SUBMITTER_TASK_PROGRESS_STATUS);
|
||||
if (!taskProgressStatusList.isSuccess() || ObjectUtils.isEmpty(taskProgressStatusList.getData())) {
|
||||
log.error("字典信息查询失败");
|
||||
return emptyMap();
|
||||
}
|
||||
return taskProgressStatusList.getData().stream().collect(Collectors.toMap(DataDictionary::getDictValue, DataDictionary::getDictName));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -558,7 +558,6 @@ public class DataFileController implements IDataFeignClient {
|
||||
* 文件信息入库准备发起评审
|
||||
*/
|
||||
@AutoFillDictTags
|
||||
@SysLog("新增文件")
|
||||
@PostMapping("/batchAddFileInfo")
|
||||
@Operation(summary = "文件信息入库准备发起评审")
|
||||
public SdmResponse<List<BatchAddFileInfoResp>> batchAddFileInfo(@RequestBody UploadFilesReq req) {
|
||||
|
||||
@@ -49,4 +49,6 @@ public class SimulationWorkController {
|
||||
return simulationWorkService.deleteWork(req);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package com.sdm.project.model.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.sdm.common.entity.resp.system.CIDUserResp;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.experimental.Accessors;
|
||||
@@ -99,4 +97,25 @@ public class SimulationWork implements Serializable {
|
||||
@TableField("taskId")
|
||||
private String taskId;
|
||||
|
||||
@ApiModelProperty(value = "EP审批状态")
|
||||
@TableField("approveStatus")
|
||||
private String approveStatus;
|
||||
|
||||
@ApiModelProperty(value = "任务计划开始时间")
|
||||
@TableField("planBeginTime")
|
||||
private String planBeginTime;
|
||||
|
||||
@ApiModelProperty(value = "任务计划完成时间")
|
||||
@TableField("planFinishTime")
|
||||
private String planFinishTime;
|
||||
|
||||
|
||||
@Schema(description= "项目编号,列表展示使用")
|
||||
@TableField(value = "projectCode", insertStrategy = FieldStrategy.NEVER,select = false,updateStrategy = FieldStrategy.NEVER)
|
||||
private String projectCode;
|
||||
|
||||
@Schema(description= "工位编号,列表展示使用")
|
||||
@TableField(value = "workSpaceCode", insertStrategy = FieldStrategy.NEVER,select = false,updateStrategy = FieldStrategy.NEVER)
|
||||
private String workSpaceCode;
|
||||
|
||||
}
|
||||
|
||||
@@ -143,4 +143,6 @@ public class SpdmTaskListReq {
|
||||
|
||||
private List<String> filterDiscipline;
|
||||
|
||||
private String taskId;
|
||||
|
||||
}
|
||||
|
||||
@@ -1,19 +1,44 @@
|
||||
|
||||
package com.sdm.project.model.req;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import com.sdm.project.model.bo.TaskNodeTag;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* 查询报工列表请求参数
|
||||
*/
|
||||
@Data
|
||||
public class SpdmWorkListReq {
|
||||
/** 项目uuid */
|
||||
@Schema(description = "项目uuid")
|
||||
private String projectId;
|
||||
|
||||
@NotNull(message = "current不能为空")
|
||||
/** 工位uuid */
|
||||
@Schema(description = "工位uuid")
|
||||
private String workSpaceId;
|
||||
|
||||
/** 审批状态:0:未审批,1:已审批 */
|
||||
@Schema(description = "审批状态")
|
||||
private Integer approveStatus;
|
||||
|
||||
/** 类型 0:我确认的,1:我执行的 */
|
||||
@Schema(description = "类型")
|
||||
private Integer type;
|
||||
|
||||
@Schema(description = "任务id")
|
||||
private String taskId;
|
||||
|
||||
private List<TaskNodeTag> nodeTypeMap;
|
||||
|
||||
/** 分页参数 */
|
||||
@NotNull(message = "分页参数不能为空")
|
||||
private Integer current;
|
||||
|
||||
@NotNull(message = "size不能为空")
|
||||
@NotNull(message = "每页数量不能为空")
|
||||
private Integer size;
|
||||
|
||||
@NotNull(message = "taskId不能为空")
|
||||
private String taskId;
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ package com.sdm.project.model.req;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.sdm.common.entity.pojo.BaseEntity;
|
||||
import com.sdm.project.model.bo.TaskNodeTag;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
@@ -41,4 +42,12 @@ public class SpdmWorkReq {
|
||||
|
||||
private List<Long> delIdList;
|
||||
|
||||
private List<TaskNodeTag> idMap;
|
||||
|
||||
private List<TaskNodeTag> nodeTypeMap;
|
||||
/**
|
||||
* 计划开始和结束时间
|
||||
*/
|
||||
private String[] planTime;
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package com.sdm.project.service.impl;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.ArrayUtil;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
||||
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
@@ -11,22 +13,31 @@ import com.sdm.common.common.ThreadLocalContext;
|
||||
import com.sdm.common.entity.req.system.UserQueryReq;
|
||||
import com.sdm.common.entity.resp.system.CIDUserResp;
|
||||
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
|
||||
import com.sdm.common.service.TaskProgressService;
|
||||
import com.sdm.common.utils.PageUtils;
|
||||
import com.sdm.common.utils.TimeCalculator;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.sdm.outbridge.entity.LyricVProjectBatchToDM;
|
||||
import com.sdm.outbridge.service.lyric.LyricVProjectBatchToDmService;
|
||||
import com.sdm.outbridge.service.lyric.LyricVProjectToDmService;
|
||||
import com.sdm.project.common.MemberTypeEnum;
|
||||
import com.sdm.project.common.TaskQryTypeEnum;
|
||||
import com.sdm.project.dao.SimulationNodeMapper;
|
||||
import com.sdm.project.dao.SimulationTaskMapper;
|
||||
import com.sdm.project.dao.SimulationWorkMapper;
|
||||
import com.sdm.project.model.bo.TaskNodeTag;
|
||||
import com.sdm.project.model.entity.SimulationNode;
|
||||
import com.sdm.project.model.entity.SimulationTask;
|
||||
import com.sdm.project.model.entity.SimulationTaskExtra;
|
||||
import com.sdm.project.model.entity.SimulationWork;
|
||||
import com.sdm.project.model.req.SpdmTaskListReq;
|
||||
import com.sdm.project.model.req.SpdmWorkListReq;
|
||||
import com.sdm.project.model.req.SpdmWorkReq;
|
||||
import com.sdm.project.model.vo.SpdmNewTaskVo;
|
||||
import com.sdm.project.model.vo.SpdmTaskMemberVo;
|
||||
import com.sdm.common.entity.resp.project.SpdmTaskVo;
|
||||
import com.sdm.project.service.ISimulationWorkService;
|
||||
import com.sdm.project.service.ITaskService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
@@ -36,6 +47,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
@@ -62,6 +74,18 @@ public class SimulationWorkServiceImpl extends ServiceImpl<SimulationWorkMapper,
|
||||
@Autowired
|
||||
private LyricVProjectBatchToDmService lyricVProjectBatchToDmService;
|
||||
|
||||
@Resource
|
||||
private ITaskService taskService;
|
||||
|
||||
@Autowired
|
||||
private TaskProgressService taskProgressService;
|
||||
|
||||
@Autowired
|
||||
private SimulationTaskMapper simulationTaskMapper;
|
||||
|
||||
@Autowired
|
||||
private SimulationNodeMapper simulationNodeMapper;
|
||||
|
||||
// 报工类型常量
|
||||
public static final int WORK_TYPE_START = 0; // 开始报工
|
||||
public static final int WORK_TYPE_FINISH = 1; // 完成报工
|
||||
@@ -121,6 +145,10 @@ public class SimulationWorkServiceImpl extends ServiceImpl<SimulationWorkMapper,
|
||||
SimulationWork simulationWork = new SimulationWork();
|
||||
BeanUtils.copyProperties(req, simulationWork);
|
||||
simulationWork.setCreator(ThreadLocalContext.getUserId());
|
||||
if (ArrayUtil.isNotEmpty(req.getPlanTime())) {
|
||||
simulationWork.setPlanBeginTime(req.getPlanTime()[0]);
|
||||
simulationWork.setPlanFinishTime(req.getPlanTime()[1]);
|
||||
}
|
||||
if (!this.save(simulationWork)) {
|
||||
log.warn("新增报工失败,保存报工数据失败,任务ID:{}", req.getTaskId());
|
||||
return SdmResponse.failed("新增报工失败");
|
||||
@@ -154,7 +182,87 @@ public class SimulationWorkServiceImpl extends ServiceImpl<SimulationWorkMapper,
|
||||
/**
|
||||
* 类型0:更新开始时间
|
||||
*/
|
||||
private boolean updateStartWork(Long workId, String curDateStr) {
|
||||
private boolean updateStartWork(Long workId, String curDateStr, SpdmWorkReq req) {
|
||||
// 启动报告 调用EP创建任务接口
|
||||
// 批次
|
||||
|
||||
SimulationWork simulationWork = this.getById(workId);
|
||||
|
||||
// 查询此条报工对应的task
|
||||
SpdmTaskListReq taskListReq = new SpdmTaskListReq();
|
||||
taskListReq.setTaskId(simulationWork.getTaskId());
|
||||
taskListReq.setType(TaskQryTypeEnum.ALL.getCode());
|
||||
taskListReq.setIdMap(req.getIdMap());
|
||||
taskListReq.setCurrent(1);
|
||||
taskListReq.setSize(10);
|
||||
SdmResponse response = taskService.list(taskListReq);
|
||||
if (response.isSuccess()) {
|
||||
JSONObject dataObj = (JSONObject) response.getData();
|
||||
List<SpdmNewTaskVo> taskVoList = (List<SpdmNewTaskVo>) dataObj.get("data");
|
||||
if (CollectionUtils.isNotEmpty(taskVoList)) {
|
||||
SpdmNewTaskVo taskVo = taskVoList.get(0);
|
||||
// 构造EP创建任务参数
|
||||
// 项目号
|
||||
|
||||
// 机台号
|
||||
|
||||
// 工位号
|
||||
|
||||
String projectCode = getNodeCodeByType(taskVo, req.getIdMap(), "project");
|
||||
String machineCode = getNodeCodeByType(taskVo, req.getIdMap(), "machine");
|
||||
String workspaceCode = getNodeCodeByType(taskVo, req.getIdMap(), "workspace");
|
||||
|
||||
// 工序 任务名称-学科
|
||||
// taskVo.getTaskName() + "-" + taskVo.getDiscipline();
|
||||
|
||||
// 任务详情 报工名称-应完成阶段
|
||||
Map<String, String> taskProgressMap = taskProgressService.getNameByValueMap();
|
||||
// simulationWork.getWorkName() + "-" + taskProgressMap.get(simulationWork.getShouldProgress());
|
||||
|
||||
// 创建时间
|
||||
|
||||
// 计划开始时间
|
||||
simulationWork.getPlanBeginTime();
|
||||
|
||||
// 计划完成时间
|
||||
simulationWork.getPlanFinishTime();
|
||||
|
||||
// 实际开始时间
|
||||
|
||||
// 报工日期 当天
|
||||
|
||||
// 计划工时
|
||||
simulationWork.getPlanWorkHour();
|
||||
|
||||
// 标准工时
|
||||
simulationWork.getPlanWorkHour();
|
||||
|
||||
// 责任人工号
|
||||
// 根据userId查询工号
|
||||
UserQueryReq userReq = new UserQueryReq();
|
||||
userReq.setUserId(Long.valueOf(simulationWork.getOwner()));
|
||||
userReq.setTenantId(ThreadLocalContext.getTenantId());
|
||||
SdmResponse<CIDUserResp> sdmResponse = sysUserFeignClient.queryUserDetail(userReq);
|
||||
if (sdmResponse.getData() != null) {
|
||||
sdmResponse.getData().getUsername();
|
||||
}
|
||||
|
||||
// 确认人工号
|
||||
userReq.setUserId(Long.valueOf(simulationWork.getCreator()));
|
||||
SdmResponse<CIDUserResp> sdmResponse2 = sysUserFeignClient.queryUserDetail(userReq);
|
||||
if (sdmResponse2.getData() != null) {
|
||||
sdmResponse2.getData().getUsername();
|
||||
}
|
||||
|
||||
// SAP工序ID 固定为2C
|
||||
|
||||
// 工时属性 固定为研发
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
return this.lambdaUpdate()
|
||||
.set(SimulationWork::getBeginTime, curDateStr)
|
||||
.eq(SimulationWork::getId, workId)
|
||||
@@ -192,6 +300,12 @@ public class SimulationWorkServiceImpl extends ServiceImpl<SimulationWorkMapper,
|
||||
setIfPresent(updateWrapper, req.getWorkName(), SimulationWork::getWorkName);
|
||||
setIfPresent(updateWrapper, req.getActualProgress(), SimulationWork::getActualProgress);
|
||||
setIfPresent(updateWrapper, req.getShouldProgress(), SimulationWork::getShouldProgress);
|
||||
setIfPresent(updateWrapper, req.getOwner(), SimulationWork::getOwner);
|
||||
|
||||
if (ArrayUtil.isNotEmpty(req.getPlanTime())) {
|
||||
updateWrapper.set(SimulationWork::getPlanBeginTime, req.getPlanTime()[0]);
|
||||
updateWrapper.set(SimulationWork::getPlanFinishTime, req.getPlanTime()[1]);
|
||||
}
|
||||
|
||||
// 3. 更新报工
|
||||
boolean updateFlag = updateWrapper.eq(SimulationWork::getId, workId).update();
|
||||
@@ -305,7 +419,7 @@ public class SimulationWorkServiceImpl extends ServiceImpl<SimulationWorkMapper,
|
||||
boolean updateFlag = false;
|
||||
switch (type) {
|
||||
case WORK_TYPE_START:
|
||||
updateFlag = updateStartWork(workId, curDateStr);
|
||||
updateFlag = updateStartWork(workId, curDateStr, req);
|
||||
break;
|
||||
case WORK_TYPE_FINISH:
|
||||
updateFlag = updateFinishWork(workId, curDateStr);
|
||||
@@ -333,19 +447,84 @@ public class SimulationWorkServiceImpl extends ServiceImpl<SimulationWorkMapper,
|
||||
|
||||
@Override
|
||||
public SdmResponse queryWork(SpdmWorkListReq req) {
|
||||
PageHelper.startPage(req.getCurrent(), req.getSize());
|
||||
List<SimulationWork> workList = this.lambdaQuery().eq(SimulationWork::getTaskId, req.getTaskId()).list();
|
||||
if (CollectionUtils.isEmpty(workList)) {
|
||||
PageInfo<SimulationWork> page = new PageInfo<>(workList);
|
||||
return PageUtils.getJsonObjectSdmResponse(workList, page);
|
||||
}
|
||||
// 当前用户需要是报工条目的创建人或负责人
|
||||
Long userId = ThreadLocalContext.getUserId();
|
||||
workList = workList.stream().filter(work -> userId.equals(work.getOwner()) || userId.equals(work.getCreator())).collect(Collectors.toList());
|
||||
List<SimulationWork> workList;
|
||||
|
||||
// 工位筛选:获取符合条件的taskId列表
|
||||
List<String> filteredTaskIds = null;
|
||||
if (StringUtils.isNotBlank(req.getWorkSpaceId())) {
|
||||
filteredTaskIds = getTaskIdsByNodeId(req, "workspace", req.getWorkSpaceId());
|
||||
if (CollectionUtils.isEmpty(filteredTaskIds)) {
|
||||
// 没有匹配的任务,返回空结果
|
||||
PageInfo<SimulationWork> page = new PageInfo<>(new ArrayList<>());
|
||||
return PageUtils.getJsonObjectSdmResponse(new ArrayList<>(), page);
|
||||
}
|
||||
}
|
||||
|
||||
// 项目筛选:获取符合条件的taskId列表
|
||||
if (StringUtils.isNotBlank(req.getProjectId())) {
|
||||
List<String> projectTaskIds = getTaskIdsByNodeId(req, "project", req.getProjectId());
|
||||
if (CollectionUtils.isEmpty(projectTaskIds)) {
|
||||
// 没有匹配的任务,返回空结果
|
||||
PageInfo<SimulationWork> page = new PageInfo<>(new ArrayList<>());
|
||||
return PageUtils.getJsonObjectSdmResponse(new ArrayList<>(), page);
|
||||
}
|
||||
// 如果已有工位筛选,取交集
|
||||
if (filteredTaskIds != null) {
|
||||
filteredTaskIds = filteredTaskIds.stream()
|
||||
.filter(projectTaskIds::contains)
|
||||
.collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(filteredTaskIds)) {
|
||||
PageInfo<SimulationWork> page = new PageInfo<>(new ArrayList<>());
|
||||
return PageUtils.getJsonObjectSdmResponse(new ArrayList<>(), page);
|
||||
}
|
||||
} else {
|
||||
filteredTaskIds = projectTaskIds;
|
||||
}
|
||||
}
|
||||
|
||||
// 判断是否传了taskId
|
||||
if (StringUtils.isNotBlank(req.getTaskId())) {
|
||||
// 传了taskId,按原逻辑查询
|
||||
PageHelper.startPage(req.getCurrent(), req.getSize());
|
||||
workList = this.lambdaQuery().eq(SimulationWork::getTaskId, req.getTaskId()).list();
|
||||
if (CollectionUtils.isEmpty(workList)) {
|
||||
PageInfo<SimulationWork> page = new PageInfo<>(workList);
|
||||
return PageUtils.getJsonObjectSdmResponse(workList, page);
|
||||
}
|
||||
// 当前用户需要是报工条目的创建人或负责人
|
||||
workList = workList.stream().filter(work -> userId.equals(work.getOwner()) || userId.equals(work.getCreator())).collect(Collectors.toList());
|
||||
} else {
|
||||
// 不传taskId,根据type查询
|
||||
PageHelper.startPage(req.getCurrent(), req.getSize());
|
||||
if (req.getType() != null && req.getType() == 0) {
|
||||
// type=0:查询当前登录人为creator(我确认的)
|
||||
workList = this.lambdaQuery().eq(SimulationWork::getCreator, userId).list();
|
||||
} else if (req.getType() != null && req.getType() == 1) {
|
||||
// type=1:查询当前登录人为owner(我执行的)
|
||||
workList = this.lambdaQuery().eq(SimulationWork::getOwner, userId).list();
|
||||
} else {
|
||||
// type为空或其他值,查询全部
|
||||
workList = this.lambdaQuery().list();
|
||||
}
|
||||
|
||||
// 如果有筛选条件,过滤workList
|
||||
if (filteredTaskIds != null && CollectionUtils.isNotEmpty(workList)) {
|
||||
List<String> finalFilteredTaskIds = filteredTaskIds;
|
||||
workList = workList.stream()
|
||||
.filter(work -> finalFilteredTaskIds.contains(work.getTaskId()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
|
||||
if (CollectionUtils.isEmpty(workList)) {
|
||||
PageInfo<SimulationWork> page = new PageInfo<>(workList);
|
||||
return PageUtils.getJsonObjectSdmResponse(workList, page);
|
||||
}
|
||||
|
||||
// 填充projectCode和workSpaceCode
|
||||
fillProjectAndWorkSpaceCode(workList, req.getNodeTypeMap());
|
||||
|
||||
SdmResponse<List<CIDUserResp>> cidUserResp = sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(workList.stream().map(SimulationWork::getOwner).filter(ObjectUtils::isNotEmpty).toList()).build());
|
||||
if (CollectionUtils.isEmpty(cidUserResp.getData())) {
|
||||
PageInfo<SimulationWork> page = new PageInfo<>(workList);
|
||||
@@ -364,6 +543,182 @@ public class SimulationWorkServiceImpl extends ServiceImpl<SimulationWorkMapper,
|
||||
return PageUtils.getJsonObjectSdmResponse(workList, page);
|
||||
}
|
||||
|
||||
/**
|
||||
* 填充projectCode和workSpaceCode
|
||||
* 1. 根据taskId批量查询simulation_task
|
||||
* 2. 从nodeTypeMap获取project和workspace对应的tag字段名
|
||||
* 3. 从simulation_task获取tag值(是simulation_node的uuid)
|
||||
* 4. 批量查询simulation_node获取nodeCode
|
||||
*/
|
||||
private void fillProjectAndWorkSpaceCode(List<SimulationWork> workList, List<TaskNodeTag> nodeTypeMap) {
|
||||
if (CollectionUtils.isEmpty(nodeTypeMap) || CollectionUtils.isEmpty(workList)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 1. 获取所有taskId,批量查询simulation_task
|
||||
List<String> taskIds = workList.stream()
|
||||
.map(SimulationWork::getTaskId)
|
||||
.filter(StringUtils::isNotBlank)
|
||||
.distinct()
|
||||
.toList();
|
||||
if (CollectionUtils.isEmpty(taskIds)) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<SimulationTask> tasks = simulationTaskMapper.selectList(
|
||||
new QueryWrapper<SimulationTask>().in("uuid", taskIds)
|
||||
);
|
||||
if (CollectionUtils.isEmpty(tasks)) {
|
||||
return;
|
||||
}
|
||||
Map<String, SimulationTask> taskMap = tasks.stream()
|
||||
.collect(Collectors.toMap(SimulationTask::getUuid, Function.identity()));
|
||||
|
||||
// 2. 从nodeTypeMap获取project和workspace对应的tag字段名
|
||||
String projectTagField = nodeTypeMap.stream()
|
||||
.filter(tag -> "project".equals(tag.getKey()))
|
||||
.map(TaskNodeTag::getValue)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
String workspaceTagField = nodeTypeMap.stream()
|
||||
.filter(tag -> "workspace".equals(tag.getKey()))
|
||||
.map(TaskNodeTag::getValue)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
|
||||
// 3. 收集所有需要查询的nodeId
|
||||
Set<String> nodeIds = new HashSet<>();
|
||||
Map<String, String> taskProjectNodeIdMap = new HashMap<>();
|
||||
Map<String, String> taskWorkspaceNodeIdMap = new HashMap<>();
|
||||
|
||||
for (SimulationWork work : workList) {
|
||||
SimulationTask task = taskMap.get(work.getTaskId());
|
||||
if (task == null) continue;
|
||||
|
||||
// 通过反射获取tag字段值
|
||||
if (StringUtils.isNotBlank(projectTagField)) {
|
||||
String projectNodeId = getTagValue(task, projectTagField);
|
||||
if (StringUtils.isNotBlank(projectNodeId)) {
|
||||
nodeIds.add(projectNodeId);
|
||||
taskProjectNodeIdMap.put(work.getTaskId(), projectNodeId);
|
||||
}
|
||||
}
|
||||
if (StringUtils.isNotBlank(workspaceTagField)) {
|
||||
String workspaceNodeId = getTagValue(task, workspaceTagField);
|
||||
if (StringUtils.isNotBlank(workspaceNodeId)) {
|
||||
nodeIds.add(workspaceNodeId);
|
||||
taskWorkspaceNodeIdMap.put(work.getTaskId(), workspaceNodeId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (CollectionUtils.isEmpty(nodeIds)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 4. 批量查询simulation_node
|
||||
List<SimulationNode> nodes = simulationNodeMapper.selectList(
|
||||
new QueryWrapper<SimulationNode>().in("uuid", nodeIds)
|
||||
);
|
||||
if (CollectionUtils.isEmpty(nodes)) {
|
||||
return;
|
||||
}
|
||||
Map<String, String> nodeCodeMap = nodes.stream()
|
||||
.collect(Collectors.toMap(SimulationNode::getUuid, SimulationNode::getNodeCode));
|
||||
|
||||
// 5. 设置projectCode和workSpaceCode
|
||||
for (SimulationWork work : workList) {
|
||||
String projectNodeId = taskProjectNodeIdMap.get(work.getTaskId());
|
||||
if (StringUtils.isNotBlank(projectNodeId)) {
|
||||
work.setProjectCode(nodeCodeMap.get(projectNodeId));
|
||||
}
|
||||
String workspaceNodeId = taskWorkspaceNodeIdMap.get(work.getTaskId());
|
||||
if (StringUtils.isNotBlank(workspaceNodeId)) {
|
||||
work.setWorkSpaceCode(nodeCodeMap.get(workspaceNodeId));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过反射获取SimulationTask的tag字段值
|
||||
*/
|
||||
private String getTagValue(SimulationTask task, String tagField) {
|
||||
try {
|
||||
java.lang.reflect.Field field = SimulationTask.class.getDeclaredField(tagField);
|
||||
field.setAccessible(true);
|
||||
return (String) field.get(task);
|
||||
} catch (Exception e) {
|
||||
log.warn("获取SimulationTask的tag字段值失败,字段名:{}", tagField, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据节点uuid获取符合条件的taskId列表
|
||||
* @param req 请求参数
|
||||
* @param nodeTypeKey nodeTypeMap中的key(如workspace、project)
|
||||
* @param nodeId 节点uuid
|
||||
* @return taskId列表
|
||||
*/
|
||||
private List<String> getTaskIdsByNodeId(SpdmWorkListReq req, String nodeTypeKey, String nodeId) {
|
||||
// 1. 从nodeTypeMap中获取对应的tag字段
|
||||
String tagField = null;
|
||||
if (CollectionUtils.isNotEmpty(req.getNodeTypeMap())) {
|
||||
tagField = req.getNodeTypeMap().stream()
|
||||
.filter(tag -> nodeTypeKey.equals(tag.getKey()))
|
||||
.map(TaskNodeTag::getValue)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
if (StringUtils.isBlank(tagField)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 2. 直接用nodeId查询simulation_task表
|
||||
QueryWrapper<SimulationTask> taskWrapper = new QueryWrapper<>();
|
||||
taskWrapper.eq(tagField, nodeId);
|
||||
List<SimulationTask> tasks = simulationTaskMapper.selectList(taskWrapper);
|
||||
|
||||
if (CollectionUtils.isEmpty(tasks)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return tasks.stream().map(SimulationTask::getUuid).toList();
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据nodeTypeKey从SpdmNewTaskVo中获取对应的Code值
|
||||
* @param taskVo 任务VO
|
||||
* @param nodeTypeMap 标签映射关系
|
||||
* @param nodeTypeKey 类型key(project、machine、workspace)
|
||||
* @return 对应的Code值
|
||||
*/
|
||||
private String getNodeCodeByType(SpdmNewTaskVo taskVo, List<TaskNodeTag> nodeTypeMap, String nodeTypeKey) {
|
||||
if (taskVo == null || CollectionUtils.isEmpty(nodeTypeMap)) {
|
||||
return null;
|
||||
}
|
||||
// 1. 从nodeTypeMap获取对应的tag字段名(如tag1、tag4、tag5)
|
||||
String tagField = nodeTypeMap.stream()
|
||||
.filter(tag -> nodeTypeKey.equals(tag.getKey()))
|
||||
.map(TaskNodeTag::getValue)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (StringUtils.isBlank(tagField)) {
|
||||
return null;
|
||||
}
|
||||
// 2. 构造对应的Code字段名(如tag1 -> tag1Code)
|
||||
String codeField = tagField + "Code";
|
||||
// 3. 通过反射获取值
|
||||
try {
|
||||
java.lang.reflect.Field field = SpdmNewTaskVo.class.getDeclaredField(codeField);
|
||||
field.setAccessible(true);
|
||||
return (String) field.get(taskVo);
|
||||
} catch (Exception e) {
|
||||
log.warn("获取SpdmNewTaskVo的{}字段值失败", codeField, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public SdmResponse deleteWork(SpdmWorkReq req) {
|
||||
List<Long> delIdList = req.getDelIdList();
|
||||
|
||||
@@ -763,6 +763,9 @@
|
||||
<if test="req.demandId != null and req.demandId != ''">
|
||||
and demand_id = #{req.demandId}
|
||||
</if>
|
||||
<if test="req.taskId != null and req.taskId != ''">
|
||||
and st.uuid = #{req.taskId}
|
||||
</if>
|
||||
<if test="req.taskName != null and req.taskName != ''">
|
||||
<bind name="searchKey1" value="'%' + req.taskName + '%'"/>
|
||||
and task_name like #{searchKey1}
|
||||
@@ -880,6 +883,9 @@
|
||||
<if test="req.demandId != null and req.demandId != ''">
|
||||
and demand_id = #{req.demandId}
|
||||
</if>
|
||||
<if test="req.taskId != null and req.taskId != ''">
|
||||
and st.uuid = #{req.taskId}
|
||||
</if>
|
||||
<if test="req.taskName != null and req.taskName != ''">
|
||||
<bind name="searchKey2" value="'%' + req.taskName + '%'"/>
|
||||
and task_name like #{searchKey2}
|
||||
|
||||
Reference in New Issue
Block a user