From 1728d185bde00ade41912b38d9d035bbea2e5856 Mon Sep 17 00:00:00 2001 From: guo Date: Mon, 24 Jul 2023 17:18:06 +0800 Subject: [PATCH] =?UTF-8?q?bim=E5=90=8C=E6=AD=A5=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=B1=82=E7=BA=A7=E5=90=8D=E7=A7=B0=EF=BC=88=E5=8C=BA=E3=80=81?= =?UTF-8?q?=E6=A0=8B=E3=80=81=E4=B8=93=E4=B8=9A=E3=80=81=E5=B1=82=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/entity/BIMProgressTaskRqBody.java | 13 +- .../modules/project/entity/ProgressTask.java | 3 + .../modules/project/enums/LevelNameEnum.java | 18 ++ .../project/mapper/xml/ProgressTaskMapper.xml | 20 +- .../modules/project/service/impl/AsyBim.java | 21 +- .../service/impl/ProgressTaskServiceImpl.java | 221 +++++++++++------- .../entity/TckwWireRopeInspectionRecord.java | 4 - .../resources/template/甘特图上传模板.mpp | Bin 261120 -> 264704 bytes 8 files changed, 201 insertions(+), 99 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/modules/project/enums/LevelNameEnum.java 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 d0b678e9b6493b81fef4ded2a729ee93d39beb4b..2a27482db36c7021855547e0c01565f95578d855 100644 GIT binary patch delta 1358 zcmZ`(YfPI}7(VZJzOOefEzl_#Gs`f@1_-fi0iv-oV#aSBz^hNC*m8qBzGFfDia3O#=HgWCrD)bb0_c4I+jR!w3f=6|$G{+XtYpP?6Ckti=IdAbi0AH7W@3haR{BmiMtl0a2?s zI#V{W$Q!E-Gk~7RAJ1a5Kv8%Di5-PzRptPhx4a84OBvh3KK~JV_+MT)qv&#t8-rLa zV4wM6o2m}qP$#ihm!UBhfOn{rYh+^|L4f&|VV8CeU#lUOorK+6f-T-xNH=!Wj~(?B zH}Mb`vEy?DR~u=;To3wf=#7v8w7W3p#>~+SyBniouN&dPtPL#}a%>p2W6Xh;3*&C& z9nNHgZOd?ni4&)3FV1c(K0NA5wd<^=*3tp*q36jkPfyS-K(Sc19t5-5fYwf8DOd37 zOlUt7EDN5u64GS*;#l7P#Hc3SxDRS``k=PR`ji!Fn`~MZ`d)gD8G4|cU3?E@Hg1Qf zS?>yb%1m#=6Fd+EtE|)Gn8o!p74Tm}5HI1bcDhIAGjW)sd@c?%k3BB|Tf6`r-uMw4 zskSCNm)buWYIoSkSnnZwveR_Z-I>_8*+K=WBiji!f_*yi{r~Cv|Ju&7_md{nn*-;+ zoAhPoK8VxWxS^I8vIDFlkJCnwegvs5JW5<)KMvhNvK+oN4@J3>zL+N#U{xrB|8gB> zG$Jx~1I|OpS;agDppDJlga?X{e42lA3l1tz3ONc_h3h$N@$z7fP!BI#fv@u^j*cy^ zfyp2tZ(Z=jFwu_1!9NSDJTNWw&PuL&9&eUJ5E?~)`ntZ0cNxzHTrK<(Hax86I2JG|%81n#a(Jd7#f9(=Ii=$|c{6rO2GY&aI zJ=?i|nRY2k11itRN`C`~(8Ya-{DGSK-46!Yr*5Up`6aDq^+{@CRa2mm1)JTTgso@%8Xx~^%H9qtU3r??D$vIC>z3S9%gz(?}$Thz`q-PaYz6F delta 818 zcmc(d-%C_M6vyW~bMJMvt^MI*_ENi15T#fd2~l)WAM(i_VSoJ+GR-90Ns@lT%qfS>Y4 zS8FI_f+%I?niHn!+Dlq%^?3svhBe~*^BLTFviLeExBWywxV9KkrpH8~N)Jz1B+ zp=d*)dRv1!uWnEyF01O%46erNQDUG#Eu6)3m|ieu!x*wYvxb?et?1Y6x~bXwg{#=f zwktR3rf}jMDvj(53{`aj2YEI&W#3cOs_)I{*YnaIyE$XSF4@z9&D}G?Otj*>;AxL+ zx`I|^&WNP0k{$5zyztRLlD*%fY+6&*?qz|Y=o)JH01BAVhNgB zXcNDHDfuldb_CjK%S&7*oWu~ZmPiu$#JD^V5vB5YMELmbJ@QgSlsIB#qc1Zl2#F9X X5*?yEm^}x&ym^Tkk@j>iiH&~&5W5b!