@@ -35,6 +35,7 @@ import com.sdm.project.dao.SimulationTaskMapper;
import com.sdm.project.model.bo.TaskExtraNode ;
import com.sdm.project.model.bo.TaskMemberNode ;
import com.sdm.project.model.bo.TaskNode ;
import com.sdm.project.model.entity.SimulationTaskMember ;
import com.sdm.project.model.po.ProjectNodePo ;
import com.sdm.project.model.po.TaskNodePo ;
import com.sdm.project.model.req.* ;
@@ -60,6 +61,7 @@ import java.util.*;
import java.util.stream.Collectors ;
import static com.sdm.project.service.impl.LyricInternalServiceImpl.PRODUCE_LINE ;
import static com.sdm.project.service.impl.NodeServiceImpl.FIELD_NAMES ;
import static com.sdm.project.service.impl.NodeServiceImpl.getTagListProperty ;
@Slf4j
@@ -435,9 +437,192 @@ public class DemandServiceImpl extends BaseService implements IDemandService {
}
}
renameDirNew ( req . getUuid ( ) , req . getDemandName ( ) , false ) ;
// 需求待办修改属性时,需要同步到任务上,(项目、阶段、机台、工位、关注人、仿真类型、确认人、描述)
syncUpdateTask ( req ) ;
return SdmResponse . success ( ) ;
}
private String nullToEmpty ( String str ) {
return str = = null ? " " : str ;
}
// 判断tag是否有改变
public boolean isCombinedStringEqual ( String projectId , String phaseId , String machineId , String workspaceId ,
String tag1 , String tag2 , String tag4 , String tag5 ) {
// 处理空值后拼接第一组字符串( projectId+phaseId+machineId+workspaceId)
String combinedReq = nullToEmpty ( projectId )
+ nullToEmpty ( phaseId )
+ nullToEmpty ( machineId )
+ nullToEmpty ( workspaceId ) ;
// 处理空值后拼接第二组字符串( tag1+tag2+tag4+tag5)
String combinedTag = nullToEmpty ( tag1 )
+ nullToEmpty ( tag2 )
+ nullToEmpty ( tag4 )
+ nullToEmpty ( tag5 ) ;
// 比较两个拼接后的字符串是否完全一致
return combinedReq . equals ( combinedTag ) ;
}
public SdmResponse deleteDirById ( String uuid ) {
DelDirReq req = new DelDirReq ( ) ;
req . setDelUuid ( uuid ) ;
log . info ( " 调用删除任务文件夹的参数为:{} " , req ) ;
SdmResponse response = dataClientFeignClient . delDir ( req ) ;
log . info ( " 调用删除任务文件夹的返回值为:{} " , response ) ;
return response ;
}
private SdmResponse createDirNew ( String uuid , String uuidOwnType , String parentUuid , String dirName , SpdmTaskVo task ) {
CreateDirReq createDirReq = new CreateDirReq ( ) ;
createDirReq . setUuId ( uuid ) ;
createDirReq . setUuIdOwnType ( uuidOwnType ) ;
createDirReq . setParentUuId ( parentUuid ) ;
createDirReq . setDirName ( dirName ) ;
createDirReq . setDirType ( DirTypeEnum . PROJECT_NODE_DIR . getValue ( ) ) ;
TagReq tagReq = new TagReq ( ) ;
BeanUtils . copyProperties ( task , tagReq ) ;
if ( NodeTypeEnum . TASK . getValue ( ) . equals ( uuidOwnType ) ) {
tagReq . setTaskId ( uuid ) ;
}
createDirReq . setTagReq ( tagReq ) ;
log . info ( " 修改需求同步修改任务时调用创建文件夹的参数为:{} " , createDirReq ) ;
SdmResponse response = dataClientFeignClient . createDir ( createDirReq ) ;
log . info ( " 修改需求同步修改任务时调用创建文件夹的返回值为:{} " , response ) ;
return response ;
}
/**
* 查找最后一个不为空的字段名称
* @param fields 按顺序传入的字段值( 需与FIELD_NAMES顺序一致)
* @return 最后一个不为空的字段名称, 无则返回null
*/
public static String findLastNonNullField ( String . . . fields ) {
// 校验传入的字段值数量是否匹配
if ( fields = = null | | fields . length ! = FIELD_NAMES . length ) {
throw new IllegalArgumentException ( " 传入的字段值数量必须与预定义字段数量一致( 4个) " ) ;
}
// 遍历字段,找到第一个为空的位置,返回前一个字段
for ( int i = 0 ; i < fields . length ; i + + ) {
String fieldValue = fields [ i ] ;
// 判断字段值是否为空( 包括null和空字符串)
if ( fieldValue = = null | | fieldValue . trim ( ) . isEmpty ( ) ) {
// 如果第一个字段就为空, 返回null
if ( i = = 0 ) {
return null ;
}
// 返回前一个不为空的字段名称
return fields [ i - 1 ] ;
}
}
// 所有字段都不为空,返回最后一个字段名称
return fields [ fields . length - 1 ] ;
}
/**
* 根据待办的属性,同步修改任务属性
* @param req
*/
private void syncUpdateTask ( SpdmEditDemandReq req ) {
Long userId = ThreadLocalContext . getUserId ( ) ;
String curDataStr = DateUtil . now ( ) ;
String projectId = req . getProjectId ( ) ;
String phaseId = req . getPhaseId ( ) ;
String machineId = req . getMachineId ( ) ;
String workspaceId = req . getWorkspaceId ( ) ;
String demandName = req . getDemandName ( ) ;
String aMemberList = req . getAMemberList ( ) ;
String pMemberList = req . getPMemberList ( ) ;
String description = req . getDescription ( ) ;
// 查询需求下关联的任务
List < SpdmTaskVo > taskList = taskMapper . getTaskListByDemandId ( req . getUuid ( ) ) ;
if ( CollectionUtils . isEmpty ( taskList ) ) {
log . info ( " 需求:{}下没有关联任务,不同步属性 " , req . getUuid ( ) ) ;
return ;
}
// 查询任务相关成员
List < String > taskIdList = taskList . stream ( ) . map ( SpdmTaskVo : : getUuid ) . toList ( ) ;
// 处理成员信息
projectMapper . deleteTaskMemberListByType ( taskIdList , Arrays . asList ( MemberTypeEnum . PRINCIPAL . getCode ( ) , MemberTypeEnum . ATTENTION . getCode ( ) ) ) ;
List < SimulationTaskMember > taskMembersToCreate = new ArrayList < > ( ) ;
for ( SpdmTaskVo spdmTaskVo : taskList ) {
if ( StringUtils . isNotBlank ( aMemberList ) ) {
for ( String aMemberId : Arrays . stream ( aMemberList . split ( " , " ) ) . toList ( ) ) {
SimulationTaskMember taskMember = new SimulationTaskMember ( ) ;
taskMember . setTaskId ( spdmTaskVo . getUuid ( ) ) ;
taskMember . setUserId ( Long . valueOf ( aMemberId ) ) ;
taskMember . setType ( MemberTypeEnum . ATTENTION . getCode ( ) ) ;
taskMember . setCreator ( userId ) ;
taskMember . setCreateTime ( curDataStr ) ;
taskMembersToCreate . add ( taskMember ) ;
}
}
if ( StringUtils . isNotBlank ( pMemberList ) ) {
for ( String pMemberId : Arrays . stream ( pMemberList . split ( " , " ) ) . toList ( ) ) {
SimulationTaskMember taskMember = new SimulationTaskMember ( ) ;
taskMember . setTaskId ( spdmTaskVo . getUuid ( ) ) ;
taskMember . setUserId ( Long . valueOf ( pMemberId ) ) ;
taskMember . setType ( MemberTypeEnum . PRINCIPAL . getCode ( ) ) ;
taskMember . setCreator ( userId ) ;
taskMember . setCreateTime ( curDataStr ) ;
taskMembersToCreate . add ( taskMember ) ;
}
}
}
if ( CollectionUtils . isNotEmpty ( taskMembersToCreate ) ) {
taskMapper . saveBatchTaskMember ( taskMembersToCreate ) ;
}
// 处理基础信息
for ( SpdmTaskVo spdmTaskVo : taskList ) {
spdmTaskVo . setTag10 ( demandName ) ;
spdmTaskVo . setDescription ( description ) ;
taskMapper . updateTask ( spdmTaskVo ) ;
}
// 处理文件信息
for ( SpdmTaskVo spdmTaskVo : taskList ) {
String tag1 = spdmTaskVo . getTag1 ( ) ;
String tag2 = spdmTaskVo . getTag2 ( ) ;
String tag4 = spdmTaskVo . getTag4 ( ) ;
String tag5 = spdmTaskVo . getTag5 ( ) ;
if ( ! isCombinedStringEqual ( projectId , phaseId , machineId , workspaceId , tag1 , tag2 , tag4 , tag5 ) ) {
// 节点有变化,需要去处理任务的文件夹(删除原来的,在新的路径新增)
// 查询原来的任务是否有文件夹
GetFileBaseInfoReq getFileBaseInfoReq = new GetFileBaseInfoReq ( ) ;
String taskId = spdmTaskVo . getUuid ( ) ;
getFileBaseInfoReq . setUuid ( taskId ) ;
log . info ( " 调用获取文件的基本信息的参数为:{} " , getFileBaseInfoReq ) ;
SdmResponse < FileMetadataInfoResp > fileBaseInfo = dataClientFeignClient . getFileBaseInfo ( getFileBaseInfoReq ) ;
log . info ( " 调用获取文件的基本信息的返回值为:{} " , fileBaseInfo ) ;
if ( fileBaseInfo . isSuccess ( ) & & ObjectUtils . isNotEmpty ( fileBaseInfo . getData ( ) ) ) {
log . info ( " 当前任务:{},已创建过文件夹 " , taskId ) ;
// 删除原来的任务文件夹
SdmResponse taskDelDirResponse = deleteDirById ( taskId ) ;
if ( ObjectUtils . isEmpty ( taskDelDirResponse ) | | taskDelDirResponse . getCode ( ) ! = ResultCode . SUCCESS . getCode ( ) ) {
log . error ( " 删除任务:{}的文件夹失败,原因为:{} " , spdmTaskVo . getTaskName ( ) , taskDelDirResponse . getMessage ( ) ) ;
return ;
}
} else {
log . info ( " 当前任务:{},没有创建过文件夹 " , taskId ) ;
}
// 并新建任务文件夹
SdmResponse taskCreateDirResponse = createDirNew ( spdmTaskVo . getUuid ( ) , NodeTypeEnum . TASK . getValue ( ) , findLastNonNullField ( projectId , phaseId , machineId , workspaceId ) , spdmTaskVo . getTaskName ( ) , spdmTaskVo ) ;
if ( ObjectUtils . isEmpty ( taskCreateDirResponse ) | | taskCreateDirResponse . getCode ( ) ! = ResultCode . SUCCESS . getCode ( ) ) {
log . error ( " 新建任务:{}的文件夹失败,原因为:{} " , spdmTaskVo . getTaskName ( ) , taskCreateDirResponse . getMessage ( ) ) ;
return ;
}
}
}
}
@Transactional
@Override
public SdmResponse deleteDemand ( SpdmDeleteDemandReq req ) {