@@ -0,0 +1,142 @@ | |||
package com.ningdatech.pmapi.scheduler.listener; | |||
import cn.hutool.core.collection.CollUtil; | |||
import com.alibaba.fastjson.JSON; | |||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
import com.ningdatech.pmapi.common.constant.BizConst; | |||
import com.ningdatech.pmapi.common.helper.UserInfoHelper; | |||
import com.ningdatech.pmapi.projectlib.enumeration.InstTypeEnum; | |||
import com.ningdatech.pmapi.projectlib.model.entity.Project; | |||
import com.ningdatech.pmapi.projectlib.model.entity.ProjectInst; | |||
import com.ningdatech.pmapi.projectlib.service.IProjectInstService; | |||
import com.ningdatech.pmapi.projectlib.service.IProjectService; | |||
import com.ningdatech.pmapi.sys.model.entity.WflowEarlyWarningRecords; | |||
import com.ningdatech.pmapi.sys.service.IEarlyWarningRecordsService; | |||
import com.ningdatech.pmapi.user.security.auth.model.UserFullInfoDTO; | |||
import com.wflow.enums.WarningRuleTypeEnum; | |||
import com.wflow.workflow.notify.event.EarlyWarningEvent; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.flowable.engine.HistoryService; | |||
import org.flowable.engine.history.HistoricActivityInstance; | |||
import org.flowable.engine.history.HistoricProcessInstance; | |||
import org.springframework.context.event.EventListener; | |||
import org.springframework.scheduling.annotation.Async; | |||
import org.springframework.stereotype.Component; | |||
import java.time.LocalDateTime; | |||
import java.time.ZoneId; | |||
import java.util.List; | |||
import java.util.Objects; | |||
/** | |||
* 预警规则触发 | |||
* | |||
* @author ZPF | |||
* @return | |||
* @since 2023/08/03 14:19 | |||
*/ | |||
@Slf4j | |||
@Component | |||
@RequiredArgsConstructor | |||
public class EarlyWarningListener { | |||
private final HistoryService historyService; | |||
private final IProjectInstService projectInstService; | |||
private final IProjectService projectService; | |||
private final IEarlyWarningRecordsService earlyWarningRecordsService; | |||
private final UserInfoHelper userInfoHelper; | |||
@Async | |||
@EventListener | |||
public void onApplicationEvent(EarlyWarningEvent event) { | |||
log.info("进入预警规则触发的 事件监听!"); | |||
log.info("event:{}", JSON.toJSONString(event)); | |||
String nodeId = event.getNodeId(); | |||
Integer timeout = event.getTimeout(); | |||
String noticeMethod = event.getNoticeMethod(); | |||
String noticeContent = event.getNoticeContent(); | |||
//1.根据nodeId 查询到 node 去查找 未完成 项目实例关系表 找到实例 | |||
List<HistoricActivityInstance> hais = historyService.createHistoricActivityInstanceQuery() | |||
.activityId(nodeId) | |||
.unfinished() | |||
.orderByHistoricActivityInstanceStartTime() | |||
.asc() | |||
.list(); | |||
if (CollUtil.isEmpty(hais)) { | |||
log.info("没有查到 历史实例"); | |||
return; | |||
} | |||
String instanceId = hais.get(0).getProcessInstanceId(); | |||
//查询当前未完成的此实例 | |||
HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery() | |||
.processInstanceId(instanceId) | |||
.unfinished() | |||
.singleResult(); | |||
if (Objects.isNull(instance)) { | |||
log.info("没有查到实例 或者 实例已经结束"); | |||
return; | |||
} | |||
//2.查到 此流程实例的 项目 | |||
ProjectInst pi = projectInstService.getOne(Wrappers.lambdaQuery(ProjectInst.class) | |||
.eq(ProjectInst::getInstCode, instanceId) | |||
.last(BizConst.LIMIT_1)); | |||
if (Objects.isNull(pi)) { | |||
log.info("没有查到实例项目关联信息"); | |||
return; | |||
} | |||
Long projectId = pi.getProjectId(); | |||
Project project = projectService.getById(projectId); | |||
if (Objects.isNull(project)) { | |||
log.info("没有查到该项目信息"); | |||
return; | |||
} | |||
for(HistoricActivityInstance hai : hais){ | |||
String assignee = hai.getAssignee(); | |||
UserFullInfoDTO user = userInfoHelper.getUserFullInfoByEmployeeCode(assignee); | |||
WflowEarlyWarningRecords records = new WflowEarlyWarningRecords(); | |||
records.setAreaCode(project.getAreaCode()); | |||
records.setBuildOrgCode(project.getBuildOrgCode()); | |||
records.setBuildOrgName(project.getBuildOrgName()); | |||
records.setCreateOn(LocalDateTime.now()); | |||
records.setWarningTime(LocalDateTime.now()); | |||
records.setInstStart(hai.getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); | |||
records.setInstType(pi.getInstType()); | |||
records.setNoticeMethod(noticeMethod); | |||
records.setNoticeContent(convertContent(noticeContent,project.getProjectName(),InstTypeEnum.getByCode(pi.getInstType()),timeout)); | |||
records.setProjectName(project.getProjectName()); | |||
records.setRuleType(WarningRuleTypeEnum.PROCESS_WARNING.getCode()); | |||
records.setWarningUsername(Objects.nonNull(user) ? user.getUsername() : StringUtils.EMPTY); | |||
records.setWarningEmployeecode(assignee); | |||
earlyWarningRecordsService.save(records); | |||
} | |||
} | |||
/** | |||
* 转换出 通知的内容 | |||
* @param noticeContent | |||
* @param projectName | |||
* @param byCode | |||
* @param timeout | |||
* @return | |||
*/ | |||
private String convertContent(String noticeContent, String projectName, InstTypeEnum instTypeEnum, Integer timeout) { | |||
noticeContent = noticeContent.replace("{projectName}",projectName) | |||
.replace("{flowType}",Objects.nonNull(instTypeEnum) ? instTypeEnum.getDesc() : "{flowType}") | |||
.replace("{time}",String.valueOf(timeout)); | |||
log.info("通知内容 :{}",noticeContent); | |||
return noticeContent; | |||
} | |||
} |
@@ -0,0 +1,17 @@ | |||
package com.ningdatech.pmapi.sys.mapper; | |||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||
import com.ningdatech.pmapi.sys.model.entity.WflowEarlyWarningRecords; | |||
import org.springframework.stereotype.Repository; | |||
/** | |||
* <p> | |||
* Mapper 接口 | |||
* </p> | |||
* | |||
* @author PoffyZhang | |||
*/ | |||
@Repository | |||
public interface EarlyWarningRecordsMapper extends BaseMapper<WflowEarlyWarningRecords> { | |||
} |
@@ -0,0 +1,108 @@ | |||
package com.ningdatech.pmapi.sys.model.entity; | |||
import com.baomidou.mybatisplus.annotation.IdType; | |||
import com.baomidou.mybatisplus.annotation.TableId; | |||
import com.baomidou.mybatisplus.annotation.TableName; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import lombok.NoArgsConstructor; | |||
import lombok.ToString; | |||
import lombok.experimental.Accessors; | |||
import java.io.Serializable; | |||
import java.time.LocalDateTime; | |||
/** | |||
* 实体类 | |||
* 角色分配 | |||
* 预警触发通知记录 | |||
* @author PoffyZhang | |||
*/ | |||
@Data | |||
@NoArgsConstructor | |||
@ToString(callSuper = true) | |||
@Accessors(chain = true) | |||
@TableName("wflow_early_warning_records") | |||
@ApiModel(value = "WflowEarlyWarningRecords", description = "预警触发通知记录") | |||
public class WflowEarlyWarningRecords implements Serializable { | |||
private static final long serialVersionUID = 1L; | |||
@ApiModelProperty(value = "id") | |||
@TableId(value = "id", type = IdType.AUTO) | |||
private Long id; | |||
/** | |||
* 区域CODE | |||
*/ | |||
@ApiModelProperty(value = "区域CODE") | |||
private String areaCode; | |||
/** | |||
* 项目名称 | |||
*/ | |||
@ApiModelProperty(value = "项目名称") | |||
private String projectName; | |||
/** | |||
* 流程类型 | |||
*/ | |||
@ApiModelProperty(value = "流程类型") | |||
private Integer instType; | |||
/** | |||
* 任务开始时间 | |||
*/ | |||
@ApiModelProperty(value = "任务开始时间") | |||
private LocalDateTime instStart; | |||
/** | |||
* 预警时间 | |||
*/ | |||
@ApiModelProperty(value = "预警时间") | |||
private LocalDateTime warningTime; | |||
/** | |||
* 通知人名 | |||
*/ | |||
@ApiModelProperty(value = "通知人名") | |||
private String warningUsername; | |||
/** | |||
* 预警员工号 | |||
*/ | |||
@ApiModelProperty(value = "预警员工号") | |||
private String warningEmployeecode; | |||
/** | |||
* 通知方式 | |||
*/ | |||
@ApiModelProperty(value = "通知方式 0浙政钉 1短信 逗号分隔") | |||
private String noticeMethod; | |||
/** | |||
* 通知内容 | |||
*/ | |||
@ApiModelProperty(value = "通知内容") | |||
private String noticeContent; | |||
/** | |||
* 申报单位 | |||
*/ | |||
@ApiModelProperty(value = "申报单位CODE") | |||
private String buildOrgCode; | |||
@ApiModelProperty(value = "申报单位") | |||
private String buildOrgName; | |||
/** | |||
* 规则 | |||
*/ | |||
@ApiModelProperty(value = "规则类型 1.流程预警规则 2.填报预警规则 3.实施监督") | |||
private Integer ruleType; | |||
private LocalDateTime createOn; | |||
} |
@@ -0,0 +1,106 @@ | |||
package com.ningdatech.pmapi.sys.model.vo; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import lombok.NoArgsConstructor; | |||
import lombok.ToString; | |||
import lombok.experimental.Accessors; | |||
import java.io.Serializable; | |||
import java.time.LocalDateTime; | |||
/** | |||
* 实体类 | |||
* 角色分配 | |||
* 预警触发通知记录 | |||
* @author PoffyZhang | |||
*/ | |||
@Data | |||
@NoArgsConstructor | |||
@ToString(callSuper = true) | |||
@Accessors(chain = true) | |||
@ApiModel(value = "WflowEarlyWarningRecords", description = "预警触发通知记录") | |||
public class WflowEarlyWarningRecordsVO implements Serializable { | |||
private static final long serialVersionUID = 1L; | |||
@ApiModelProperty(value = "id") | |||
private Long id; | |||
/** | |||
* 区域CODE | |||
*/ | |||
@ApiModelProperty(value = "区域CODE") | |||
private String areaCode; | |||
/** | |||
* 项目名称 | |||
*/ | |||
@ApiModelProperty(value = "项目名称") | |||
private String projectName; | |||
/** | |||
* 流程类型 | |||
*/ | |||
@ApiModelProperty(value = "流程类型") | |||
private Integer instType; | |||
/** | |||
* 任务开始时间 | |||
*/ | |||
@ApiModelProperty(value = "任务开始时间") | |||
private LocalDateTime instStart; | |||
/** | |||
* 预警时间 | |||
*/ | |||
@ApiModelProperty(value = "预警时间") | |||
private LocalDateTime warningTime; | |||
/** | |||
* 通知人名 | |||
*/ | |||
@ApiModelProperty(value = "通知人名") | |||
private String warningUsername; | |||
/** | |||
* 预警员工号 | |||
*/ | |||
@ApiModelProperty(value = "预警员工号") | |||
private String warningEmployeecode; | |||
/** | |||
* 通知方式 | |||
*/ | |||
@ApiModelProperty(value = "通知方式 0浙政钉 1短信 逗号分隔") | |||
private String noticeMethod; | |||
/** | |||
* 通知内容 | |||
*/ | |||
@ApiModelProperty(value = "通知内容") | |||
private String noticeContent; | |||
/** | |||
* 申报单位 | |||
*/ | |||
@ApiModelProperty(value = "申报单位CODE") | |||
private String buildOrgCode; | |||
@ApiModelProperty(value = "申报单位") | |||
private String buildOrgName; | |||
/** | |||
* 规则 | |||
*/ | |||
@ApiModelProperty(value = "规则类型 1.流程预警规则 2.填报预警规则 3.实施监督") | |||
private Integer ruleType; | |||
private LocalDateTime createOn; | |||
private String createBy; | |||
private LocalDateTime updateOn; | |||
private String updateBy; | |||
} |
@@ -0,0 +1,11 @@ | |||
package com.ningdatech.pmapi.sys.service; | |||
import com.baomidou.mybatisplus.extension.service.IService; | |||
import com.ningdatech.pmapi.sys.model.entity.WflowEarlyWarningRecords; | |||
/** | |||
* @author PoffyZhang | |||
*/ | |||
public interface IEarlyWarningRecordsService extends IService<WflowEarlyWarningRecords> { | |||
} |
@@ -0,0 +1,26 @@ | |||
package com.ningdatech.pmapi.sys.service.impl; | |||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |||
import com.ningdatech.pmapi.sys.mapper.EarlyWarningRecordsMapper; | |||
import com.ningdatech.pmapi.sys.model.entity.WflowEarlyWarningRecords; | |||
import com.ningdatech.pmapi.sys.service.IEarlyWarningRecordsService; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.stereotype.Service; | |||
/** | |||
* <p> | |||
* 业务实现类 | |||
* 菜单 | |||
* </p> | |||
* | |||
* @author ZPF | |||
*/ | |||
@Slf4j | |||
@Service | |||
@RequiredArgsConstructor | |||
public class EarlyWarningRecordsServiceImpl extends ServiceImpl<EarlyWarningRecordsMapper, WflowEarlyWarningRecords> | |||
implements IEarlyWarningRecordsService { | |||
} |