bim同步增加层级名称(区、栋、专业、层)

This commit is contained in:
guo 2023-07-24 17:18:06 +08:00
parent 9fcd7b03e5
commit 1728d185bd
8 changed files with 201 additions and 99 deletions

View File

@ -1,15 +1,13 @@
package com.zhgd.xmgl.modules.project.entity;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.util.Date;
/**
* BIM协同管理平台进度信息的保存接口发送body
*/
@Data
public class BIMProgressTaskRqBody {
private Long progressTaskId;
/**
* floor String 楼层-->例如"floor": "B1"
*/
@ -48,4 +46,13 @@ public class BIMProgressTaskRqBody {
* project=2 是坪山沙湖那个
*/
private Integer projectId;
/**
*
*/
private String district;
/**
*
*/
private String building;
}

View File

@ -197,6 +197,9 @@ public class ProgressTask implements Serializable {
@ApiModelProperty(value = "前置任务id列表使用英文“,”分割")
private String predecessorIds;
@ApiModelProperty(value = "层级名称(区、栋、专业、层)")
private String levelName;
/**
* 子节点列表
*/

View File

@ -0,0 +1,18 @@
package com.zhgd.xmgl.modules.project.enums;
public enum LevelNameEnum {
district(""), building(""), major("专业"), floor("");
private String levelName;
LevelNameEnum(String levelName) {
this.levelName = levelName;
}
public String getLevelName() {
return levelName;
}
public void setLevelName(String levelName) {
this.levelName = levelName;
}
}

View File

@ -6,7 +6,7 @@
duty_user_id, duty_user_name, progress_ratio, actual_start_date, create_date,
update_date,
create_user_id, status, file_url, remark, start_date, finish_date,
actual_finish_date, predecessor_ids)
actual_finish_date, predecessor_ids, level_name)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.id}, #{entity.projectSn}, #{entity.taskName}, #{entity.level}, #{entity.taskTypeId},
@ -15,7 +15,7 @@
#{entity.progressRatio},
#{entity.actualStartDate}, default, default, #{entity.createUserId},
#{entity.status}, #{entity.fileUrl}, #{entity.remark}, #{entity.startDate}, #{entity.finishDate},
#{entity.actualFinishDate}, #{entity.predecessorIds})
#{entity.actualFinishDate}, #{entity.predecessorIds}, #{entity.levelName})
</foreach>
</insert>

View File

@ -7,9 +7,11 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.concurrent.Future;
/**
* 异步调用bim
@ -21,7 +23,7 @@ public class AsyBim {
private String bimProgressIpPort;
@Async("bimExecutor")
public void asynAddProgressTask(BIMProgressTaskRqBody bimProgressTaskRqBody) {
public Future<Object> asyncAddProgressTask(BIMProgressTaskRqBody bimProgressTaskRqBody) {
if (StringUtils.isNotBlank(bimProgressIpPort)) {
String url = bimProgressIpPort + "/Other/SaveProgress";
String body = JSON.toJSONString(bimProgressTaskRqBody);
@ -58,12 +60,24 @@ public class AsyBim {
}
*/
}
return new AsyncResult<>(null);
}
@Async("bimExecutor")
public void asynDeleteProgressTask(String floor, String major) {
public Future<Object> asyncDeleteProgressTask(BIMProgressTaskRqBody body) {
if (StringUtils.isNotBlank(bimProgressIpPort)) {
String url = bimProgressIpPort + "/Other/DeleteProgress?floor=" + floor + "&major=" + major;
String floor = body.getFloor();
String major = body.getMajor();
String district = body.getDistrict();
String building = body.getBuilding();
Integer projectId = body.getProjectId();
String url = bimProgressIpPort + "/Other/DeleteProgress?floor=" + floor + "&major=" + major + "&projectId=" + projectId;
if (StringUtils.isNotBlank(district)) {
url += "&district=" + district;
}
if (StringUtils.isNotBlank(building)) {
url += "&building=" + building;
}
log.info("http调用bim删除进度url{}", url);
String rs = HttpUtil.post(url, new HashMap<>());
log.info("http调用bim删除进度结果{}", rs);
@ -82,5 +96,6 @@ public class AsyBim {
}
*/
}
return new AsyncResult<>(null);
}
}

View File

@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -24,6 +25,7 @@ import com.zhgd.xmgl.modules.project.entity.BIMProgressTaskRqBody;
import com.zhgd.xmgl.modules.project.entity.ProgressTask;
import com.zhgd.xmgl.modules.project.entity.dto.ProgressTaskPredecessorDTO;
import com.zhgd.xmgl.modules.project.entity.vo.ActualProgressVO;
import com.zhgd.xmgl.modules.project.enums.LevelNameEnum;
import com.zhgd.xmgl.modules.project.mapper.ProgressTaskMapper;
import com.zhgd.xmgl.modules.project.service.ProgressTaskService;
import com.zhgd.xmgl.util.ProfileJudgeUtil;
@ -43,10 +45,13 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 进度甘特图(ProgressTask)表服务实现类
@ -96,64 +101,110 @@ public class ProgressTaskServiceImpl extends ServiceImpl<ProgressTaskMapper, Pro
log.info("原progressTasks{}", JSON.toJSONString(progressTasks));
progressTaskMapper.delete(Wrappers.lambdaQuery(ProgressTask.class).eq(ProgressTask::getProjectSn, projectSn));
if (isBIMAsyncEnable()) {
//调用BIM同步删除数据
List<BIMProgressTaskRqBody> deleteList = getBimTasksByProgressTasks(progressTasks);
if (CollUtil.isNotEmpty(deleteList)) {
for (BIMProgressTaskRqBody body : deleteList) {
asyBim.asynDeleteProgressTask(body.getFloor(), body.getMajor());
Collection<ProgressTask> progressTaskList = analysisMpp(mppFile, projectSn, createUserId);
log.info("importData的新增数据{}", progressTaskList);
checkBIMLevelName(progressTaskList);
List<Future<Object>> futures = deleteBimTasksIfEnable(progressTasks);
if (CollUtil.isNotEmpty(progressTaskList)) {
progressTaskMapper.insertBatch(progressTaskList);
waitBIMDone(futures);
addBimTasksIfEnable(progressTaskList.stream().collect(Collectors.toList()));
}
}
private void waitBIMDone(List<Future<Object>> futures) {
for (Future<Object> future : futures) {
try {
future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
Collection<ProgressTask> progressTaskList = analysisMpp(mppFile, projectSn, createUserId);
log.info("importData的新增数据{}", progressTaskList);
if (CollUtil.isNotEmpty(progressTaskList)) {
progressTaskMapper.insertBatch(progressTaskList);
private void checkBIMLevelName(Collection<ProgressTask> progressTasks) {
if (isBIMAsyncEnable()) {
List<String> levelNames = Stream.of(LevelNameEnum.values()).map(LevelNameEnum::getLevelName).collect(Collectors.toList());
if (!progressTasks.stream().allMatch(e -> StringUtils.isNotBlank(e.getLevelName()) && levelNames.contains(e.getLevelName()))) {
throw new OpenAlertException("层级名称为空或不在(区、栋、专业、层)之中");
}
}
}
private void addBimTasksIfEnable(List<ProgressTask> progressTasks) {
if (isBIMAsyncEnable()) {
//调用BIM同步添加数据
List<BIMProgressTaskRqBody> bimProgressTaskRqBodies = getBimTasksByProgressTasks(progressTasks);
List<BIMProgressTaskRqBody> bimProgressTaskRqBodies = buildBimTasksByProgressTasks(progressTasks);
if (CollUtil.isNotEmpty(bimProgressTaskRqBodies)) {
for (BIMProgressTaskRqBody bimProgressTaskRqBody : bimProgressTaskRqBodies) {
asyBim.asynAddProgressTask(bimProgressTaskRqBody);
asyBim.asyncAddProgressTask(bimProgressTaskRqBody);
}
}
}
}
private List<Future<Object>> deleteBimTasksIfEnable(List<ProgressTask> progressTasks) {
ArrayList<Future<Object>> futures = new ArrayList<>();
if (isBIMAsyncEnable()) {
//调用BIM同步删除数据
List<BIMProgressTaskRqBody> deleteList = buildBimTasksByProgressTasks(progressTasks);
if (CollUtil.isNotEmpty(deleteList)) {
for (BIMProgressTaskRqBody body : deleteList) {
futures.add(asyBim.asyncDeleteProgressTask(body));
}
}
}
return futures;
}
/**
* 计算BIM同步添加数据
* 构建BIM同步的数据
*
* @param progressTasks
* @return
*/
private List<BIMProgressTaskRqBody> getBimTasksByProgressTasks(List<ProgressTask> progressTasks) {
private List<BIMProgressTaskRqBody> buildBimTasksByProgressTasks(List<ProgressTask> progressTasks) {
ArrayList<BIMProgressTaskRqBody> bimProgressTaskRqBodies = new ArrayList<>();
Map<Long, ProgressTask> topIdMap = progressTasks.stream().filter(progressTask -> progressTask.getParentId().equals(0L))
.collect(Collectors.toMap(ProgressTask::getId, progressTask -> progressTask));
if (CollUtil.isNotEmpty(topIdMap)) {
Map<Long, ProgressTask> idMap = progressTasks.stream().collect(Collectors.toMap(ProgressTask::getId, progressTask -> progressTask));
for (ProgressTask progressTask : progressTasks) {
ProgressTask pt = topIdMap.get(progressTask.getParentId());
Matcher matcher = floorPattern.matcher(progressTask.getTaskName());
if (matcher.find()) {
BIMProgressTaskRqBody body = buildBimTask(progressTask, pt.getTaskName(), matcher.group());
BIMProgressTaskRqBody body = buildBimTask(progressTask,
getLevelContent(progressTask, idMap, LevelNameEnum.major.getLevelName()),
matcher.group(),
getLevelContent(progressTask, idMap, LevelNameEnum.district.getLevelName()),
getLevelContent(progressTask, idMap, LevelNameEnum.building.getLevelName()));
bimProgressTaskRqBodies.add(body);
} else {
/*
只有 地下室地板 是不带楼层的那么我传给你
major结构施工floor地下室地板
*/
if (progressTask.getTaskName().contains(basement)) {
BIMProgressTaskRqBody body = buildBimTask(progressTask, "结构施工", basement);
} else if (progressTask.getTaskName().contains(basement)) {
//只有 地下室地板 是不带楼层的那么我传给你major结构施工floor地下室地板
BIMProgressTaskRqBody body = buildBimTask(progressTask,
"结构施工",
basement,
getLevelContent(progressTask, idMap, LevelNameEnum.district.getLevelName()),
getLevelContent(progressTask, idMap, LevelNameEnum.building.getLevelName()));
bimProgressTaskRqBodies.add(body);
}
}
}
}
return bimProgressTaskRqBodies;
}
private String getLevelContent(ProgressTask progressTask, Map<Long, ProgressTask> idMap, String levelName) {
while (progressTask != null) {
if (Objects.equals(progressTask.getLevelName(), levelName)) {
return progressTask.getTaskName();
}
progressTask = idMap.get(progressTask.getParentId());
}
return null;
}
/**
* 获取bim的添加进度管理的md5签名
*
@ -308,6 +359,8 @@ public class ProgressTaskServiceImpl extends ServiceImpl<ProgressTaskMapper, Pro
}
// 负责人名称
String dutyUserName = task.getText(1);
//层级名称专业
progressTask.setLevelName(task.getText(3));
progressTask.setDutyUserName(dutyUserName);
userNameSet.add(dutyUserName);
@ -365,6 +418,15 @@ public class ProgressTaskServiceImpl extends ServiceImpl<ProgressTaskMapper, Pro
throw new RuntimeException("progressTask不存在");
}
List<ProgressTask> progressTasks = progressTaskMapper.selectList(new LambdaQueryWrapper<ProgressTask>().eq(ProgressTask::getProjectSn, progressTask.getProjectSn()));
if (isBIMAsyncEnable()) {
try {
//同步数据到bim删除bim
List<ProgressTask> allList = progressTaskMapper.selectList(new LambdaQueryWrapper<ProgressTask>().eq(ProgressTask::getProjectSn, progressTask.getProjectSn()));
deleteBimTaskIfExistInList(allList, id);
} catch (Exception e) {
log.error("err:", e);
}
}
List<ProgressTask> childrenList = getChildrenAsList(progressTask, progressTasks);
childrenList.add(progressTask);
@ -405,23 +467,16 @@ public class ProgressTaskServiceImpl extends ServiceImpl<ProgressTaskMapper, Pro
progressTaskMapper.updateById(progressTask);
if (isBIMAsyncEnable()) {
//同步数据到bim先删除再更新bim
if (progressTask.getParentId() != 0) {
ProgressTask top = progressTaskMapper.selectById(progressTask.getParentId());
String floorName = getFloorName(old);
if (floorName != null) {
asyBim.asynDeleteProgressTask(floorName, top.getTaskName());
}
String newFloorName = getFloorName(progressTask);
if (newFloorName != null) {
BIMProgressTaskRqBody body = buildBimTask(progressTask, top.getTaskName(), newFloorName);
asyBim.asynAddProgressTask(body);
} else {
if (progressTask.getTaskName().contains(basement)) {
BIMProgressTaskRqBody body = buildBimTask(progressTask, "结构施工", basement);
asyBim.asynAddProgressTask(body);
}
}
try {
//同步数据到bim先删除再添加bim
List<ProgressTask> allList = progressTaskMapper.selectList(new LambdaQueryWrapper<ProgressTask>().eq(ProgressTask::getProjectSn, old.getProjectSn()));
List<ProgressTask> oldList = ObjectUtil.cloneByStream(allList);
oldList.stream().filter(e -> e.getId().equals(old.getId())).forEach(e -> e.setTaskName(old.getTaskName()));
List<Future<Object>> futures = deleteBimTaskIfExistInList(oldList, old.getId());
waitBIMDone(futures);
addBimTaskIfExistInList(allList, progressTask.getId());
} catch (Exception e) {
log.error("err:", e);
}
}
@ -437,23 +492,18 @@ public class ProgressTaskServiceImpl extends ServiceImpl<ProgressTaskMapper, Pro
return profileJudgeUtil.isZjsj() || profileJudgeUtil.isShahu();
}
/**
* 构建bim的task对象
*
* @param progressTask
* @param major
* @param newFloorName
* @return
*/
private BIMProgressTaskRqBody buildBimTask(ProgressTask progressTask, String major, String newFloorName) {
private BIMProgressTaskRqBody buildBimTask(ProgressTask progressTask, String major, String floorName, String district, String building) {
BIMProgressTaskRqBody body = new BIMProgressTaskRqBody();
body.setFloor(convertFloorName(newFloorName));
body.setFloor(convertFloorName(floorName));
body.setMajor(major);
body.setPlanStartTime(getDateFormatForBimAddProgressTask(progressTask.getStartDate()));
body.setPlanFinishTime(getDateFormatForBimAddProgressTask(progressTask.getFinishDate()));
body.setActualStartTime(getDateFormatForBimAddProgressTask(progressTask.getActualStartDate()));
body.setActualFinishTime(getDateFormatForBimAddProgressTask(progressTask.getActualFinishDate()));
body.setStatus(convertToBimProgressTaskStatus(progressTask));
body.setDistrict(district);
body.setBuilding(building);
body.setProgressTaskId(progressTask.getId());
if (profileJudgeUtil.isZjsj()) {
body.setProjectId(1);
} else if (profileJudgeUtil.isShahu()) {
@ -517,21 +567,34 @@ public class ProgressTaskServiceImpl extends ServiceImpl<ProgressTaskMapper, Pro
progressTaskMapper.insert(progressTask);
sanjiangDataCall.sendAddProgressTask(progressTask);
if (isBIMAsyncEnable()) {
try {
//同步数据到bim先删除再更新bim
List<ProgressTask> allList = progressTaskMapper.selectList(new LambdaQueryWrapper<ProgressTask>().eq(ProgressTask::getProjectSn, progressTask.getProjectSn()));
addBimTaskIfExistInList(allList, progressTask.getId());
} catch (Exception e) {
log.error("err:", e);
}
}
}
private String getFloorName(ProgressTask progressTask) {
String name = null;
Matcher matcher = floorPattern.matcher(progressTask.getTaskName());
if (matcher.find()) {
name = convertFloorName(matcher.group());
} else {
if (StringUtils.isNotBlank(progressTask.getTaskName())) {
if (progressTask.getTaskName().contains(basement)) {
name = basement;
private List<Future<Object>> deleteBimTaskIfExistInList(List<ProgressTask> allList, Long id) {
List<BIMProgressTaskRqBody> bimProgressTaskRqBodies = buildBimTasksByProgressTasks(allList);
ArrayList<Future<Object>> futures = new ArrayList<>();
bimProgressTaskRqBodies.stream().filter(e -> e.getProgressTaskId().equals(id))
.forEach(e -> {
futures.add(asyBim.asyncDeleteProgressTask(e));
});
return futures;
}
}
}
return name;
private void addBimTaskIfExistInList(List<ProgressTask> allList, Long id) {
List<BIMProgressTaskRqBody> bimProgressTaskRqBodies = buildBimTasksByProgressTasks(allList);
bimProgressTaskRqBodies.stream().filter(e -> e.getProgressTaskId().equals(id))
.forEach(e -> {
asyBim.asyncAddProgressTask(e);
});
}
@ -693,14 +756,14 @@ public class ProgressTaskServiceImpl extends ServiceImpl<ProgressTaskMapper, Pro
public void autoTaskUpdateForBim() {
if (isBIMAsyncEnable()) {
List<ProgressTask> progressTasks = progressTaskMapper.selectList(new LambdaQueryWrapper<>());
List<BIMProgressTaskRqBody> bimTasksByProgressTasks = getBimTasksByProgressTasks(progressTasks);
List<BIMProgressTaskRqBody> bimTasksByProgressTasks = buildBimTasksByProgressTasks(progressTasks);
if (CollUtil.isNotEmpty(bimTasksByProgressTasks)) {
for (BIMProgressTaskRqBody body : bimTasksByProgressTasks) {
//0未开始不同步其他的全部同步
//0未开始 ,1进行中2已完成3已逾期
Integer status = body.getStatus();
if (!Objects.equals(status, 0)) {
asyBim.asynAddProgressTask(body);
asyBim.asyncAddProgressTask(body);
}
}
}

View File

@ -129,10 +129,6 @@ public class TckwWireRopeInspectionRecord implements Serializable {
@ApiModelProperty(value = "远程设备id")
private Long remoteId;
@ApiModelProperty(value = "报警信息")
@TableField(exist = false)
private String alarmInfo;
@ApiModelProperty(value = "钢丝绳检测损伤记录列表")
@TableField(exist = false)
private List<TckwWireRopeInspectionDamageRecord> damageRecordList;