Browse Source

[feat]

1、开放启用工作流方法,提供预警创建时调用方法启动
2、增加工作流处置处理扩展类,灵活处置,针对不同类型可以对相应的预警进行单独业务处理.
pull/1/head
杨威 4 months ago
parent
commit
bd992f2b18
  1. 6
      dk-api/api-bom/pom.xml
  2. 26
      dk-api/api-business/pom.xml
  3. 19
      dk-api/api-business/src/main/java/org/dromara/business/api/RemoteBusinessAlertService.java
  4. 5
      dk-api/api-workflow/pom.xml
  5. 21
      dk-api/api-workflow/src/main/java/org/dromara/workflow/api/RemoteWorkflowService.java
  6. 1
      dk-api/pom.xml
  7. 18
      dk-common/common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java
  8. 9
      dk-modules/business/pom.xml
  9. 62
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java
  10. 30
      dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java
  11. 45
      dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java
  12. 15
      dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java
  13. 29
      dk-modules/business/src/main/java/org/dromara/business/dubbo/RemoteBusinessAlertServiceImpl.java
  14. 9
      dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessAlertMapper.java
  15. 34
      dk-modules/business/src/main/java/org/dromara/business/service/BusinessAlertService.java
  16. 172
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java
  17. 79
      dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml
  18. 6
      dk-modules/workflow/pom.xml
  19. 34
      dk-modules/workflow/src/main/java/org/dromara/workflow/common/handler/FlwCommonHandler.java
  20. 5
      dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java
  21. 4
      dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java
  22. 18
      dk-modules/workflow/src/main/java/org/dromara/workflow/dubbo/RemoteWorkflowServiceImpl.java
  23. 60
      dk-modules/workflow/src/main/java/org/dromara/workflow/handler/FlwAlertHandler.java
  24. 12
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java
  25. 125
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java
  26. 6
      dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java

6
dk-api/api-bom/pom.xml

@ -41,6 +41,12 @@
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>api-business</artifactId>
<version>${revision}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
</project> </project>

26
dk-api/api-business/pom.xml

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>dk-api</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>api-business</artifactId>
<description>api-business业务接口模块
</description>
<dependencies>
<!-- RuoYi Common Core-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>common-core</artifactId>
</dependency>
</dependencies>
</project>

19
dk-api/api-business/src/main/java/org/dromara/business/api/RemoteBusinessAlertService.java

@ -0,0 +1,19 @@
package org.dromara.business.api;
/**
* 预警服务
*
* @author Lion Li
*/
public interface RemoteBusinessAlertService {
/**
* 更新此条预警审批时候的状态
* @param businessId 业务id(预警工单)
* @param flowStatus 流程状态
*/
void updateAlertStatus(String businessId, String flowStatus);
}

5
dk-api/api-workflow/pom.xml

@ -27,6 +27,11 @@
<artifactId>common-bus</artifactId> <artifactId>common-bus</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>api-system</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

21
dk-api/api-workflow/src/main/java/org/dromara/workflow/api/RemoteWorkflowService.java

@ -1,5 +1,6 @@
package org.dromara.workflow.api; package org.dromara.workflow.api;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.workflow.api.domain.RemoteCompleteTask; import org.dromara.workflow.api.domain.RemoteCompleteTask;
import org.dromara.workflow.api.domain.RemoteStartProcess; import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.dromara.workflow.api.domain.RemoteStartProcessReturn; import org.dromara.workflow.api.domain.RemoteStartProcessReturn;
@ -77,12 +78,26 @@ public interface RemoteWorkflowService {
*/ */
RemoteStartProcessReturn startWorkFlow(RemoteStartProcess startProcess); RemoteStartProcessReturn startWorkFlow(RemoteStartProcess startProcess);
// /**
// * 办理任务
// *
// * @param completeTask 参数
// * @return 结果
// */
// boolean completeTask(RemoteCompleteTask completeTask);
/** /**
* 办理任务 * 获取当前任务的所有办理人
* *
* @param completeTask 参数 * @param taskId 任务id
* @return 结果 * @return 结果
*/ */
boolean completeTask(RemoteCompleteTask completeTask); Map<Long, List<RemoteUserVo>> currentTaskAllUser(List<Long> taskId);
/**
* 审批前获取当前办理人办理时会校验的该权限集合
* 返回当前用户权限集合
*/
List<String> getPermissions();
} }

1
dk-api/pom.xml

@ -13,6 +13,7 @@
<module>api-system</module> <module>api-system</module>
<module>api-resource</module> <module>api-resource</module>
<module>api-workflow</module> <module>api-workflow</module>
<module>api-business</module>
</modules> </modules>
<artifactId>dk-api</artifactId> <artifactId>dk-api</artifactId>

18
dk-common/common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java

@ -8,6 +8,7 @@ import org.dromara.common.core.utils.StringUtils;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Optional;
/** /**
* 业务状态枚举 * 业务状态枚举
@ -17,6 +18,12 @@ import java.util.List;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum BusinessStatusEnum { public enum BusinessStatusEnum {
/**
* 验证
*/
VERIFY("verify", "验证"),
/** /**
* 已撤销 * 已撤销
*/ */
@ -72,6 +79,17 @@ public enum BusinessStatusEnum {
.orElse(StrUtil.EMPTY); .orElse(StrUtil.EMPTY);
} }
/**
* 根据status获取枚举
* @param status
* @return
*/
public static BusinessStatusEnum getByStatus(String status){
Optional<BusinessStatusEnum> optional = Arrays.stream(values()).filter(p -> StrUtil.equals(p.getStatus(),status)).findFirst();
return optional.orElse(null);
}
/** /**
* 启动流程校验 * 启动流程校验
* *

9
dk-modules/business/pom.xml

@ -91,6 +91,11 @@
<artifactId>common-encrypt</artifactId> <artifactId>common-encrypt</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>api-business</artifactId>
</dependency>
<!-- AutoPoi Excel工具类--> <!-- AutoPoi Excel工具类-->
<dependency> <dependency>
<groupId>org.jeecgframework</groupId> <groupId>org.jeecgframework</groupId>
@ -103,6 +108,10 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>api-workflow</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

62
dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java

@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.business.domain.BusinessAlert;
import org.dromara.business.domain.bo.BusinessAlertBo; import org.dromara.business.domain.bo.BusinessAlertBo;
import org.dromara.business.domain.vo.BusinessAlertVo; import org.dromara.business.domain.vo.BusinessAlertVo;
import org.dromara.business.service.BusinessAlertService; import org.dromara.business.service.BusinessAlertService;
@ -38,63 +39,30 @@ public class BusinessAlertController extends BaseController {
private final BusinessAlertService businessAlertService; private final BusinessAlertService businessAlertService;
/** /**
* 查询预警任务列表 * 查询全部预警
*/ */
@GetMapping("/alert/page") @GetMapping("/alert/page/all")
public TableDataInfo<BusinessAlertVo> pageBusinessAlert(BusinessAlertBo bo, PageQuery pageQuery) { public TableDataInfo<BusinessAlert> pageBusinessAlert(BusinessAlertBo bo, PageQuery pageQuery) {
return businessAlertService.pageBusinessAlert(bo, pageQuery); return businessAlertService.pageBusinessAlert(bo, pageQuery);
} }
/** /**
* 获取预警任务详细信息 * 查询审批的预警
*
* @param alertId 主键
*/ */
@GetMapping("/alert/{alertId}") @GetMapping("/alert/page/todo")
public R<BusinessAlertVo> getBusinessAlert(@NotNull(message = "主键不能为空") public TableDataInfo<BusinessAlert> pageBusinessAlertTodo(BusinessAlertBo bo, PageQuery pageQuery) {
@PathVariable String alertId) { return businessAlertService.pageBusinessAlertTodo(bo, pageQuery);
return R.ok(businessAlertService.getBusinessAlert(alertId));
} }
/** /**
* 新增预警任务 * 查询审批完成的预警
* @param bo
* @param pageQuery
* @return
*/ */
@Log(title = "预警任务", businessType = BusinessType.INSERT) @GetMapping("/alert/page/finish")
@RepeatSubmit() public TableDataInfo<BusinessAlert> pageBusinessAlertFinish(BusinessAlertBo bo, PageQuery pageQuery) {
@PostMapping("/alert/add") return businessAlertService.pageBusinessAlertFinish(bo, pageQuery);
public R<Void> addBusinessAlert(@Validated(AddGroup.class) @RequestBody BusinessAlertBo param) {
return toAjax(businessAlertService.addBusinessAlert(param));
} }
/**
* 修改预警任务
*/
@Log(title = "预警任务", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PostMapping("/alert/edit")
public R<Void> editBusinessAlert(@Validated(EditGroup.class) @RequestBody BusinessAlertBo bo) {
return toAjax(businessAlertService.editBusinessAlert(bo));
}
/**
* 删除预警任务
*
* @param alertIdList 主键串
*/
@Log(title = "预警任务", businessType = BusinessType.DELETE)
@DeleteMapping("/alert/delete")
public R<Void> deleteBusinessAlert(@NotEmpty(message = "主键不能为空")
@RequestParam List<String> alertIdList) {
return toAjax(businessAlertService.deleteBusinessAlert(alertIdList, true));
}
/**
* 导出预警任务列表
*/
@Log(title = "预警任务", businessType = BusinessType.EXPORT)
@PostMapping("/alert/export")
public void exportBusinessAlert(BusinessAlertBo bo, HttpServletResponse response) {
List<BusinessAlertVo> list = businessAlertService.listBusinessAlert(bo);
ExcelUtil.exportExcel(list, "预警任务", BusinessAlertVo.class, response);
}
} }

30
dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java

@ -1,9 +1,13 @@
package org.dromara.business.domain; package org.dromara.business.domain;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import java.util.Date; import java.util.Date;
import java.io.Serial; import java.io.Serial;
@ -25,13 +29,14 @@ public class BusinessAlert extends BaseEntity {
/** /**
* *
*/ */
@TableId(value = "id") @TableId(type = IdType.ASSIGN_ID)
private String id; private String id;
/** /**
* 流程实例Id * 租户编号
*/ */
private Long instanceId; private String tenantId;
/** /**
* 任务轮id * 任务轮id
@ -122,9 +127,9 @@ public class BusinessAlert extends BaseEntity {
private Long areaW; private Long areaW;
/** /**
* 0:验证 * 流程处置状态(verify:验证,cancel:已撤销,draft:草稿,waiting:待审核,finish:已完成,invalid:已作废,back:已退回,termination:已终止)
*/ */
private Long handleInType; private BusinessStatusEnum handleType;
/** /**
* 是否违建 01 * 是否违建 01
@ -202,5 +207,20 @@ public class BusinessAlert extends BaseEntity {
*/ */
private Long handleSource; private Long handleSource;
/**
* 审批者
*/
@TableField(exist = false)
private String approver;
/**
* 审批者
*/
@Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "approver")
@TableField(exist = false)
private String approveName;
@TableField(exist = false)
private Long flowTaskId;
} }

45
dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java

@ -11,7 +11,7 @@ import jakarta.validation.constraints.*;
import java.util.Date; import java.util.Date;
/** /**
* 预警任务业务对象 wayline_alert * 预警任务业务对象 business_alert
* *
* @author LionLi * @author LionLi
* @date 2025-02-27 * @date 2025-02-27
@ -20,206 +20,163 @@ import java.util.Date;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BusinessAlert.class, reverseConvertGenerate = false) @AutoMapper(target = BusinessAlert.class, reverseConvertGenerate = false)
public class BusinessAlertBo extends BaseEntity { public class BusinessAlertBo extends BaseEntity {
/**
*
*/
@NotBlank(message = "不能为空", groups = { EditGroup.class })
private String id;
/** /**
* 任务轮id * 任务轮id
*/ */
@NotBlank(message = "任务轮id不能为空", groups = { AddGroup.class, EditGroup.class })
private String wheelId; private String wheelId;
/** /**
* 媒体id * 媒体id
*/ */
@NotBlank(message = "媒体id不能为空", groups = { AddGroup.class, EditGroup.class })
private String taskId; private String taskId;
/** /**
* 图片id * 图片id
*/ */
@NotBlank(message = "图片id不能为空", groups = { AddGroup.class, EditGroup.class })
private String taskImageId; private String taskImageId;
/** /**
* 处理原因 * 处理原因
*/ */
@NotBlank(message = "处理原因不能为空", groups = { AddGroup.class, EditGroup.class })
private String reason; private String reason;
/** /**
* 图片文件 * 图片文件
*/ */
@NotBlank(message = "图片文件不能为空", groups = { AddGroup.class, EditGroup.class })
private String images; private String images;
/** /**
* 纬度 * 纬度
*/ */
@NotNull(message = "纬度不能为空", groups = { AddGroup.class, EditGroup.class })
private Long lat; private Long lat;
/** /**
* 精度 * 精度
*/ */
@NotNull(message = "精度不能为空", groups = { AddGroup.class, EditGroup.class })
private Long lng; private Long lng;
/** /**
* 任务类型 * 任务类型
*/ */
@NotBlank(message = "任务类型不能为空", groups = { AddGroup.class, EditGroup.class })
private String taskHandleType; private String taskHandleType;
/** /**
* 任务内容 * 任务内容
*/ */
@NotBlank(message = "任务内容不能为空", groups = { AddGroup.class, EditGroup.class })
private String taskContent; private String taskContent;
/** /**
* 完成时间 * 完成时间
*/ */
@NotNull(message = "完成时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date completeDate; private Date completeDate;
/** /**
* 模板图片 * 模板图片
*/ */
@NotBlank(message = "模板图片不能为空", groups = { AddGroup.class, EditGroup.class })
private String mateSourceImgUrl; private String mateSourceImgUrl;
/** /**
* 放大模板违建区域图片 * 放大模板违建区域图片
*/ */
@NotBlank(message = "放大模板违建区域图片不能为空", groups = { AddGroup.class, EditGroup.class })
private String maxMateSourceImgUrl; private String maxMateSourceImgUrl;
/** /**
* 放大违建区域图片 * 放大违建区域图片
*/ */
@NotBlank(message = "放大违建区域图片不能为空", groups = { AddGroup.class, EditGroup.class })
private String maxImages; private String maxImages;
/** /**
* 面积 * 面积
*/ */
@NotNull(message = "面积不能为空", groups = { AddGroup.class, EditGroup.class })
private Long area; private Long area;
/** /**
* 面积 * 面积
*/ */
@NotNull(message = "面积:长不能为空", groups = { AddGroup.class, EditGroup.class })
private Long areaL; private Long areaL;
/** /**
* 面积 * 面积
*/ */
@NotNull(message = "面积:宽不能为空", groups = { AddGroup.class, EditGroup.class })
private Long areaW; private Long areaW;
/**
* 0:验证
*/
@NotNull(message = "0:验证", groups = { AddGroup.class, EditGroup.class })
private Long handleInType;
/** /**
* 是否违建 01 * 是否违建 01
*/ */
@NotNull(message = "是否违建 0:否,1:是不能为空", groups = { AddGroup.class, EditGroup.class })
private Long isIllegal; private Long isIllegal;
/** /**
* 部门id * 部门id
*/ */
@NotBlank(message = "部门id不能为空", groups = { AddGroup.class, EditGroup.class })
private String deptId; private String deptId;
/** /**
* 部门名称 * 部门名称
*/ */
@NotBlank(message = "部门名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String deptName; private String deptName;
/** /**
* 预警名称 * 预警名称
*/ */
@NotBlank(message = "预警名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String jobName; private String jobName;
/** /**
* 处理时间 * 处理时间
*/ */
@NotNull(message = "处理时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date handleTime; private Date handleTime;
/** /**
* 其他内容 * 其他内容
*/ */
@NotBlank(message = "其他:内容不能为空", groups = { AddGroup.class, EditGroup.class })
private String taskHandle; private String taskHandle;
/** /**
* 平台类型 * 平台类型
*/ */
@NotBlank(message = "平台类型不能为空", groups = { AddGroup.class, EditGroup.class })
private String platformType; private String platformType;
/** /**
* 像素坐标 * 像素坐标
*/ */
@NotBlank(message = "像素坐标不能为空", groups = { AddGroup.class, EditGroup.class })
private String pixelCoordinate; private String pixelCoordinate;
/** /**
* 当前位置预警数量 * 当前位置预警数量
*/ */
@NotNull(message = "当前位置预警数量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long handleNum; private Long handleNum;
/** /**
* 国土所备注 * 国土所备注
*/ */
@NotBlank(message = "国土所备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String territoryRemark; private String territoryRemark;
/** /**
* 地类信息数据 * 地类信息数据
*/ */
@NotBlank(message = "地类信息数据不能为空", groups = { AddGroup.class, EditGroup.class })
private String landCategories; private String landCategories;
/** /**
* 相关文件 * 相关文件
*/ */
@NotBlank(message = "相关文件不能为空", groups = { AddGroup.class, EditGroup.class })
private String territoryUrl; private String territoryUrl;
/** /**
* 图片 * 图片
*/ */
@NotBlank(message = "图片不能为空", groups = { AddGroup.class, EditGroup.class })
private String territoryPath; private String territoryPath;
/** /**
* 忽略原因 * 忽略原因
*/ */
@NotBlank(message = "忽略原因不能为空", groups = { AddGroup.class, EditGroup.class })
private String ignoringCause; private String ignoringCause;
/** /**
* 来源0平台 1小程序 * 来源0平台 1小程序
*/ */
@NotNull(message = "来源:0:平台 1:小程序不能为空", groups = { AddGroup.class, EditGroup.class })
private Long handleSource; private Long handleSource;

15
dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java

@ -5,6 +5,9 @@ import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import org.dromara.business.domain.BusinessAlert; import org.dromara.business.domain.BusinessAlert;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
@ -26,12 +29,6 @@ public class BusinessAlertVo implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private String id;
/** /**
* 任务轮id * 任务轮id
*/ */
@ -130,10 +127,9 @@ public class BusinessAlertVo implements Serializable {
private Long areaW; private Long areaW;
/** /**
* 0:验证 * 流程处置状态(verify:验证,cancel:已撤销,draft:草稿,waiting:待审核,finish:已完成,invalid:已作废,back:已退回,termination:已终止)
*/ */
@ExcelProperty(value = "0:验证") private BusinessStatusEnum handleType;
private Long handleInType;
/** /**
* 是否违建 01 * 是否违建 01
@ -225,5 +221,4 @@ public class BusinessAlertVo implements Serializable {
@ExcelProperty(value = "来源:0:平台 1:小程序") @ExcelProperty(value = "来源:0:平台 1:小程序")
private Long handleSource; private Long handleSource;
} }

29
dk-modules/business/src/main/java/org/dromara/business/dubbo/RemoteBusinessAlertServiceImpl.java

@ -0,0 +1,29 @@
package org.dromara.business.dubbo;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.business.api.RemoteBusinessAlertService;
import org.dromara.business.service.BusinessAlertService;
import org.springframework.stereotype.Service;
/**
* 预警相关服务开放
*/
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteBusinessAlertServiceImpl implements RemoteBusinessAlertService {
private final BusinessAlertService businessAlertService;
/**
* 更新此条预警审批时候的状态
* @param businessId 业务id(预警工单)
* @param flowStatus 流程状态
*/
@Override
public void updateAlertStatus(String businessId, String flowStatus) {
businessAlertService.updateAlertStatus(businessId,flowStatus);
}
}

9
dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessAlertMapper.java

@ -1,10 +1,12 @@
package org.dromara.business.mapper; package org.dromara.business.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.business.domain.BusinessAlert; import org.dromara.business.domain.BusinessAlert;
import org.dromara.business.domain.vo.BusinessAlertVo; import org.dromara.business.domain.vo.BusinessAlertVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/** /**
* 预警任务Mapper接口 * 预警任务Mapper接口
@ -14,5 +16,10 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
*/ */
public interface BusinessAlertMapper extends BaseMapperPlus<BusinessAlert, BusinessAlertVo> { public interface BusinessAlertMapper extends BaseMapperPlus<BusinessAlert, BusinessAlertVo> {
Page<BusinessAlertVo> pageAlert(Page<BusinessAlertVo> page, LambdaQueryWrapper<BusinessAlert> lqw); Page<BusinessAlert> pageBusinessAlert(Page<BusinessAlert> build, QueryWrapper<BusinessAlert> wrapper);
Page<BusinessAlert> pageAlertFinish(Page<BusinessAlert> page, QueryWrapper<BusinessAlert> wrapper);
Page<BusinessAlert> pageAlertTodo(Page<BusinessAlert> build, QueryWrapper<BusinessAlert> wrapper);
} }

34
dk-modules/business/src/main/java/org/dromara/business/service/BusinessAlertService.java

@ -16,30 +16,12 @@ import java.util.List;
*/ */
public interface BusinessAlertService { public interface BusinessAlertService {
/**
* 查询预警任务
*
* @param id 主键
* @return 预警任务
*/
BusinessAlertVo getBusinessAlert(String id);
/** TableDataInfo<BusinessAlert> pageBusinessAlertTodo(BusinessAlertBo bo, PageQuery pageQuery);
* 分页查询预警任务列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 预警任务分页列表
*/
TableDataInfo<BusinessAlertVo> pageBusinessAlert(BusinessAlertBo bo, PageQuery pageQuery);
/** TableDataInfo<BusinessAlert> pageBusinessAlertFinish(BusinessAlertBo bo, PageQuery pageQuery);
* 查询符合条件的预警任务列表
* TableDataInfo<BusinessAlert> pageBusinessAlert(BusinessAlertBo bo, PageQuery pageQuery);
* @param param 查询条件
* @return 预警任务列表
*/
List<BusinessAlertVo> listBusinessAlert(BusinessAlertBo param);
/** /**
* 新增预警任务 * 新增预警任务
@ -74,4 +56,12 @@ public interface BusinessAlertService {
* @return 是否删除成功 * @return 是否删除成功
*/ */
Boolean deleteBusinessAlert(List<String> alertIdList, Boolean isValid); Boolean deleteBusinessAlert(List<String> alertIdList, Boolean isValid);
/**
* 修改预警中处置状态
* @param businessId
* @param flowStatus
*/
void updateAlertStatus(String businessId, String flowStatus);
} }

172
dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java

@ -1,22 +1,33 @@
package org.dromara.business.service.impl; package org.dromara.business.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.business.domain.BusinessAlert; import org.dromara.business.domain.BusinessAlert;
import org.dromara.business.domain.bo.BusinessAlertBo; import org.dromara.business.domain.bo.BusinessAlertBo;
import org.dromara.business.domain.vo.BusinessAlertVo; import org.dromara.business.domain.vo.BusinessAlertVo;
import org.dromara.business.mapper.BusinessAlertMapper; import org.dromara.business.mapper.BusinessAlertMapper;
import org.dromara.business.service.BusinessAlertService; import org.dromara.business.service.BusinessAlertService;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 预警任务Service业务层处理 * 预警任务Service业务层处理
@ -30,43 +41,8 @@ public class BusinessAlertServiceImpl implements BusinessAlertService {
private final BusinessAlertMapper baseMapper; private final BusinessAlertMapper baseMapper;
/** @DubboReference
* 查询预警任务 RemoteWorkflowService remoteWorkflowService;
*
* @param id 主键
* @return 预警任务
*/
@Override
public BusinessAlertVo getBusinessAlert(String id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询预警任务列表
*
* @param param 查询条件
* @param pageQuery 分页参数
* @return 预警任务分页列表
*/
@Override
public TableDataInfo<BusinessAlertVo> pageBusinessAlert(BusinessAlertBo param, PageQuery pageQuery) {
LambdaQueryWrapper<BusinessAlert> lqw = buildQueryWrapper(param);
Page<BusinessAlertVo> result = baseMapper.pageAlert(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的预警任务列表
*
* @param param 查询条件
* @return 预警任务列表
*/
@Override
public List<BusinessAlertVo> listBusinessAlert(BusinessAlertBo param) {
LambdaQueryWrapper<BusinessAlert> lqw = buildQueryWrapper(param);
return baseMapper.selectVoList(lqw);
}
/** /**
@ -105,14 +81,6 @@ public class BusinessAlertServiceImpl implements BusinessAlertService {
return baseMapper.updateById(businessAlert) > 0; return baseMapper.updateById(businessAlert) > 0;
} }
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BusinessAlert alert, Boolean validId){
if (ObjectUtil.isEmpty(alert.getId())){
throw new ServiceException("预警【Id】为空!");
}
}
/** /**
* 校验并批量删除预警任务信息 * 校验并批量删除预警任务信息
@ -131,11 +99,119 @@ public class BusinessAlertServiceImpl implements BusinessAlertService {
return baseMapper.deleteByIds(alertIdList) > 0; return baseMapper.deleteByIds(alertIdList) > 0;
} }
private LambdaQueryWrapper<BusinessAlert> buildQueryWrapper(BusinessAlertBo bo) { /**
LambdaQueryWrapper<BusinessAlert> wrapper = Wrappers.lambdaQuery(); * 修改预警中处置状态
* @param businessId
* @param flowStatus
*/
@Override
public void updateAlertStatus(String businessId, String flowStatus) {
LambdaUpdateWrapper<BusinessAlert> wrapper = new LambdaUpdateWrapper<>();
wrapper.set(BusinessAlert::getHandleType, BusinessStatusEnum.getByStatus(flowStatus));
wrapper.eq(BusinessAlert::getId, businessId);
this.baseMapper.update(wrapper);
}
/**
* 查询全部预警
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<BusinessAlert> pageBusinessAlert(BusinessAlertBo bo, PageQuery pageQuery) {
QueryWrapper<BusinessAlert> wrapper = buildQueryWrapper(bo);
wrapper.orderByAsc(BusinessAlert::getCreateTime); Page<BusinessAlert> page = this.baseMapper.pageBusinessAlert(pageQuery.build(), wrapper);
return TableDataInfo.build(page);
}
/**
* 查询当前用户已完成预警
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<BusinessAlert> pageBusinessAlertFinish(BusinessAlertBo bo, PageQuery pageQuery) {
QueryWrapper<BusinessAlert> wrapper = buildQueryWrapper(bo);
buildCommonQueryWrapper(wrapper);
wrapper.in("a.approver", LoginHelper.getUserId());
Page<BusinessAlert> page = this.baseMapper.pageAlertFinish(pageQuery.build(), wrapper);
return TableDataInfo.build(page);
}
/**
* 查询当前用户待办预警
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<BusinessAlert> pageBusinessAlertTodo(BusinessAlertBo bo, PageQuery pageQuery) {
QueryWrapper<BusinessAlert> wrapper = buildQueryWrapper(bo);
buildCommonQueryWrapper(wrapper);
wrapper.eq("uu.del_flag", 0);
wrapper.in("uu.type", 1,2,3);
wrapper.in("a.processed_by", remoteWorkflowService.getPermissions());
wrapper.in("a.flow_status", BusinessStatusEnum.WAITING.getStatus());
Page<BusinessAlert> page = this.baseMapper.pageAlertTodo(pageQuery.build(), wrapper);
List<BusinessAlert> records = page.getRecords();
if (CollUtil.isNotEmpty(records)) {
List<Long> taskIds = StreamUtils.toList(records, BusinessAlert::getFlowTaskId);
Map<Long, List<RemoteUserVo>> listMap = remoteWorkflowService.currentTaskAllUser(taskIds);
records.forEach(t -> {
List<RemoteUserVo> userList = listMap.getOrDefault(t.getId(), Collections.emptyList());
if (CollUtil.isNotEmpty(userList)) {
t.setApprover(StreamUtils.join(userList, e -> String.valueOf(e.getUserId())));
t.setApproveName(StreamUtils.join(userList, RemoteUserVo::getNickName));
}
});
}
return TableDataInfo.build(page);
}
/**
* 构建wrapper
* @param bo
* @return
*/
private QueryWrapper<BusinessAlert> buildQueryWrapper(BusinessAlertBo bo) {
QueryWrapper<BusinessAlert> wrapper = new QueryWrapper<>();
wrapper.orderByAsc("ba.create_time");
return wrapper; return wrapper;
} }
/**
* 构建通用流程wrapper
* @param wrapper
*/
private void buildCommonQueryWrapper(QueryWrapper<BusinessAlert> wrapper) {
wrapper.eq("a.del_flag",0);
wrapper.eq("b.del_flag",0);
wrapper.eq("c.del_flag",0);
wrapper.in("a.node_type",1,3,4);
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BusinessAlert alert, Boolean validId){
if (ObjectUtil.isEmpty(alert.getId())){
throw new ServiceException("预警【Id】为空!");
}
}
} }

79
dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml

@ -4,49 +4,44 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.business.mapper.BusinessAlertMapper"> <mapper namespace="org.dromara.business.mapper.BusinessAlertMapper">
<select id="pageAlert" resultType="org.dromara.business.domain.vo.BusinessAlertVo"> <select id="pageBusinessAlert" resultType="org.dromara.business.domain.BusinessAlert">
select select
id, ba.*,
instance_id, b.flow_status flowStatus,
wheel_id, b.business_id businessId,
task_id, from dk_business.business_alert ba
task_image_id, left join dk_workflow.flow_instance b on ba.id = b.business_id
reason, ${ew.getCustomSqlSegment}
images,
lat,
lng,
task_handle_type,
task_content,
complete_date,
handle_type,
del_flag,
mate_source_img_url,
max_mate_source_img_url,
max_images,
area,
area_l,
area_w,
handle_in_type,
is_illegal,
dept_id,
dept_name,
job_name,
handle_time,
task_handle,
platform_type,
pixel_coordinate,
handle_num,
territory_remark,
land_categories,
territory_url,
territory_path,
ignoring_cause,
handle_source,
create_by,
create_time
from business_alert
${ew.customSqlSegment}
</select> </select>
<select id="pageAlertFinish" resultType="org.dromara.business.domain.BusinessAlert">
select
ba.*,
b.flow_status flowStatus,
b.business_id businessId,
a.approver,
a.id flowTaskId
from dk_business.business_alert ba
left join dk_workflow.flow_instance b on ba.id = b.business_id
left join dk_workflow.flow_his_task a on a.instance_id = b.id
left join dk_workflow.flow_definition c on a.definition_id = c.id
${ew.getCustomSqlSegment}
</select>
<select id="pageAlertTodo" resultType="org.dromara.business.domain.BusinessAlert">
select
ba.*,
b.flow_status,
b.business_id,
uu.processed_by approver,
a.id flowTaskId
from dk_business.business_alert ba
left join dk_workflow.flow_instance b on ba.id = b.business_id
left join dk_workflow.flow_task a on a.instance_id = b.id
left join dk_workflow.flow_user uu on uu.associated = a.id
left join dk_workflow.flow_definition c on a.definition_id = c.id
${ew.getCustomSqlSegment}
</select>
</mapper> </mapper>

6
dk-modules/workflow/pom.xml

@ -102,6 +102,12 @@
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>api-resource</artifactId> <artifactId>api-resource</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>api-business</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

34
dk-modules/workflow/src/main/java/org/dromara/workflow/common/handler/FlwCommonHandler.java

@ -0,0 +1,34 @@
package org.dromara.workflow.common.handler;
import org.dromara.workflow.api.event.ProcessCreateTaskEvent;
import org.dromara.workflow.api.event.ProcessDeleteEvent;
import org.dromara.workflow.api.event.ProcessEvent;
public interface FlwCommonHandler {
/**
* 总体流程监听(例如: 草稿撤销退回作废终止已完成单任务完成等)
*
* @param processEvent 参数
*/
public void processHandler(ProcessEvent processEvent);
/**
* 执行任务创建监听
* 在方法中判断流程节点key
* if ("xxx".equals(processCreateTaskEvent.getNodeCode())) {
* //执行业务逻辑
* }
*
* @param processCreateTaskEvent 参数
*/
public void processCreateTaskHandler(ProcessCreateTaskEvent processCreateTaskEvent);
/**
* 监听删除流程事件
* 正常使用只需#processDeleteEvent.flowCode=='leave1'
*
* @param processDeleteEvent 参数
*/
public void processDeleteHandler(ProcessDeleteEvent processDeleteEvent);
}

5
dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java

@ -52,4 +52,9 @@ public class FlowTaskBo implements Serializable {
*/ */
private List<Long> createByIds; private List<Long> createByIds;
/**
* 业务Id
*/
private String businessId;
} }

4
dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java

@ -23,13 +23,13 @@ public class StartProcessBo implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* 业务唯一值id * 业务唯一值id,根据具体业务来例如预警可以为预警Id
*/ */
@NotBlank(message = "业务ID不能为空", groups = {AddGroup.class}) @NotBlank(message = "业务ID不能为空", groups = {AddGroup.class})
private String businessId; private String businessId;
/** /**
* 流程定义编码 * 流程定义编码,不同的审批流程例如预警可以为alert
*/ */
@NotBlank(message = "流程定义编码不能为空", groups = {AddGroup.class}) @NotBlank(message = "流程定义编码不能为空", groups = {AddGroup.class})
private String flowCode; private String flowCode;

18
dk-modules/workflow/src/main/java/org/dromara/workflow/dubbo/RemoteWorkflowServiceImpl.java

@ -2,10 +2,12 @@ package org.dromara.workflow.dubbo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService; import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.workflow.api.RemoteWorkflowService; import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteCompleteTask; import org.dromara.workflow.api.domain.RemoteCompleteTask;
import org.dromara.workflow.api.domain.RemoteStartProcess; import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.dromara.workflow.api.domain.RemoteStartProcessReturn; import org.dromara.workflow.api.domain.RemoteStartProcessReturn;
import org.dromara.workflow.service.IFlwTaskService;
import org.dromara.workflow.service.WorkflowService; import org.dromara.workflow.service.WorkflowService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -25,6 +27,8 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService {
private final WorkflowService workflowService; private final WorkflowService workflowService;
private final IFlwTaskService flwTaskService;
@Override @Override
public boolean deleteInstance(List<Long> businessIds) { public boolean deleteInstance(List<Long> businessIds) {
return workflowService.deleteInstance(businessIds); return workflowService.deleteInstance(businessIds);
@ -66,8 +70,18 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService {
} }
@Override @Override
public boolean completeTask(RemoteCompleteTask completeTask) { public Map<Long, List<RemoteUserVo>> currentTaskAllUser(List<Long> taskIds) {
return workflowService.completeTask(completeTask); return flwTaskService.currentTaskAllUser(taskIds);
} }
@Override
public List<String> getPermissions() {
return flwTaskService.getPermissions();
}
// @Override
// public boolean completeTask(RemoteCompleteTask completeTask) {
// return workflowService.completeTask(completeTask);
// }
} }

60
dk-modules/workflow/src/main/java/org/dromara/workflow/handler/FlwAlertHandler.java

@ -0,0 +1,60 @@
package org.dromara.workflow.handler;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.business.api.RemoteBusinessAlertService;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.workflow.api.event.ProcessCreateTaskEvent;
import org.dromara.workflow.api.event.ProcessDeleteEvent;
import org.dromara.workflow.api.event.ProcessEvent;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.handler.FlwCommonHandler;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
* 流程预警扩展业务
*/
@ConditionalOnEnable
@Slf4j
@Component
public class FlwAlertHandler implements FlwCommonHandler {
@DubboReference
RemoteBusinessAlertService alertService;
/**
* 总体流程监听(例如: 草稿撤销退回作废终止已完成单任务完成等)
*
* @param processEvent 参数
*/
@EventListener(condition = "#processEvent.flowCode.startsWith('leave')")
@Override
public void processHandler(ProcessEvent processEvent) {
alertService.updateAlertStatus(processEvent.getBusinessId(),processEvent.getStatus());
}
/**
* 流程创建的时候将预警表中的状态进行修改
* 执行任务创建监听
*
* @param processCreateTaskEvent 参数
*/
@EventListener(condition = "#processCreateTaskEvent.flowCode.startsWith('leave')")
@Override
public void processCreateTaskHandler(ProcessCreateTaskEvent processCreateTaskEvent) {
alertService.updateAlertStatus(processCreateTaskEvent.getBusinessId(), BusinessStatusEnum.WAITING.getStatus());
}
/**
* 监听删除流程事件
* 正常使用只需#processDeleteEvent.flowCode=='leave1'
*
* @param processDeleteEvent 参数
*/
@EventListener(condition = "#processDeleteEvent.flowCode.startsWith('leave')")
@Override
public void processDeleteHandler(ProcessDeleteEvent processDeleteEvent) {
}
}

12
dk-modules/workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java

@ -3,7 +3,10 @@ package org.dromara.workflow.service;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.api.domain.vo.RemoteUserVo; import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.entity.Node; import org.dromara.warm.flow.core.entity.Node;
import org.dromara.warm.flow.core.entity.Task;
import org.dromara.warm.flow.core.service.impl.TaskServiceImpl;
import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.warm.flow.orm.entity.FlowHisTask;
import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.workflow.api.domain.RemoteStartProcessReturn; import org.dromara.workflow.api.domain.RemoteStartProcessReturn;
@ -46,6 +49,7 @@ public interface IFlwTaskService {
*/ */
TableDataInfo<FlowTaskVo> pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery); TableDataInfo<FlowTaskVo> pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery);
/** /**
* 查询当前租户所有待办任务 * 查询当前租户所有待办任务
* *
@ -55,6 +59,8 @@ public interface IFlwTaskService {
*/ */
TableDataInfo<FlowHisTaskVo> pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery); TableDataInfo<FlowHisTaskVo> pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery);
/** /**
* 查询待办任务 * 查询待办任务
* *
@ -188,4 +194,10 @@ public interface IFlwTaskService {
* @return 结果 * @return 结果
*/ */
List<RemoteUserVo> currentTaskAllUser(Long taskId); List<RemoteUserVo> currentTaskAllUser(Long taskId);
/**
* 审批前获取当前办理人办理时会校验的该权限集合
* 返回当前用户权限集合
*/
List<String> getPermissions();
} }

125
dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java

@ -52,6 +52,8 @@ import org.dromara.workflow.mapper.FlwCategoryMapper;
import org.dromara.workflow.mapper.FlwTaskMapper; import org.dromara.workflow.mapper.FlwTaskMapper;
import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.service.IFlwTaskService;
import org.dromara.workflow.utils.WorkflowUtils; import org.dromara.workflow.utils.WorkflowUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -93,6 +95,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
@DubboReference(stub = "true") @DubboReference(stub = "true")
private final RemoteMessageService remoteMessageService; private final RemoteMessageService remoteMessageService;
@Autowired
private ApplicationContext applicationContext;
/** /**
* 启动任务 * 启动任务
* *
@ -139,6 +144,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
RemoteStartProcessReturn dto = new RemoteStartProcessReturn(); RemoteStartProcessReturn dto = new RemoteStartProcessReturn();
dto.setProcessInstanceId(instance.getId()); dto.setProcessInstanceId(instance.getId());
dto.setTaskId(taskList.get(0).getId()); dto.setTaskId(taskList.get(0).getId());
//创建任务
executeTask(taskList.get(0).getId());
return dto; return dto;
} }
@ -188,46 +196,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
} }
} }
private void sendMessage(String flowName, Long instId, List<String> messageType, String message) {
List<RemoteUserVo> userList = new ArrayList<>();
List<FlowTask> list = this.selectByInstId(instId);
if (StringUtils.isBlank(message)) {
message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。";
}
for (Task task : list) {
List<RemoteUserVo> users = this.currentTaskAllUser(task.getId());
if (CollUtil.isNotEmpty(users)) {
userList.addAll(users);
}
}
if (CollUtil.isNotEmpty(userList)) {
for (String code : messageType) {
MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code);
if (ObjectUtil.isNotEmpty(messageTypeEnum)) {
switch (messageTypeEnum) {
case SYSTEM_MESSAGE:
SseMessageDto dto = new SseMessageDto();
dto.setUserIds(StreamUtils.toList(userList, RemoteUserVo::getUserId).stream().distinct().collect(Collectors.toList()));
dto.setMessage(message);
dto.getUserIds().forEach(userId -> {
remoteMessageService.publishMessage(userId,dto.getMessage());
});
break;
case EMAIL_MESSAGE:
MailUtils.sendText(StreamUtils.join(userList, RemoteUserVo::getEmail), "单据审批提醒", message);
break;
case SMS_MESSAGE:
//todo 短信发送
break;
default:
throw new IllegalStateException("Unexpected value: " + messageTypeEnum);
}
}
}
}
}
/** /**
* 设置办理人 * 设置办理人
* *
@ -319,12 +287,23 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
public TableDataInfo<FlowTaskVo> pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { public TableDataInfo<FlowTaskVo> pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
QueryWrapper<FlowTaskBo> queryWrapper = buildQueryWrapper(flowTaskBo); QueryWrapper<FlowTaskBo> queryWrapper = buildQueryWrapper(flowTaskBo);
queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey());
queryWrapper.in("t.processed_by", SpringUtils.getBean(WorkflowPermissionHandler.class).permissions()); queryWrapper.in("t.processed_by", this.getPermissions());
queryWrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); queryWrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus());
Page<FlowTaskVo> page = this.getFlowTaskVoPage(pageQuery, queryWrapper); Page<FlowTaskVo> page = this.getFlowTaskVoPage(pageQuery, queryWrapper);
return TableDataInfo.build(page); return TableDataInfo.build(page);
} }
/**
* 审批前获取当前办理人办理时会校验的该权限集合
* 返回当前用户权限集合
*/
@Override
public List<String> getPermissions() {
return SpringUtils.getBean(WorkflowPermissionHandler.class).permissions();
}
/** /**
* 查询当前用户的已办任务 * 查询当前用户的已办任务
* *
@ -341,6 +320,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
return TableDataInfo.build(page); return TableDataInfo.build(page);
} }
/** /**
* 查询待办任务 * 查询待办任务
* *
@ -405,6 +385,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName());
wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode());
wrapper.in(CollUtil.isNotEmpty(flowTaskBo.getCreateByIds()), "t.create_by", flowTaskBo.getCreateByIds()); wrapper.in(CollUtil.isNotEmpty(flowTaskBo.getCreateByIds()), "t.create_by", flowTaskBo.getCreateByIds());
if (ObjectUtil.isNotEmpty(flowTaskBo.getBusinessId())){
wrapper.eq("i.business_id", flowTaskBo.getBusinessId());
}
if (StringUtils.isNotBlank(flowTaskBo.getCategory())) { if (StringUtils.isNotBlank(flowTaskBo.getCategory())) {
List<Long> categoryIds = flwCategoryMapper.selectCategoryIdsByParentId(Convert.toLong(flowTaskBo.getCategory())); List<Long> categoryIds = flwCategoryMapper.selectCategoryIdsByParentId(Convert.toLong(flowTaskBo.getCategory()));
wrapper.in("t.category", StreamUtils.toList(categoryIds, Convert::toStr)); wrapper.in("t.category", StreamUtils.toList(categoryIds, Convert::toStr));
@ -737,4 +720,64 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
} }
return remoteUserService.selectListByIds(StreamUtils.toList(userList, e -> Long.valueOf(e.getProcessedBy()))); return remoteUserService.selectListByIds(StreamUtils.toList(userList, e -> Long.valueOf(e.getProcessedBy())));
} }
/**
* 初始化流程任务
* @param taskId
*/
public void executeTask(Long taskId) {
CompleteTaskBo completeTaskBo = new CompleteTaskBo();
completeTaskBo.setTaskId(taskId);
completeTaskBo.setMessageType(List.of(MessageTypeEnum.SYSTEM_MESSAGE.getCode()));
IFlwTaskService service = applicationContext.getBean(IFlwTaskService.class);
service.completeTask(completeTaskBo);
}
/**
* 发送消息
* @param flowName
* @param instId
* @param messageType
* @param message
*/
private void sendMessage(String flowName, Long instId, List<String> messageType, String message) {
List<RemoteUserVo> userList = new ArrayList<>();
List<FlowTask> list = this.selectByInstId(instId);
if (StringUtils.isBlank(message)) {
message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。";
}
for (Task task : list) {
List<RemoteUserVo> users = this.currentTaskAllUser(task.getId());
if (CollUtil.isNotEmpty(users)) {
userList.addAll(users);
}
}
if (CollUtil.isNotEmpty(userList)) {
for (String code : messageType) {
MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code);
if (ObjectUtil.isNotEmpty(messageTypeEnum)) {
switch (messageTypeEnum) {
case SYSTEM_MESSAGE:
SseMessageDto dto = new SseMessageDto();
dto.setUserIds(StreamUtils.toList(userList, RemoteUserVo::getUserId).stream().distinct().collect(Collectors.toList()));
dto.setMessage(message);
dto.getUserIds().forEach(userId -> {
remoteMessageService.publishMessage(userId,dto.getMessage());
});
break;
case EMAIL_MESSAGE:
MailUtils.sendText(StreamUtils.join(userList, RemoteUserVo::getEmail), "单据审批提醒", message);
break;
case SMS_MESSAGE:
//todo 短信发送
break;
default:
throw new IllegalStateException("Unexpected value: " + messageTypeEnum);
}
}
}
}
}
} }

6
dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java

@ -130,7 +130,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
* *
* @param processEvent 参数 * @param processEvent 参数
*/ */
@EventListener(condition = "#processEvent.flowCode.startsWith('leave')") // @EventListener(condition = "#processEvent.flowCode.startsWith('leave')")
public void processHandler(ProcessEvent processEvent) { public void processHandler(ProcessEvent processEvent) {
TenantHelper.dynamic(processEvent.getTenantId(), () -> { TenantHelper.dynamic(processEvent.getTenantId(), () -> {
log.info("当前任务执行了{}", processEvent.toString()); log.info("当前任务执行了{}", processEvent.toString());
@ -163,7 +163,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
* *
* @param processCreateTaskEvent 参数 * @param processCreateTaskEvent 参数
*/ */
@EventListener(condition = "#processCreateTaskEvent.flowCode.startsWith('leave')") // @EventListener(condition = "#processCreateTaskEvent.flowCode.startsWith('leave')")
public void processCreateTaskHandler(ProcessCreateTaskEvent processCreateTaskEvent) { public void processCreateTaskHandler(ProcessCreateTaskEvent processCreateTaskEvent) {
TenantHelper.dynamic(processCreateTaskEvent.getTenantId(), () -> { TenantHelper.dynamic(processCreateTaskEvent.getTenantId(), () -> {
log.info("当前任务创建了{}", processCreateTaskEvent.toString()); log.info("当前任务创建了{}", processCreateTaskEvent.toString());
@ -180,7 +180,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
* *
* @param processDeleteEvent 参数 * @param processDeleteEvent 参数
*/ */
@EventListener(condition = "#processDeleteEvent.flowCode.startsWith('leave')") // @EventListener(condition = "#processDeleteEvent.flowCode.startsWith('leave')")
public void processDeleteHandler(ProcessDeleteEvent processDeleteEvent) { public void processDeleteHandler(ProcessDeleteEvent processDeleteEvent) {
TenantHelper.dynamic(processDeleteEvent.getTenantId(), () -> { TenantHelper.dynamic(processDeleteEvent.getTenantId(), () -> {
log.info("监听删除流程事件,当前任务执行了{}", processDeleteEvent.toString()); log.info("监听删除流程事件,当前任务执行了{}", processDeleteEvent.toString());

Loading…
Cancel
Save