同步BIM协同管理平台进度信息接口

This commit is contained in:
Administrator 2023-03-08 15:41:17 +08:00
parent 567a611f44
commit e382e9bd88
4 changed files with 275 additions and 7 deletions

View File

@ -304,4 +304,23 @@ public class AsyncConfig {
executor.initialize();
return executor;
}
@Bean("bimExecutor")
public ThreadPoolTaskExecutor bimExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
/** 核心线程数(默认线程数) */
executor.setCorePoolSize(corePoolSize);
/** 最大线程数 */
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(2000);
/** 允许线程空闲时间(单位:默认为秒) */
executor.setKeepAliveSeconds(60);
/** 线程池名前缀 */
executor.setThreadNamePrefix("bimExecutor-");
// 线程池对拒绝任务的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
}

View File

@ -0,0 +1,45 @@
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 {
/**
* floor String 楼层-->例如"floor": "B1"
*/
private String floor;
/**
* major String 专业-->例如"major": "结构"
*/
private String major;
/**
* planStartTime Date 计划开始时间-->例如"planStartTime": "2023-02-27 06:42:46"
*/
private String planStartTime;
/**
* planFinishTime Date 计划完成时间-->例如"planFinishTime": "2023-02-27 06:42:46"
*/
private String planFinishTime;
/**
* actualStartTime Date 实际开始时间-->例如"actualStartTime": "2023-02-27 06:42:46"
*/
private String actualStartTime;
/**
* actualFinishTime Date 实际完成时间-->例如"actualFinishTime": "2023-02-27 06:42:46"
*/
private String actualFinishTime;
/**
* status Integer 当前状态-->例如"status": 2(0-未开始1-已开始2-已结束3-已滞后)
*/
private Integer status;
/**
* sign String 校验码-->例如"sign": "842e133f81eb3506f60877652000a9fa"
*/
private String sign;
}

View File

@ -0,0 +1,80 @@
package com.zhgd.xmgl.modules.project.service.impl;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.zhgd.xmgl.modules.project.entity.BIMProgressTaskRqBody;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.HashMap;
/**
* 异步调用bim
*/
@Component
@Slf4j
public class AsyBim {
@Async("bimExecutor")
public void asynAddProgressTask(BIMProgressTaskRqBody bimProgressTaskRqBody) {
String url = "http://47.105.67.193:8086/Other/SaveProgress";
String body = JSON.toJSONString(bimProgressTaskRqBody);
log.info("http调用bim保存进度url{},body{}", url, body);
String rs = HttpUtil.post(url, body);
log.info("http调用bim保存进度结果{}", rs);
/*
结果
{
    "code": 200,
    "message": "操作成功",
  "data": {
        "id": null,
        "floor": "B1",
 "major": "结构",
        "planStartTime": "2023-02-27 06:42:46",
        "planFinishTime": "2023-02-27 06:42:46",
        "actualStartTime": "2023-02-27 06:42:46",
        "actualFinishTime": "2023-02-27 06:42:46",
 "status": 2,
        "sign": "1c9a43792523e78e5f0c015f6f67c164"
    }
}
{
    "code": 500,
    "message": "校验码不正确",
  "data": {
        null
    }
}
*/
}
@Async("bimExecutor")
public void asynDeleteProgressTask(String floor, String major) {
String url = "http://47.105.67.193:8086/Other/DeleteProgress?floor=" + floor + "&major=" + major;
log.info("http调用bim删除进度url{}", url);
String rs = HttpUtil.post(url, new HashMap<>());
log.info("http调用bim删除进度结果{}", rs);
/*
结果
{
    "code": 200,
    "message": "操作成功",
   "data": 1 
}
{
    "code": 500,
    "message": "操作失败",
   "data": 1
}
*/
}
}

View File

@ -5,14 +5,17 @@ import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gexin.fastjson.JSON;
import com.zhgd.jeecg.common.execption.ExistException;
import com.zhgd.xmgl.modules.basicdata.entity.SystemUser;
import com.zhgd.xmgl.modules.basicdata.mapper.SystemUserMapper;
import com.zhgd.xmgl.modules.basicdata.service.UploadFileService;
import com.zhgd.xmgl.modules.project.constants.ProgressTaskConstant;
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;
@ -33,6 +36,8 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.*;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@ -57,20 +62,106 @@ public class ProgressTaskServiceImpl extends ServiceImpl<ProgressTaskMapper, Pro
@Value("${basePath}")
private String basePath;
@Autowired
private AsyBim asyBim;
/**
* 匹配楼层正则
*/
public Pattern floorPattern = Pattern.compile("[-]?\\d+F");
@Override
@Transactional(rollbackFor = Exception.class)
public void importData(MultipartFile mppFile, String projectSn, Long createUserId) {
log.info("用户id{}执行上传mpp文件操作", createUserId);
// 删除之前的数据 需要前端确认是否删除 否则安全性较差
List<ProgressTask> progressTasks = progressTaskMapper.selectList(Wrappers.lambdaQuery(ProgressTask.class).eq(ProgressTask::getProjectSn, projectSn));
log.info("原progressTasks{}", JSON.toJSONString(progressTasks));
progressTaskMapper.delete(Wrappers.lambdaQuery(ProgressTask.class).eq(ProgressTask::getProjectSn, projectSn));
//调用BIM同步删除数据
List<BIMProgressTaskRqBody> deleteList = getProgressTaskRqBodyData(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);
if (CollUtil.isNotEmpty(progressTaskList)) {
progressTaskMapper.insertBatch(progressTaskList);
//调用BIM同步添加数据
List<BIMProgressTaskRqBody> bimProgressTaskRqBodies = getProgressTaskRqBodyData(progressTasks);
if (CollUtil.isNotEmpty(bimProgressTaskRqBodies)) {
for (BIMProgressTaskRqBody bimProgressTaskRqBody : bimProgressTaskRqBodies) {
asyBim.asynAddProgressTask(bimProgressTaskRqBody);
}
}
}
}
/**
* 计算BIM同步添加数据
*
* @param progressTasks
* @return
*/
private List<BIMProgressTaskRqBody> getProgressTaskRqBodyData(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)) {
for (ProgressTask progressTask : progressTasks) {
ProgressTask pt = topIdMap.get(progressTask.getParentId());
Matcher matcher = floorPattern.matcher(progressTask.getTaskName());
if (matcher.find()) {
BIMProgressTaskRqBody body = new BIMProgressTaskRqBody();
body.setFloor(matcher.group());
body.setMajor(pt.getTaskName());
body.setPlanStartTime(getDateFormatForBimAddProgressTask(progressTask.getStartDate()));
body.setPlanFinishTime(getDateFormatForBimAddProgressTask(progressTask.getFinishDate()));
body.setActualStartTime(getDateFormatForBimAddProgressTask(progressTask.getActualStartDate()));
body.setActualFinishTime(getDateFormatForBimAddProgressTask(progressTask.getActualFinishDate()));
body.setStatus(progressTask.getStatus());
String sign = getBimProgressTaskRqBodyMd5Sign(body);
body.setSign(sign);
bimProgressTaskRqBodies.add(body);
}
}
}
return bimProgressTaskRqBodies;
}
/**
* 获取bim的添加进度管理的md5签名
*
* @param body
* @return
*/
private String getBimProgressTaskRqBodyMd5Sign(BIMProgressTaskRqBody body) {
String str = "floor=" + body.getFloor() +
"&major=" + body.getMajor() +
"&planStartTime=" + body.getPlanStartTime() +
"&planFinishTime=" + body.getPlanFinishTime() +
"&actualStartTime=" + body.getActualStartTime() +
"&actualFinishTime=" + body.getActualFinishTime() +
"&status=" + body.getStatus() +
"&salt=%%jh9jh&*jh45&&^%^^hjjh5686ghhgghHGHGHJ9889@##$--==-uiiuhj";
System.out.println(str);
String md5 = SecureUtil.md5(str);
return md5;
}
/**
* 获取bim的添加进度管理的格式的日期
*
* @param date
* @return
*/
private String getDateFormatForBimAddProgressTask(Date date) {
return DateUtil.format(date, "yyyy-MM-dd HH:mm:ss");
}
/**
* 解析mpp文件
@ -254,6 +345,40 @@ public class ProgressTaskServiceImpl extends ServiceImpl<ProgressTaskMapper, Pro
return progressTaskMapper.getDetailsById(id);
}
@Override
public void updateProgressTask(ProgressTask progressTask) {
ProgressTask old = progressTaskMapper.selectById(progressTask.getId());
log.info("old的ProgressTask{}", JSON.toJSONString(old));
// 前置任务循环引用校验赋值对应的负责人名称
checkSaveParam(progressTask);
predecessorIdsVerification(progressTask);
setDutyUserName(progressTask);
progressTaskMapper.updateById(progressTask);
//同步数据到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 = new BIMProgressTaskRqBody();
body.setFloor(newFloorName);
body.setMajor(top.getTaskName());
body.setPlanStartTime(getDateFormatForBimAddProgressTask(progressTask.getStartDate()));
body.setPlanFinishTime(getDateFormatForBimAddProgressTask(progressTask.getFinishDate()));
body.setActualStartTime(getDateFormatForBimAddProgressTask(progressTask.getActualStartDate()));
body.setActualFinishTime(getDateFormatForBimAddProgressTask(progressTask.getActualFinishDate()));
body.setStatus(progressTask.getStatus());
String sign = getBimProgressTaskRqBodyMd5Sign(body);
body.setSign(sign);
asyBim.asynAddProgressTask(body);
}
}
}
@Override
public void addProgressTask(ProgressTask progressTask) {
checkSaveParam(progressTask);
@ -261,13 +386,12 @@ public class ProgressTaskServiceImpl extends ServiceImpl<ProgressTaskMapper, Pro
progressTaskMapper.insert(progressTask);
}
@Override
public void updateProgressTask(ProgressTask progressTask) {
// 前置任务循环引用校验赋值对应的负责人名称
checkSaveParam(progressTask);
predecessorIdsVerification(progressTask);
setDutyUserName(progressTask);
progressTaskMapper.updateById(progressTask);
private String getFloorName(ProgressTask progressTask) {
Matcher matcher = floorPattern.matcher(progressTask.getTaskName());
if (matcher.find()) {
return matcher.group();
}
return null;
}