diff --git a/src/main/java/com/zhgd/xmgl/modules/project/entity/BIMProgressTaskRqBody.java b/src/main/java/com/zhgd/xmgl/modules/project/entity/BIMProgressTaskRqBody.java index 34ce0f874..549f23af7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/entity/BIMProgressTaskRqBody.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/entity/BIMProgressTaskRqBody.java @@ -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; + } diff --git a/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressTask.java b/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressTask.java index ffa864159..ed250dda2 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressTask.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressTask.java @@ -197,6 +197,9 @@ public class ProgressTask implements Serializable { @ApiModelProperty(value = "前置任务id列表,使用英文“,”分割") private String predecessorIds; + @ApiModelProperty(value = "层级名称(区、栋、专业、层)") + private String levelName; + /** * 子节点列表 */ diff --git a/src/main/java/com/zhgd/xmgl/modules/project/enums/LevelNameEnum.java b/src/main/java/com/zhgd/xmgl/modules/project/enums/LevelNameEnum.java new file mode 100644 index 000000000..560cc88aa --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/project/enums/LevelNameEnum.java @@ -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; + } +} diff --git a/src/main/java/com/zhgd/xmgl/modules/project/mapper/xml/ProgressTaskMapper.xml b/src/main/java/com/zhgd/xmgl/modules/project/mapper/xml/ProgressTaskMapper.xml index 7c0c78c5f..f953cb544 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/mapper/xml/ProgressTaskMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/project/mapper/xml/ProgressTaskMapper.xml @@ -3,19 +3,19 @@ insert into progress_task(id, project_sn, task_name, level, task_type_id, duration, parent_id, resource_name, - 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) + 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, level_name) values (#{entity.id}, #{entity.projectSn}, #{entity.taskName}, #{entity.level}, #{entity.taskTypeId}, - #{entity.duration}, - #{entity.parentId}, #{entity.resourceName}, #{entity.dutyUserId}, #{entity.dutyUserName}, - #{entity.progressRatio}, - #{entity.actualStartDate}, default, default, #{entity.createUserId}, - #{entity.status}, #{entity.fileUrl}, #{entity.remark}, #{entity.startDate}, #{entity.finishDate}, - #{entity.actualFinishDate}, #{entity.predecessorIds}) + #{entity.duration}, + #{entity.parentId}, #{entity.resourceName}, #{entity.dutyUserId}, #{entity.dutyUserName}, + #{entity.progressRatio}, + #{entity.actualStartDate}, default, default, #{entity.createUserId}, + #{entity.status}, #{entity.fileUrl}, #{entity.remark}, #{entity.startDate}, #{entity.finishDate}, + #{entity.actualFinishDate}, #{entity.predecessorIds}, #{entity.levelName}) diff --git a/src/main/java/com/zhgd/xmgl/modules/project/service/impl/AsyBim.java b/src/main/java/com/zhgd/xmgl/modules/project/service/impl/AsyBim.java index 4970585ad..7155f4201 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/service/impl/AsyBim.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/service/impl/AsyBim.java @@ -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 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 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); } } diff --git a/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProgressTaskServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProgressTaskServiceImpl.java index 2ae933161..09f742b22 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProgressTaskServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProgressTaskServiceImpl.java @@ -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 deleteList = getBimTasksByProgressTasks(progressTasks); - if (CollUtil.isNotEmpty(deleteList)) { - for (BIMProgressTaskRqBody body : deleteList) { - asyBim.asynDeleteProgressTask(body.getFloor(), body.getMajor()); - } - } - } - Collection progressTaskList = analysisMpp(mppFile, projectSn, createUserId); log.info("importData的新增数据:{}", progressTaskList); + + + checkBIMLevelName(progressTaskList); + List> futures = deleteBimTasksIfEnable(progressTasks); + if (CollUtil.isNotEmpty(progressTaskList)) { progressTaskMapper.insertBatch(progressTaskList); - if (isBIMAsyncEnable()) { - //调用BIM同步添加数据 - List bimProgressTaskRqBodies = getBimTasksByProgressTasks(progressTasks); - if (CollUtil.isNotEmpty(bimProgressTaskRqBodies)) { - for (BIMProgressTaskRqBody bimProgressTaskRqBody : bimProgressTaskRqBodies) { - asyBim.asynAddProgressTask(bimProgressTaskRqBody); - } + + waitBIMDone(futures); + addBimTasksIfEnable(progressTaskList.stream().collect(Collectors.toList())); + } + } + + private void waitBIMDone(List> futures) { + for (Future future : futures) { + try { + future.get(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + } + } + + private void checkBIMLevelName(Collection progressTasks) { + if (isBIMAsyncEnable()) { + List 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 progressTasks) { + if (isBIMAsyncEnable()) { + //调用BIM同步添加数据 + List bimProgressTaskRqBodies = buildBimTasksByProgressTasks(progressTasks); + if (CollUtil.isNotEmpty(bimProgressTaskRqBodies)) { + for (BIMProgressTaskRqBody bimProgressTaskRqBody : bimProgressTaskRqBodies) { + asyBim.asyncAddProgressTask(bimProgressTaskRqBody); } } } } + private List> deleteBimTasksIfEnable(List progressTasks) { + ArrayList> futures = new ArrayList<>(); + if (isBIMAsyncEnable()) { + //调用BIM同步删除数据 + List 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 getBimTasksByProgressTasks(List progressTasks) { + private List buildBimTasksByProgressTasks(List progressTasks) { ArrayList bimProgressTaskRqBodies = new ArrayList<>(); - Map topIdMap = progressTasks.stream().filter(progressTask -> progressTask.getParentId().equals(0L)) - .collect(Collectors.toMap(ProgressTask::getId, progressTask -> progressTask)); - if (CollUtil.isNotEmpty(topIdMap)) { - 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()); - bimProgressTaskRqBodies.add(body); - } else { - /* - 只有 地下室地板 是不带楼层的,那么我传给你: - major:结构施工,floor:地下室地板 - */ - if (progressTask.getTaskName().contains(basement)) { - BIMProgressTaskRqBody body = buildBimTask(progressTask, "结构施工", basement); - bimProgressTaskRqBodies.add(body); - } - } + Map idMap = progressTasks.stream().collect(Collectors.toMap(ProgressTask::getId, progressTask -> progressTask)); + for (ProgressTask progressTask : progressTasks) { + Matcher matcher = floorPattern.matcher(progressTask.getTaskName()); + if (matcher.find()) { + 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 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 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 progressTasks = progressTaskMapper.selectList(new LambdaQueryWrapper().eq(ProgressTask::getProjectSn, progressTask.getProjectSn())); + if (isBIMAsyncEnable()) { + try { + //同步数据到bim,删除bim + List allList = progressTaskMapper.selectList(new LambdaQueryWrapper().eq(ProgressTask::getProjectSn, progressTask.getProjectSn())); + deleteBimTaskIfExistInList(allList, id); + } catch (Exception e) { + log.error("err:", e); + } + } List childrenList = getChildrenAsList(progressTask, progressTasks); childrenList.add(progressTask); @@ -405,23 +467,16 @@ public class ProgressTaskServiceImpl extends ServiceImpl allList = progressTaskMapper.selectList(new LambdaQueryWrapper().eq(ProgressTask::getProjectSn, old.getProjectSn())); + List oldList = ObjectUtil.cloneByStream(allList); + oldList.stream().filter(e -> e.getId().equals(old.getId())).forEach(e -> e.setTaskName(old.getTaskName())); + List> 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 allList = progressTaskMapper.selectList(new LambdaQueryWrapper().eq(ProgressTask::getProjectSn, progressTask.getProjectSn())); + addBimTaskIfExistInList(allList, progressTask.getId()); + } catch (Exception e) { + log.error("err:", e); } } - return name; + } + + private List> deleteBimTaskIfExistInList(List allList, Long id) { + List bimProgressTaskRqBodies = buildBimTasksByProgressTasks(allList); + ArrayList> futures = new ArrayList<>(); + bimProgressTaskRqBodies.stream().filter(e -> e.getProgressTaskId().equals(id)) + .forEach(e -> { + futures.add(asyBim.asyncDeleteProgressTask(e)); + }); + return futures; + } + + private void addBimTaskIfExistInList(List allList, Long id) { + List 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 progressTasks = progressTaskMapper.selectList(new LambdaQueryWrapper<>()); - List bimTasksByProgressTasks = getBimTasksByProgressTasks(progressTasks); + List 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); } } } diff --git a/src/main/java/com/zhgd/xmgl/modules/tckw/entity/TckwWireRopeInspectionRecord.java b/src/main/java/com/zhgd/xmgl/modules/tckw/entity/TckwWireRopeInspectionRecord.java index 1b71665fb..9c47dbd70 100644 --- a/src/main/java/com/zhgd/xmgl/modules/tckw/entity/TckwWireRopeInspectionRecord.java +++ b/src/main/java/com/zhgd/xmgl/modules/tckw/entity/TckwWireRopeInspectionRecord.java @@ -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 damageRecordList; diff --git a/src/main/resources/template/甘特图上传模板.mpp b/src/main/resources/template/甘特图上传模板.mpp index d0b678e9b..2a27482db 100644 Binary files a/src/main/resources/template/甘特图上传模板.mpp and b/src/main/resources/template/甘特图上传模板.mpp differ