diff --git a/dk-api/api-business/src/main/java/org/dromara/business/api/RemoteBusinessAlertService.java b/dk-api/api-business/src/main/java/org/dromara/business/api/RemoteBusinessAlertService.java index 2237092..88b19c7 100644 --- a/dk-api/api-business/src/main/java/org/dromara/business/api/RemoteBusinessAlertService.java +++ b/dk-api/api-business/src/main/java/org/dromara/business/api/RemoteBusinessAlertService.java @@ -15,5 +15,5 @@ public interface RemoteBusinessAlertService { * @param businessId 业务id(预警、工单) * @param flowStatus 流程状态 */ - void updateAlertStatus(String businessId, String flowStatus,Boolean isIllegal,String alertType); + void updateAlertStatus(String businessId, String flowStatus,Boolean isIllegal,String alertType,String message,String assignName); } diff --git a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteLabelPostService.java b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteLabelPostService.java new file mode 100644 index 0000000..5bfa201 --- /dev/null +++ b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteLabelPostService.java @@ -0,0 +1,21 @@ +package org.dromara.system.api; +import org.dromara.system.api.domain.vo.RemoteAiLabelPostVo; +import java.util.List; + +/** + * @auther yq + * @data 2025/3/12 + */ +public interface RemoteLabelPostService { + + + /** + * 根据岗位编码和部门id进行查询绑定的标签集合 + * @param postCode 岗位编码 + * @param deptId 部门id + * @return 标签集合 + * + * */ + List selectLabelByList(String postCode, Long deptId); + +} diff --git a/dk-api/api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteAiLabelPostVo.java b/dk-api/api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteAiLabelPostVo.java new file mode 100644 index 0000000..90d5c1c --- /dev/null +++ b/dk-api/api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteAiLabelPostVo.java @@ -0,0 +1,56 @@ +package org.dromara.system.api.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + + +import java.io.Serial; +import java.io.Serializable; + + +/** + * ai 识别类型视图对象 ai_label + * + * @author LionLi + * @date 2025-03-11 + */ +@Data + +public class RemoteAiLabelPostVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + // @ExcelProperty(value = "id") + private Long lableId; + + /** + * 标签名-英 + */ + + private String labelEn; + + /** + * 标签名-中 + */ + + private String labelCn; + + /** + * 算法类型 + */ + private String aiType; + + /** + * 算法名称 + */ + private String aiName; + + private Long postId; + private String postName; +} diff --git a/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/RemoteWorkflowService.java b/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/RemoteWorkflowService.java index 50a5924..f83753a 100644 --- a/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/RemoteWorkflowService.java +++ b/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/RemoteWorkflowService.java @@ -1,12 +1,15 @@ package org.dromara.workflow.api; import org.dromara.system.api.domain.vo.RemoteUserVo; +import org.dromara.workflow.api.domain.FlowDepartVo; import org.dromara.workflow.api.domain.RemoteCompleteTask; import org.dromara.workflow.api.domain.RemoteStartProcess; import org.dromara.workflow.api.domain.RemoteStartProcessReturn; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; /** * 通用 工作流服务 @@ -78,6 +81,14 @@ public interface RemoteWorkflowService { */ RemoteStartProcessReturn startWorkFlow(RemoteStartProcess startProcess); + /** + * 批量启动流程 + * + * @param startProcess 参数 + * @return 结果 + */ + Boolean startWorkFlowBatch(List startProcess); + /** * 办理任务 * @@ -108,4 +119,15 @@ public interface RemoteWorkflowService { * @return 结果 */ boolean processInvalid(Long instanceId); + + /** + * 获取当前任务的所有办理人 + * + * @param taskId 任务id + * @return 结果 + */ + List currentTaskAllUser(Long taskId); + + FlowDepartVo getFlowDepart(Long deptId); + } diff --git a/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/domain/FlowDepartVo.java b/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/domain/FlowDepartVo.java new file mode 100644 index 0000000..84dc82b --- /dev/null +++ b/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/domain/FlowDepartVo.java @@ -0,0 +1,22 @@ +package org.dromara.workflow.api.domain; + +import lombok.Data; + +@Data +public class FlowDepartVo { + + + private Long id; + + /** + * 流程类型 + */ + private String flowType; + + /** + * 流程编码 + */ + private String flowCode; + + +} diff --git a/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/domain/RemoteFlowNode.java b/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/domain/RemoteFlowNode.java new file mode 100644 index 0000000..eaed983 --- /dev/null +++ b/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/domain/RemoteFlowNode.java @@ -0,0 +1,12 @@ +package org.dromara.workflow.api.domain; + +import lombok.Data; + +@Data +public class RemoteFlowNode { + + private Long definitionId; + + private String permission_flag; + +} diff --git a/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/event/ProcessCreateTaskEvent.java b/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/event/ProcessCreateTaskEvent.java index eabb443..11deccf 100644 --- a/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/event/ProcessCreateTaskEvent.java +++ b/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/event/ProcessCreateTaskEvent.java @@ -6,6 +6,7 @@ import org.dromara.common.core.utils.SpringUtils; import org.springframework.cloud.bus.event.RemoteApplicationEvent; import java.io.Serial; +import java.util.Map; /** * 流程创建任务监听 @@ -54,6 +55,17 @@ public class ProcessCreateTaskEvent extends RemoteApplicationEvent { */ private Boolean isIllegal; + + /** + * 办理参数 + */ + private Map params; + + /** + * 审核意见 + */ + private String message; + public ProcessCreateTaskEvent() { super(new Object(), SpringUtils.getApplicationName(), DEFAULT_DESTINATION_FACTORY.getDestination(null)); } diff --git a/dk-common/common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java b/dk-common/common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java index d2c38dd..329ee68 100644 --- a/dk-common/common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java +++ b/dk-common/common-core/src/main/java/org/dromara/common/core/enums/BusinessStatusEnum.java @@ -32,10 +32,16 @@ public enum BusinessStatusEnum { * 草稿 */ DRAFT("draft", "草稿"), + /** + * 处理中 + */ + WAITING("waiting", "处理中"), + /** * 待审核 */ - WAITING("waiting", "待审核"), + TODO("todo", "待审核"), + /** * 已完成 */ diff --git a/dk-modules/business/pom.xml b/dk-modules/business/pom.xml index 8cb8480..2d00876 100644 --- a/dk-modules/business/pom.xml +++ b/dk-modules/business/pom.xml @@ -1,6 +1,6 @@ - 4.0.0 diff --git a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java index 11e4a17..b9860f2 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java +++ b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java @@ -10,10 +10,10 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** * 预警服务 @@ -39,4 +39,7 @@ public class BusinessAlertController extends BaseController { public TableDataInfo pageBusinessAlert(BusinessAlertBo bo, PageQuery pageQuery,@PathVariable String alertCode) { return businessAlertService.getInfo(bo,pageQuery,alertCode); } + + + } diff --git a/dk-modules/business/src/main/java/org/dromara/business/controller/WebhookController.java b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessHookController.java similarity index 50% rename from dk-modules/business/src/main/java/org/dromara/business/controller/WebhookController.java rename to dk-modules/business/src/main/java/org/dromara/business/controller/BusinessHookController.java index e54b6b4..658fe6a 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/controller/WebhookController.java +++ b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessHookController.java @@ -4,7 +4,7 @@ package org.dromara.business.controller; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.web.core.BaseController; +import org.dromara.business.domain.bo.BusinessHookBo; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -20,15 +20,15 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/index/hook") @Tag(name = "ZLMediaKit视频流事件回调") @Slf4j -public class WebhookController { +public class BusinessHookController { /** * 处理播放事件 */ @PostMapping("/on_play") - public String onPlay(@RequestBody String body) { - log.info("on_play event: {}", body); + public String onPlay(@RequestBody BusinessHookBo hookPlayBo) { + log.info("on_play event: {}", hookPlayBo); return "{\"code\": 0}"; } @@ -37,8 +37,28 @@ public class WebhookController { * 处理录制 MP4 文件事件 */ @PostMapping("/on_record_mp4") - public String onRecordMp4(@RequestBody String body) { - log.info("on_record_mp4 event: {}", body); + public String onRecordMp4(@RequestBody BusinessHookBo businessRecordBo) { + log.info("on_record_mp4 event: {}", businessRecordBo); + + return "{\"code\": 0}"; + } + + /** + * rtsp/rtmp/rtp 推流事件 + */ + @PostMapping("/on_publish") + public String onPublish(@RequestBody BusinessHookBo hookPublishBo) { + log.info("on_publish event: {}", hookPublishBo); + + return "{\"code\": 0}"; + } + + /** + * rtsp/rtmp 流注册或注销时触发此事件 + */ + @PostMapping("/on_stream_changed") + public String onStreamChanged(@RequestBody String body) { + log.info("on_stream_changed event: {}", body); return "{\"code\": 0}"; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessOperationController.java b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessOperationController.java index c8cad86..634693c 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessOperationController.java +++ b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessOperationController.java @@ -83,6 +83,20 @@ public class BusinessOperationController extends BaseController { return toAjax(businessOperationService.insertByBo(bo)); } + /** + * 上传航线-绑定工单 + */ + @SaCheckPermission("system:operation:add") + @Log(title = "运营中心-上传航线-绑定工单", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/bindFile") + public R bindFile(@Validated(AddGroup.class) BusinessOperationBo bo) { + //根据工单绘制上传航线,绑定航线,填报信息 + return toAjax(businessOperationService.insertByBo(bo)); + } + + + /** * 修改运营中心-工单处理 */ diff --git a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java index 4e9bc43..f16fb86 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java +++ b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java @@ -2,6 +2,7 @@ package org.dromara.business.controller; import java.util.List; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; @@ -34,6 +35,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; @RequiredArgsConstructor @RestController @RequestMapping("/task") +@Tag(name = "预警工单相关操作") public class BusinessTaskController extends BaseController { private final IBusinessTaskService businessTaskService; diff --git a/dk-modules/business/src/main/java/org/dromara/business/controller/FixController.java b/dk-modules/business/src/main/java/org/dromara/business/controller/FixController.java new file mode 100644 index 0000000..f84c3ef --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/controller/FixController.java @@ -0,0 +1,74 @@ +package org.dromara.business.controller; + +import cn.hutool.core.collection.ListUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.business.domain.BusinessAlert; +import org.dromara.business.mapper.BusinessAlertMapper; +import org.dromara.business.service.IBusinessAlertService; +import org.dromara.business.utils.BatchProcessorUtil; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.api.domain.vo.RemoteAiLabelPostVo; +import org.dromara.workflow.api.RemoteWorkflowService; +import org.dromara.workflow.api.domain.RemoteStartProcess; +import org.dromara.workflow.api.domain.RemoteStartProcessReturn; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/fix") +@Tag(name = "fix") +public class FixController extends BaseController { + + @DubboReference(timeout = 30000) + RemoteWorkflowService remoteWorkflowService; + + private final BusinessAlertMapper baseMapper; + + @Operation(summary ="生成流程",description = "生成流程") + @GetMapping("startFlow") + public R startFlow(@RequestParam String flowCode) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(BusinessAlert::getHandleType,"verify"); + wrapper.in(BusinessAlert::getLabelEn,"plough","towns"); + List businessAlerts = baseMapper.selectList(wrapper); + + List alertList = ListUtil.sub(businessAlerts, 0, 10); + + List flowList = alertList.stream() + .map(alert -> { + RemoteStartProcess remoteStartProcess = new RemoteStartProcess(); + remoteStartProcess.setFlowCode(flowCode); + remoteStartProcess.setBusinessId(alert.getId()); + return remoteStartProcess; + }) + .collect(Collectors.toList()); + + // 分批处理 + int startIndex = 0; // 从第 0 条开始 + int batchSize = 5; // 每批处理 5 条 + boolean flag = BatchProcessorUtil.processBatches(flowList, batchSize, startIndex, batch -> { + //批量新增部门区域数据 + remoteWorkflowService.startWorkFlowBatch(batch); + }); + + + return toAjax(flag); + } + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java index 80ac27e..33a382f 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java @@ -20,7 +20,7 @@ import java.util.List; */ @Data @EqualsAndHashCode(callSuper = true) -@TableName("business_alert") +@TableName(value = "business_alert",autoResultMap = true) public class BusinessAlert extends BaseEntity { @Serial @@ -63,11 +63,7 @@ public class BusinessAlert extends BaseEntity { */ private String images; - /** - * 识别类型 - */ - @TableField(value = "identify_type",typeHandler = JacksonTypeHandler.class) - private List identifyType; + /** * 纬度 @@ -79,6 +75,18 @@ public class BusinessAlert extends BaseEntity { */ private Long lng; + /** + * 标签名-英 + */ + + private String labelEn; + + /** + * 标签名-中 + */ + private String labelCn; + + /** * 预警类型 */ @@ -157,6 +165,25 @@ public class BusinessAlert extends BaseEntity { */ private String jobName; + /** + * 指派人员 + */ + private String assignUserId; + + + /** + * 指派人员名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "assignUserId") + @TableField(exist = false) + private String assignUserName; + + + /** + * 指派时间 + */ + private Date assignDate; + /** * 处理时间 */ @@ -229,4 +256,22 @@ public class BusinessAlert extends BaseEntity { @TableField(exist = false) private Long flowTaskId; + @TableField(exist = false) + private Long instanceId; + + @TableField(exist = false) + private Boolean button; + + @TableField(exist = false) + private String permissions; + + /** + * 显示处置人员已办理预警状态 + */ + @TableField(exist = false) + private String flowTaskStatus; + + @TableField(exist = false) + private String alertId; + } diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessOperation.java b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessOperation.java index 758ef1f..030b6f3 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessOperation.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessOperation.java @@ -61,5 +61,5 @@ public class BusinessOperation { */ private String deviceSn; - + private String tenantId; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessTask.java b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessTask.java index 8b3498b..7f45208 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessTask.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessTask.java @@ -8,6 +8,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import org.dromara.common.mybatis.core.domain.BaseEntity; +import java.awt.*; import java.io.Serial; import java.math.BigDecimal; import java.util.Date; @@ -29,10 +30,10 @@ public class BusinessTask extends BaseEntity { @TableId(value = "id") private Long id; - private BigDecimal lng; - - private BigDecimal lat; + @TableField(fill = FieldFill.INSERT) + private String polygonRegion; + private String verbalTrick; /** * 期望完成时间 */ @@ -42,18 +43,23 @@ public class BusinessTask extends BaseEntity { /** * 任务描述 * */ - private String explain; + @TableField(fill = FieldFill.INSERT) + private String demand; /** * 完成时间 * */ @TableField(fill = FieldFill.UPDATE) + private Date completeTime; /** *工单类型(0:拍照 1:喊话) * */ + @TableField(fill = FieldFill.INSERT) private String taskType; /** * 工单状态(0预约中 1 等待中,2执行中 3 未完成 4已完结 ) * */ private String status; + + private String tenantId; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java index b69c43b..00d3c61 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java @@ -1,5 +1,6 @@ package org.dromara.business.domain.bo; +import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.TableField; import org.dromara.business.domain.BusinessAlert; import org.dromara.common.mybatis.core.domain.BaseEntity; @@ -9,6 +10,9 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; + import java.util.Date; import java.util.List; @@ -46,10 +50,6 @@ public class BusinessAlertBo { */ private String images; - /** - * 识别类型 - */ - private List identifyType; /** * 纬度 @@ -194,9 +194,15 @@ public class BusinessAlertBo { List deptIdList; /** - * 识别类型集合 + * 标签名-英 + */ + private String labelEn; + + /** + * 标签名-中 */ - List alertTypeList; + private String labelCn; + /** * 年 @@ -216,5 +222,26 @@ public class BusinessAlertBo { private String createTime; + /** + * 岗位编码 + */ + private String postCode; + + /** + * 指派人员 + */ + private String assignUserId; + + + /** + * 指派人员名称 + */ + private String assignUserName; + + + /** + * 指派时间 + */ + private Date assignDate; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessHookBo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessHookBo.java new file mode 100644 index 0000000..02e6f42 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessHookBo.java @@ -0,0 +1,57 @@ +package org.dromara.business.domain.bo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(name = "流回调对象") +public class BusinessHookBo { + + @Schema(name = "流应用名") + private String app; + + @Schema(name = "TCP链接唯一ID") + private String id; + + @Schema(name = "播放器ip/推流器ip") + private String ip; + + @Schema(name = "播放url参数/推流url参数") + private String params; + + @Schema(name = "播放器端口号/推流器端口号") + private String port; + + @Schema(name = "播放的协议,可能是rtsp、rtmp、http") + private String schema; + + @Schema(name = "流ID") + private String stream; + + @Schema(name = "流虚拟主机") + private String vhost; + + @Schema(name = "服务器 id,通过配置文件设置") + private String mediaServerId; + + @Schema(name = "文件名") + private String file_name; + + @Schema(name = "文件绝对路径") + private String file_path; + + @Schema(name = "文件大小,单位字节") + private String file_size; + + @Schema(name = "文件所在目录路径") + private String folder; + + @Schema(name = "开始录制时间戳") + private Integer start_time; + + @Schema(name = "录制时长,单位秒") + private Float time_len; + + @Schema(name = "http/rtsp/rtmp点播相对url路径") + private String url; +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessOperationBo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessOperationBo.java index dbc5625..126dc38 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessOperationBo.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessOperationBo.java @@ -36,6 +36,8 @@ public class BusinessOperationBo { @NotNull(message = "工单id不能为空", groups = { AddGroup.class, EditGroup.class }) private Long taskId; + private String tenantId; + /** * 处理人id */ diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessTaskBo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessTaskBo.java index a35f6ad..390ac7e 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessTaskBo.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessTaskBo.java @@ -1,6 +1,7 @@ package org.dromara.business.domain.bo; +import com.alibaba.excel.annotation.ExcelProperty; import org.dromara.business.domain.BusinessTask; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.core.validate.AddGroup; @@ -9,6 +10,8 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; + +import java.awt.*; import java.util.Date; /** @@ -25,44 +28,36 @@ public class BusinessTaskBo extends BaseEntity { /** * */ - @NotNull(message = "不能为空", groups = { EditGroup.class }) - private Long id; - /** - * - */ - @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long lng; + private Long id; - /** - * - */ - @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long lat; + @NotNull(message = "地图不能为空", groups = { EditGroup.class }) + private String polygonRegion; /** * 工单类型(0:拍照 1:喊话) */ - @NotBlank(message = "工单类型(0:拍照 1:喊话)不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "工单类型 不能为空", groups = { AddGroup.class, EditGroup.class }) private String taskType; + private String verbalTrick; /** * 期望完成时间 */ @NotNull(message = "期望完成时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Date expectTime; + private String expectTime; /** * 说明 */ @NotBlank(message = "说明不能为空", groups = { AddGroup.class, EditGroup.class }) - private String explain; + private String demand; /** * 完成时间 */ - private Date completeTime; + private String completeTime; /** * 工单状态(0预约中 1 等待中,2执行中 3 未完成 4已完结 ) @@ -70,5 +65,11 @@ public class BusinessTaskBo extends BaseEntity { private String status; + private String startTime; + private String endTime; + + private String tenantId; + private String nickName; + private String deptName; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java index e228dd1..c70d16a 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java @@ -6,6 +6,8 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; 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.Serializable; @@ -58,10 +60,6 @@ public class BusinessAlertVo implements Serializable { private String images; - /** - * 识别类型 - */ - private List identifyType; /** * 纬度 @@ -75,6 +73,18 @@ public class BusinessAlertVo implements Serializable { @ExcelProperty(value = "精度") private Long lng; + /** + * 标签名-英 + */ + private String labelEn; + + /** + * 标签名-中 + */ + @ExcelProperty(value = "标签名-中") + private String labelCn; + + /** * 预警类型 */ @@ -225,4 +235,21 @@ public class BusinessAlertVo implements Serializable { @ExcelProperty(value = "来源:0:平台 1:小程序") private Long handleSource; + + /** + * 指派人员 + */ + private String assignUserId; + + + /** + * 指派人员名称 + */ + private String assignUserName; + + + /** + * 指派时间 + */ + private Date assignDate; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskVo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskVo.java index 8636030..3497403 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskVo.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskVo.java @@ -1,5 +1,6 @@ package org.dromara.business.domain.vo; +import java.awt.*; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; @@ -37,17 +38,7 @@ public class BusinessTaskVo implements Serializable { @ExcelProperty(value = "") private Long id; - /** - * - */ - @ExcelProperty(value = "") - private Long lng; - - /** - * - */ - @ExcelProperty(value = "") - private Long lat; + private String polygonRegion; /** * 工单类型(0:拍照 1:喊话) @@ -60,19 +51,20 @@ public class BusinessTaskVo implements Serializable { * 期望完成时间 */ @ExcelProperty(value = "期望完成时间") - private Date expectTime; + private String expectTime; + private String verbalTrick; /** * 说明 */ @ExcelProperty(value = "说明") - private String explain; + private String demand; /** * 完成时间 */ @ExcelProperty(value = "完成时间") - private Date completeTime; + private String completeTime; /** * 工单状态(0预约中 1 等待中,2执行中 3 未完成 4已完结 ) @@ -81,5 +73,10 @@ public class BusinessTaskVo implements Serializable { @ExcelDictFormat(readConverterExp = "0=预约中,1=,等=待中,2执行中,3=,未=完成,4=已完结") private String status; + @ExcelProperty(value = "完成时间") + private Long createBy; + private String nickName; + private Long createDept; + private String deptName; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/dubbo/RemoteBusinessAlertServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/dubbo/RemoteBusinessAlertServiceImpl.java index be01604..dc63dbb 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/dubbo/RemoteBusinessAlertServiceImpl.java +++ b/dk-modules/business/src/main/java/org/dromara/business/dubbo/RemoteBusinessAlertServiceImpl.java @@ -23,7 +23,7 @@ public class RemoteBusinessAlertServiceImpl implements RemoteBusinessAlertServic * @param flowStatus 流程状态 */ @Override - public void updateAlertStatus(String businessId, String flowStatus,Boolean isIllegal,String alertType) { - businessAlertService.updateAlertStatus(businessId,flowStatus,isIllegal,alertType); + public void updateAlertStatus(String businessId, String flowStatus,Boolean isIllegal,String alertType,String message,String assignName) { + businessAlertService.updateAlertStatus(businessId,flowStatus,isIllegal,alertType,message,assignName); } } diff --git a/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessAlertMapper.java b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessAlertMapper.java index 2fcee06..39b69b6 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessAlertMapper.java +++ b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessAlertMapper.java @@ -28,19 +28,17 @@ public interface BusinessAlertMapper extends BaseMapperPlus pageBusinessAlert(Page page, QueryWrapper ew); - @DataPermission( - @DataColumn(key = "deptName", value = "ba.dept_id") - ) + Page pageAlertFinish(Page page, QueryWrapper ew); - @DataPermission( - @DataColumn(key = "deptName", value = "ba.dept_id") - ) + /** + * 处理中 + * @param page + * @param ew + * @return + */ Page pageAlertTodo(Page page, QueryWrapper ew); - @DataPermission( - @DataColumn(key = "deptName", value = "ba.dept_id") - ) Page pageBusinessAlertCancel(Page build, QueryWrapper ew); @DataPermission( diff --git a/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessTaskMapper.java b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessTaskMapper.java index 5275417..ee4c0be 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessTaskMapper.java +++ b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessTaskMapper.java @@ -1,10 +1,17 @@ package org.dromara.business.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; import org.dromara.business.domain.BusinessTask; +import org.dromara.business.domain.bo.BusinessTaskBo; import org.dromara.business.domain.vo.BusinessTaskVo; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + + + /** * 工单预约Mapper接口 * @@ -15,4 +22,6 @@ public interface BusinessTaskMapper extends BaseMapperPlus queryPageList(@Param("page") Page page, @Param("bo") BusinessTaskBo bo); } diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java index 7d7d5a8..0be6d43 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java +++ b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java @@ -62,7 +62,7 @@ public interface IBusinessAlertService { * @param businessId * @param flowStatus */ - void updateAlertStatus(String businessId, String flowStatus,Boolean isIllegal,String alertType); + void updateAlertStatus(String businessId, String flowStatus,Boolean isIllegal,String alertType,String message,String assignName); TableDataInfo getInfo(BusinessAlertBo bo, PageQuery pageQuery, String alertCode); } diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java index aeca005..b22effd 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java @@ -18,16 +18,18 @@ import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.RemoteLabelPostService; +import org.dromara.system.api.domain.vo.RemoteAiLabelPostVo; import org.dromara.system.api.domain.vo.RemoteUserVo; -import org.dromara.system.api.model.PostDTO; import org.dromara.workflow.api.RemoteWorkflowService; import org.springframework.stereotype.Service; import java.lang.reflect.Method; import java.util.Collections; -import java.util.HashMap; +import java.util.Date; import java.util.List; import java.util.Map; +import java.util.*; /** * 预警任务Service业务层处理 @@ -44,6 +46,9 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { @DubboReference RemoteWorkflowService remoteWorkflowService; + @DubboReference + RemoteLabelPostService remoteLablePostService; + /** * 新增预警任务 * @@ -103,7 +108,7 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { * @param flowStatus */ @Override - public void updateAlertStatus(String businessId, String flowStatus,Boolean isIllegal,String alertType) { + public void updateAlertStatus(String businessId, String flowStatus,Boolean isIllegal,String alertType,String message,String assignName) { LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.set(BusinessAlert::getHandleType, BusinessStatusEnum.getByStatus(flowStatus).getStatus()); if (ObjectUtil.isNotEmpty(isIllegal)){ @@ -112,6 +117,17 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { if (ObjectUtil.isNotEmpty(alertType)){ wrapper.set(BusinessAlert::getAlertType, alertType); } + + if (ObjectUtil.isNotEmpty(message)){ + wrapper.set(BusinessAlert::getReason, message); + } + + //判断指派人员是否为空 + if (ObjectUtil.isNotEmpty(assignName)){ + wrapper.set(BusinessAlert::getAssignUserId, assignName); + wrapper.set(BusinessAlert::getAssignDate, new Date()); + } + wrapper.eq(BusinessAlert::getId, businessId); this.baseMapper.update(wrapper); @@ -144,6 +160,8 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { bo.setHandleType(BusinessStatusEnum.INVALID.getStatus()); QueryWrapper wrapper = buildQueryWrapper(bo); + wrapper.in("t.flowStatus", BusinessStatusEnum.INVALID.getStatus()); + Page page = this.baseMapper.pageBusinessAlertCancel(pageQuery.build(), wrapper); return TableDataInfo.build(page); @@ -159,9 +177,9 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { @Override public TableDataInfo pageBusinessAlertFinish(BusinessAlertBo bo, PageQuery pageQuery) { QueryWrapper wrapper = buildQueryWrapper(bo); - buildCommonQueryWrapper(wrapper); - wrapper.in("a.approver", LoginHelper.getUserId()); + wrapper.apply(" EXISTS(select * from dk_workflow.flow_his_task ht where ht.approver ='" + LoginHelper.getUserId() + "' and ht.instance_id = t.instanceId)"); + Page page = this.baseMapper.pageAlertFinish(pageQuery.build(), wrapper); return TableDataInfo.build(page); @@ -177,15 +195,13 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { @Override public TableDataInfo pageBusinessAlertTodo(BusinessAlertBo bo, PageQuery pageQuery) { QueryWrapper wrapper = buildQueryWrapper(bo); - buildCommonQueryWrapper(wrapper); - wrapper.eq("uu.del_flag", 0); - wrapper.in("uu.type", 1,2,3); - - wrapper.in("uu.processed_by", remoteWorkflowService.getPermissions()); - wrapper.in("b.flow_status", BusinessStatusEnum.WAITING.getStatus()); + wrapper.eq("t.node_type", 1); + wrapper.in("t.approver", remoteWorkflowService.getPermissions()); + wrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); Page page = this.baseMapper.pageAlertTodo(pageQuery.build(), wrapper); + List records = page.getRecords(); if (CollUtil.isNotEmpty(records)) { List taskIds = StreamUtils.toList(records, BusinessAlert::getFlowTaskId); @@ -198,6 +214,7 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { } }); } + return TableDataInfo.build(page); } @@ -211,34 +228,33 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { QueryWrapper wrapper = new QueryWrapper<>(); //根据当前用户职能获取识别类型 -// List posts = LoginHelper.getLoginUser().getPosts(); + List postVoList = remoteLablePostService.selectLabelByList(bo.getPostCode(), LoginHelper.getDeptId()); - //排除状态为验证状态预警 - wrapper.ne("ba.handle_type", BusinessStatusEnum.VERIFY.getStatus()); - if (ObjectUtil.isNotEmpty(bo.getAlertTypeList())){ - wrapper.in("ba.alert_type", bo.getAlertTypeList()); + if (ObjectUtil.isNotEmpty(postVoList)) { + wrapper.in("t.label_en",StreamUtils.toList(postVoList, RemoteAiLabelPostVo::getLabelEn)); } + //排除状态为验证状态预警 + wrapper.ne("t.handle_type", BusinessStatusEnum.VERIFY.getStatus()); + + if (ObjectUtil.isNotEmpty(bo.getHandleType())){ - wrapper.eq("ba.handle_type", bo.getHandleType()); + wrapper.eq("t.handle_type", bo.getHandleType()); + } + if (ObjectUtil.isNotEmpty(bo.getJobName())){ + wrapper.like("t.job_name", bo.getJobName()); } - wrapper.orderByAsc("ba.create_time"); + if (ObjectUtil.isNotEmpty(bo.getCreateTime())){ + wrapper.eq("DATE_FORMAT(t.create_time, '%Y-%m-%d')", bo.getCreateTime()); + } + + wrapper.orderByAsc("t.create_time"); return wrapper; } - /** - * 构建通用流程wrapper - * @param wrapper - */ - private void buildCommonQueryWrapper(QueryWrapper 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); - } /** * 保存前的数据校验 diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessTaskServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessTaskServiceImpl.java index a9c9302..d671a22 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessTaskServiceImpl.java +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessTaskServiceImpl.java @@ -1,5 +1,8 @@ package org.dromara.business.service.impl; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import org.dromara.business.domain.BusinessTask; import org.dromara.business.domain.bo.BusinessTaskBo; import org.dromara.business.domain.vo.BusinessTaskVo; @@ -13,9 +16,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.helper.DataPermissionHelper; +import org.dromara.system.api.model.LoginUser; import org.springframework.stereotype.Service; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Collection; @@ -52,8 +58,7 @@ public class BusinessTaskServiceImpl implements IBusinessTaskService { */ @Override public TableDataInfo queryPageList(BusinessTaskBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + Page result = baseMapper.queryPageList(pageQuery.build(),bo); return TableDataInfo.build(result); } @@ -72,11 +77,9 @@ public class BusinessTaskServiceImpl implements IBusinessTaskService { private LambdaQueryWrapper buildQueryWrapper(BusinessTaskBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getLng() != null, BusinessTask::getLng, bo.getLng()); - lqw.eq(bo.getLat() != null, BusinessTask::getLat, bo.getLat()); lqw.eq(StringUtils.isNotBlank(bo.getTaskType()), BusinessTask::getTaskType, bo.getTaskType()); lqw.eq(bo.getExpectTime() != null, BusinessTask::getExpectTime, bo.getExpectTime()); - lqw.eq(StringUtils.isNotBlank(bo.getExplain()), BusinessTask::getExplain, bo.getExplain()); + lqw.eq(StringUtils.isNotBlank(bo.getDemand()), BusinessTask::getDemand, bo.getDemand()); lqw.eq(bo.getCompleteTime() != null, BusinessTask::getCompleteTime, bo.getCompleteTime()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), BusinessTask::getStatus, bo.getStatus()); return lqw; @@ -90,7 +93,22 @@ public class BusinessTaskServiceImpl implements IBusinessTaskService { */ @Override public Boolean insertByBo(BusinessTaskBo bo) { + System.out.println("数据"+bo.getPolygonRegion()); + // 获取当前登录用户信息 + LoginUser currentUser = DataPermissionHelper.getVariable("user"); + bo.setCreateBy(currentUser.getUserId()); + bo.setNickName(currentUser.getNickname()); + bo.setCreateDept(currentUser.getDeptId()); + bo.setDeptName(currentUser.getDeptName()); + bo.setTenantId(currentUser.getTenantId()); + bo.setStatus("0"); + bo.setCreateTime(new Date()); + String jsonString = JSON.toJSONString(bo.getPolygonRegion()); BusinessTask add = MapstructUtils.convert(bo, BusinessTask.class); + add.setPolygonRegion(jsonString); + if(StrUtil.isNotBlank(bo.getExpectTime())){ + add.setExpectTime(Convert.toDate(bo.getExpectTime())); + } boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); diff --git a/dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml b/dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml index aca5e87..2dee8e9 100644 --- a/dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml +++ b/dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml @@ -18,52 +18,67 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" diff --git a/dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml b/dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml index 72e21e6..8c2e611 100644 --- a/dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml +++ b/dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml @@ -4,6 +4,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + + + + + + + + + + + diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/system/AiLabelController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/system/AiLabelController.java new file mode 100644 index 0000000..8b4fa47 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/system/AiLabelController.java @@ -0,0 +1,116 @@ +package org.dromara.system.controller.system; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.AiLabelVo; +import org.dromara.system.domain.bo.AiLabelBo; +import org.dromara.system.service.IAiLabelService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * ai 识别类型 + * 前端访问路由地址为:/system/label + * + * @author LionLi + * @date 2025-03-11 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/label") +public class AiLabelController extends BaseController { + + private final IAiLabelService aiLabelService; + + /** + * 查询ai 识别类型列表 + */ + @SaCheckPermission("system:label:list") + @GetMapping("/list") + public TableDataInfo list(AiLabelBo bo, PageQuery pageQuery) { + return aiLabelService.queryPageList(bo, pageQuery); + } + + /** + * 下拉框集合 + */ + @SaCheckPermission("system:label:list") + @GetMapping("/allList") + public List list() { + return aiLabelService.allList(); + } + + + /** + * 导出ai 识别类型列表 + */ + @SaCheckPermission("system:label:export") + @Log(title = "ai 识别类型", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(AiLabelBo bo, HttpServletResponse response) { + List list = aiLabelService.queryList(bo); + ExcelUtil.exportExcel(list, "ai 识别类型", AiLabelVo.class, response); + } + + /** + * 获取ai 识别类型详细信息 + * + * @param lableId 主键 + */ + @SaCheckPermission("system:label:query") + @GetMapping("/{lableId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long lableId) { + return R.ok(aiLabelService.queryById(lableId)); + } + + /** + * 新增ai 识别类型 + */ + @SaCheckPermission("system:label:add") + @Log(title = "ai 识别类型", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody AiLabelBo bo) { + return toAjax(aiLabelService.insertByBo(bo)); + } + + /** + * 修改ai 识别类型 + */ + @SaCheckPermission("system:label:edit") + @Log(title = "ai 识别类型", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody AiLabelBo bo) { + return toAjax(aiLabelService.updateByBo(bo)); + } + + /** + * 删除ai 识别类型 + * + * @param lableIds 主键串 + */ + @SaCheckPermission("system:label:remove") + @Log(title = "ai识别类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{lableIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] lableIds) { + return toAjax(aiLabelService.deleteWithValidByIds(List.of(lableIds), true)); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDepartBoundaryController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDepartBoundaryController.java index 53ba22a..1e0d558 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDepartBoundaryController.java +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDepartBoundaryController.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.domain.SysDepartBoundary ; import org.dromara.common.core.domain.R; import org.dromara.common.mybatis.core.page.PageQuery; @@ -35,6 +36,7 @@ public class SysDepartBoundaryController extends BaseController { @Operation(summary ="查询部门的地理位置",description = "查询部门的地理位置") @GetMapping(value = "/listJson") public R listJson(SysDepartBoundary departBoundary) { + departBoundary.setDeptId(String.valueOf(LoginHelper.getDeptId())); String listJson = departBoundaryService.listJson(departBoundary); return R.ok("查询成功!",listJson); } diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysPostController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysPostController.java index 1871183..6d580cb 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysPostController.java +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysPostController.java @@ -10,8 +10,12 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.AiLablePostBindBo; +import org.dromara.system.domain.bo.AiLabelPostBo; import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.AiLabelPostVo; import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.service.IAiLabelPostService; import org.dromara.system.service.ISysPostService; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -33,6 +37,7 @@ import java.util.List; public class SysPostController extends BaseController { private final ISysPostService postService; + private final IAiLabelPostService aiLablePostService; /** * 获取岗位列表 @@ -65,6 +70,32 @@ public class SysPostController extends BaseController { return R.ok(postService.selectPostById(postId)); } + /** + * 绑定标签 + */ + @SaCheckPermission("system:post:add") + @Log(title = "岗位管理-绑定标签", businessType = BusinessType.INSERT) + @PostMapping("/bindLable") + public void add(@Validated @RequestBody AiLablePostBindBo aiLablePostBindBo) { + for (Long labelId : aiLablePostBindBo.getLableIdList()) { + AiLabelPostBo ailablePost = new AiLabelPostBo(); + ailablePost.setPostId(aiLablePostBindBo.getPostId()); + ailablePost.setLableId(labelId); + aiLablePostService.insertByBo(ailablePost); + } + } + + /** + * 标签列表 + */ + @SaCheckPermission("system:post:list") + @GetMapping("/lableList") + public TableDataInfo lableList(AiLabelPostBo post, PageQuery pageQuery) { + return postService.lableList(post, pageQuery); + } + + + /** * 新增岗位 */ @@ -80,6 +111,7 @@ public class SysPostController extends BaseController { return toAjax(postService.insertPost(post)); } + /** * 修改岗位 */ diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/AiLabel.java b/dk-modules/system/src/main/java/org/dromara/system/domain/AiLabel.java new file mode 100644 index 0000000..fd21529 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/AiLabel.java @@ -0,0 +1,51 @@ +package org.dromara.system.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * ai 识别类型对象 ai_label + * + * @author LionLi + * @date 2025-03-11 + */ +@Data + +@TableName("ai_label") +public class AiLabel { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "label_id") + private Long labelId; + + /** + * 标签名-英 + */ + private String labelEn; + + /** + * 标签名-中 + */ + private String labelCn; + + /** + * 算法类型 + */ + private String aiType; + + /** + * 算法名称 + */ + private String aiName; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/AiLabelPost.java b/dk-modules/system/src/main/java/org/dromara/system/domain/AiLabelPost.java new file mode 100644 index 0000000..6a03a06 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/AiLabelPost.java @@ -0,0 +1,37 @@ +package org.dromara.system.domain; + + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + + +import java.io.Serial; + +/** + * 职能-标签关系对象 ai_lable_post + * + * @author LionLi + * @date 2025-03-11 + */ +@Data +@TableName("ai_label_post") +public class AiLabelPost { + + @Serial + private static final long serialVersionUID = 1L; + + @TableId(value = "id") + private Long id; + /** + * 标签id + */ + private Long labelId; + + /** + * 岗位id + */ + + private Long postId; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/SysDept.java b/dk-modules/system/src/main/java/org/dromara/system/domain/SysDept.java index 50d5e7b..e1f6cb0 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/domain/SysDept.java +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/SysDept.java @@ -87,4 +87,9 @@ public class SysDept extends TenantEntity { */ private String shpNo; + /** + * 是否需要指派 + */ + private Boolean assign; + } diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/bo/AiLabelBo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/AiLabelBo.java new file mode 100644 index 0000000..2b4fc9c --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/AiLabelBo.java @@ -0,0 +1,71 @@ +package org.dromara.system.domain.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import org.dromara.system.domain.AiLabel; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * ai 识别类型业务对象 ai_label + * + * @author LionLi + * @date 2025-03-11 + */ +@Data +@AutoMapper(target = AiLabel.class, reverseConvertGenerate = false) +public class AiLabelBo { + + /** + * 搜索值 + */ + @JsonIgnore + @TableField(exist = false) + private String searchValue; + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long labelId; + + /** + * 标签名-英 + */ + @NotBlank(message = "标签名-英不能为空", groups = { AddGroup.class, EditGroup.class }) + private String labelEn; + + /** + * 标签名-中 + */ + @NotBlank(message = "标签名-中不能为空", groups = { AddGroup.class, EditGroup.class }) + private String labelCn; + + /** + * 算法类型 + */ + + private String aiType; + + /** + * 算法名称 + */ + + private String aiName; + + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/bo/AiLabelPostBo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/AiLabelPostBo.java new file mode 100644 index 0000000..3bf049a --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/AiLabelPostBo.java @@ -0,0 +1,44 @@ +package org.dromara.system.domain.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonInclude; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.system.domain.AiLabelPost; +import org.dromara.common.core.validate.AddGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import jakarta.validation.constraints.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * 职能-标签关系业务对象 ai_lable_post + * + * @author LionLi + * @date 2025-03-11 + */ +@Data +@AutoMapper(target = AiLabelPost.class, reverseConvertGenerate = false) +public class AiLabelPostBo { + + /** + * 标签id + */ + @NotNull(message = "标签id不能为空", groups = { AddGroup.class , EditGroup.class }) + private Long lableId; + + /** + * 岗位id + */ + @NotNull(message = "岗位id不能为空" ) + private Long postId; + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/bo/AiLablePostBindBo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/AiLablePostBindBo.java new file mode 100644 index 0000000..c3ba11e --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/AiLablePostBindBo.java @@ -0,0 +1,23 @@ +package org.dromara.system.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +/** + * @auther yq + * @data 2025/3/11 + */ + +@Data +public class AiLablePostBindBo { + + @NotNull(message = "postId不能为空") + private Long postId; + + + @NotNull(message = "标签不能为空") + private List lableIdList; + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java index 7ec0687..bdec777 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java @@ -78,4 +78,9 @@ public class SysDeptBo extends BaseEntity { */ private String shpNo; + /** + * 是否指派 + */ + private Boolean assign; + } diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/vo/AiLabelPostVo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/AiLabelPostVo.java new file mode 100644 index 0000000..9337118 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/AiLabelPostVo.java @@ -0,0 +1,44 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.AiLabelPost; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 职能-标签关系视图对象 ai_lable_post + * + * @author LionLi + * @date 2025-03-11 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = AiLabelPost.class) +public class AiLabelPostVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 标签id + */ + private Long labelId; + + private String labelCn; + + private String labelEn; + + /** + * 岗位id + */ + + private Long postId; + + private String postName; + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/vo/AiLabelVo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/AiLabelVo.java new file mode 100644 index 0000000..3280c78 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/AiLabelVo.java @@ -0,0 +1,58 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.AiLabel; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * ai 识别类型视图对象 ai_label + * + * @author LionLi + * @date 2025-03-11 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = AiLabel.class) +public class AiLabelVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + // @ExcelProperty(value = "id") + private Long labelId; + + /** + * 标签名-英 + */ + @ExcelProperty(value = "标签名-英") + private String labelEn; + + /** + * 标签名-中 + */ + @ExcelProperty(value = "标签名-中") + private String labelCn; + + /** + * 算法类型 + */ + // @ExcelProperty(value = "算法类型") + private String aiType; + + /** + * 算法名称 + */ + // @ExcelProperty(value = "算法名称") + private String aiName; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteLabelPostServicelmpl.java b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteLabelPostServicelmpl.java new file mode 100644 index 0000000..ee494ad --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteLabelPostServicelmpl.java @@ -0,0 +1,56 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.system.api.RemoteLabelPostService; +import org.dromara.system.api.domain.vo.RemoteAiLabelPostVo; +import org.dromara.system.domain.AiLabel; +import org.dromara.system.domain.AiLabelPost; +import org.dromara.system.domain.vo.AiLabelPostVo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.service.IAiLabelPostService; +import org.dromara.system.service.IAiLabelService; +import org.dromara.system.service.ISysPostService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @auther yq + * @data 2025/3/12 + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteLabelPostServicelmpl implements RemoteLabelPostService { + + private final ISysPostService sysPostService; + private final IAiLabelPostService aiLabelPostService; + private final IAiLabelService aiLabelService; + + @Override + public List selectLabelByList(String postCode, Long deptId) { + //获取岗位只能Id + SysPostVo sysPostVo = sysPostService.selectLableByList(postCode, deptId); + if(sysPostVo != null){ + //根据岗位职能Id获取标签id + List aiLabelPostVos = aiLabelPostService.queryListByLabel(sysPostVo.getPostId()); + //根据标签id获取标签 + List aiLabelList = aiLabelService.queryListByLabel(StreamUtils.toList(aiLabelPostVos,AiLabelPost::getLabelId)); + return aiLabelList.stream() + .map(aiLabel -> { + RemoteAiLabelPostVo remoteAiLabelPostVo = new RemoteAiLabelPostVo(); + remoteAiLabelPostVo.setLableId(aiLabel.getLabelId()); + remoteAiLabelPostVo.setLabelEn(aiLabel.getLabelEn()); + remoteAiLabelPostVo.setLabelCn(aiLabel.getLabelCn()); + return remoteAiLabelPostVo; + }) + .collect(Collectors.toList()); + } + return new ArrayList<>(); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/AiLabelMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/AiLabelMapper.java new file mode 100644 index 0000000..2d69bb0 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/AiLabelMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.AiLabel; +import org.dromara.system.domain.vo.AiLabelVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * ai 识别类型Mapper接口 + * + * @author LionLi + * @date 2025-03-11 + */ +public interface AiLabelMapper extends BaseMapperPlus { + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/AiLabelPostMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/AiLabelPostMapper.java new file mode 100644 index 0000000..d01058e --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/AiLabelPostMapper.java @@ -0,0 +1,18 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.system.domain.AiLabelPost; +import org.dromara.system.domain.vo.AiLabelPostVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 职能-标签关系Mapper接口 + * + * @author LionLi + * @date 2025-03-11 + */ +public interface AiLabelPostMapper extends BaseMapperPlus { + Page selectAiLabelPostPage(@Param("page") Page page, @Param("ew") QueryWrapper wrapper); +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/SysPostMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/SysPostMapper.java index f9bf134..ce010cc 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/mapper/SysPostMapper.java +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/SysPostMapper.java @@ -33,4 +33,5 @@ public interface SysPostMapper extends BaseMapperPlus { */ List selectPostsByUserId(Long userId); + SysPostVo selectLableByList(@Param("postCode") String postCode, @Param("deptId") Long deptId); } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/IAiLabelPostService.java b/dk-modules/system/src/main/java/org/dromara/system/service/IAiLabelPostService.java new file mode 100644 index 0000000..d1c2bf2 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/IAiLabelPostService.java @@ -0,0 +1,71 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.AiLabelPost; +import org.dromara.system.domain.bo.AiLabelPostBo; +import org.dromara.system.domain.vo.AiLabelPostVo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 职能-标签关系Service接口 + * + * @author LionLi + * @date 2025-03-11 + */ +public interface IAiLabelPostService { + + /** + * 查询职能-标签关系 + * + * @param labelId 主键 + * @return 职能-标签关系 + */ + AiLabelPostVo queryById(Long labelId); + + /** + * 分页查询职能-标签关系列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 职能-标签关系分页列表 + */ + TableDataInfo queryPageList(AiLabelPostBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的职能-标签关系列表 + * + * @param bo 查询条件 + * @return 职能-标签关系列表 + */ + List queryList(AiLabelPostBo bo); + + /** + * 新增职能-标签关系 + * + * @param bo 职能-标签关系 + * @return 是否新增成功 + */ + Boolean insertByBo(AiLabelPostBo bo); + + /** + * 修改职能-标签关系 + * + * @param bo 职能-标签关系 + * @return 是否修改成功 + */ + Boolean updateByBo(AiLabelPostBo bo); + + /** + * 校验并批量删除职能-标签关系信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + List queryListByLabel(Long postId); +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/IAiLabelService.java b/dk-modules/system/src/main/java/org/dromara/system/service/IAiLabelService.java new file mode 100644 index 0000000..1d41595 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/IAiLabelService.java @@ -0,0 +1,75 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.AiLabel; +import org.dromara.system.domain.vo.AiLabelVo; +import org.dromara.system.domain.bo.AiLabelBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * ai 识别类型Service接口 + * + * @author LionLi + * @date 2025-03-11 + */ +public interface IAiLabelService { + + /** + * 查询ai 识别类型 + * + * @param labelId 主键 + * @return ai 识别类型 + */ + AiLabelVo queryById(Long labelId); + + List allList(); + + + + /** + * 分页查询ai 识别类型列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return ai 识别类型分页列表 + */ + TableDataInfo queryPageList(AiLabelBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的ai 识别类型列表 + * + * @param bo 查询条件 + * @return ai 识别类型列表 + */ + List queryList(AiLabelBo bo); + + /** + * 新增ai 识别类型 + * + * @param bo ai 识别类型 + * @return 是否新增成功 + */ + Boolean insertByBo(AiLabelBo bo); + + /** + * 修改ai 识别类型 + * + * @param bo ai 识别类型 + * @return 是否修改成功 + */ + Boolean updateByBo(AiLabelBo bo); + + /** + * 校验并批量删除ai 识别类型信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + List queryListByLabel(List labelIds); +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/ISysPostService.java b/dk-modules/system/src/main/java/org/dromara/system/service/ISysPostService.java index bc3d3de..1a3fec5 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/ISysPostService.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/ISysPostService.java @@ -2,7 +2,9 @@ package org.dromara.system.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.AiLabelPostBo; import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.AiLabelPostVo; import org.dromara.system.domain.vo.SysPostVo; import java.util.List; @@ -17,6 +19,7 @@ public interface ISysPostService { TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery); + TableDataInfo lableList(AiLabelPostBo bo, PageQuery pageQuery); /** * 查询岗位信息集合 * @@ -127,4 +130,5 @@ public interface ISysPostService { * @return 结果 */ List selectPostsByUserId(Long userId); + SysPostVo selectLableByList(String post_code, Long dept_id); } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/AiLabelServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/AiLabelServiceImpl.java new file mode 100644 index 0000000..05bea7e --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/AiLabelServiceImpl.java @@ -0,0 +1,145 @@ +package org.dromara.system.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.AiLabelBo; +import org.dromara.system.domain.vo.AiLabelVo; +import org.dromara.system.domain.AiLabel; +import org.dromara.system.mapper.AiLabelMapper; +import org.dromara.system.service.IAiLabelService; + +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * ai 识别类型Service业务层处理 + * + * @author LionLi + * @date 2025-03-11 + */ +@RequiredArgsConstructor +@Service +public class AiLabelServiceImpl implements IAiLabelService { + + private final AiLabelMapper baseMapper; + + /** + * 查询ai 识别类型 + * + * @param labelId 主键 + * @return ai 识别类型 + */ + @Override + public AiLabelVo queryById(Long labelId){ + return baseMapper.selectVoById(labelId); + } + + @Override + public List allList() { + return baseMapper.selectVoList().stream().sorted(Comparator.comparing(AiLabelVo::getLabelId)).toList(); + } + + /** + * 分页查询ai 识别类型列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return ai 识别类型分页列表 + */ + @Override + public TableDataInfo queryPageList(AiLabelBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的ai 识别类型列表 + * + * @param bo 查询条件 + * @return ai 识别类型列表 + */ + @Override + public List queryList(AiLabelBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(AiLabelBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getLabelEn()), AiLabel::getLabelEn, bo.getLabelEn()); + lqw.eq(StringUtils.isNotBlank(bo.getLabelCn()), AiLabel::getLabelCn, bo.getLabelCn()); + lqw.eq(StringUtils.isNotBlank(bo.getAiType()), AiLabel::getAiType, bo.getAiType()); + lqw.like(StringUtils.isNotBlank(bo.getAiName()), AiLabel::getAiName, bo.getAiName()); + return lqw; + } + + /** + * 新增ai 识别类型 + * + * @param bo ai 识别类型 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(AiLabelBo bo) { + AiLabel add = MapstructUtils.convert(bo, AiLabel.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setLabelId(add.getLabelId()); + } + return flag; + } + + /** + * 修改ai 识别类型 + * + * @param bo ai 识别类型 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(AiLabelBo bo) { + AiLabel update = MapstructUtils.convert(bo, AiLabel.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(AiLabel entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除ai 识别类型信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + @Override + public List queryListByLabel(List labelIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(AiLabel::getLabelId, labelIds); + return this.baseMapper.selectList(wrapper); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/AiLablePostServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/AiLablePostServiceImpl.java new file mode 100644 index 0000000..eabfd30 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/AiLablePostServiceImpl.java @@ -0,0 +1,140 @@ +package org.dromara.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.system.domain.AiLabelPost; +import org.dromara.system.domain.vo.AiLabelPostVo; +import org.dromara.system.mapper.AiLabelMapper; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.AiLabelPostBo; +import org.dromara.system.mapper.AiLabelPostMapper; +import org.dromara.system.service.IAiLabelPostService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 职能-标签关系Service业务层处理 + * + * @author LionLi + * @date 2025-03-11 + */ +@RequiredArgsConstructor +@Service +public class AiLablePostServiceImpl implements IAiLabelPostService { + + private final AiLabelPostMapper baseMapper; + private final AiLabelMapper aiLabelMapper; + + /** + * 查询职能-标签关系 + * + * @param lableId 主键 + * @return 职能-标签关系 + */ + @Override + public AiLabelPostVo queryById(Long lableId){ + return baseMapper.selectVoById(lableId); + } + + /** + * 分页查询职能-标签关系列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 职能-标签关系分页列表 + */ + @Override + public TableDataInfo queryPageList(AiLabelPostBo bo, PageQuery pageQuery) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("a.post_id", bo.getPostId()); + Page result = baseMapper.selectAiLabelPostPage(pageQuery.build(), queryWrapper); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的职能-标签关系列表 + * + * @param bo 查询条件 + * @return 职能-标签关系列表 + */ + @Override + public List queryList(AiLabelPostBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(AiLabelPostBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + return lqw; + } + + /** + * 新增职能-标签关系 + * + * @param bo 职能-标签关系 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(AiLabelPostBo bo) { + AiLabelPost add = MapstructUtils.convert(bo, AiLabelPost.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setLableId(add.getLabelId()); + } + return flag; + } + + /** + * 修改职能-标签关系 + * + * @param bo 职能-标签关系 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(AiLabelPostBo bo) { + AiLabelPost update = MapstructUtils.convert(bo, AiLabelPost.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(AiLabelPost entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除职能-标签关系信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + @Override + public List queryListByLabel(Long postId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + + wrapper.eq(AiLabelPost::getPostId, postId); + + return this.baseMapper.selectList(wrapper); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index d3179c5..2a16881 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -17,7 +17,9 @@ import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.system.domain.SysDept; import org.dromara.system.domain.SysPost; import org.dromara.system.domain.SysUserPost; +import org.dromara.system.domain.bo.AiLabelPostBo; import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.AiLabelPostVo; import org.dromara.system.domain.vo.SysPostVo; import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysPostMapper; @@ -37,7 +39,7 @@ import java.util.stream.Collectors; @RequiredArgsConstructor @Service public class SysPostServiceImpl implements ISysPostService { - + private final AiLablePostServiceImpl aiLablePostService; private final SysPostMapper baseMapper; private final SysDeptMapper deptMapper; private final SysUserPostMapper userPostMapper; @@ -48,6 +50,11 @@ public class SysPostServiceImpl implements ISysPostService { return TableDataInfo.build(page); } + @Override + public TableDataInfo lableList(AiLabelPostBo bo, PageQuery pageQuery) { + return aiLablePostService.queryPageList(bo,pageQuery); + } + /** * 查询岗位信息集合 * @@ -244,4 +251,9 @@ public class SysPostServiceImpl implements ISysPostService { public List selectPostsByUserId(Long userId) { return baseMapper.selectPostsByUserId(userId); } + + @Override + public SysPostVo selectLableByList(String postCode, Long deptId) { + return baseMapper.selectLableByList(postCode,deptId); + } } diff --git a/dk-modules/system/src/main/resources/mapper/system/AiLabelMapper.xml b/dk-modules/system/src/main/resources/mapper/system/AiLabelMapper.xml new file mode 100644 index 0000000..fdc71dd --- /dev/null +++ b/dk-modules/system/src/main/resources/mapper/system/AiLabelMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/dk-modules/system/src/main/resources/mapper/system/AiLabelPostMapper.xml b/dk-modules/system/src/main/resources/mapper/system/AiLabelPostMapper.xml new file mode 100644 index 0000000..979d018 --- /dev/null +++ b/dk-modules/system/src/main/resources/mapper/system/AiLabelPostMapper.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/dk-modules/system/src/main/resources/mapper/system/SysPostMapper.xml b/dk-modules/system/src/main/resources/mapper/system/SysPostMapper.xml index 322403f..77615e6 100644 --- a/dk-modules/system/src/main/resources/mapper/system/SysPostMapper.xml +++ b/dk-modules/system/src/main/resources/mapper/system/SysPostMapper.xml @@ -25,5 +25,9 @@ left join sys_user u on u.user_id = up.user_id where u.user_id = #{userId} + diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java index 3db2857..c14c474 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwDefinitionController.java @@ -198,5 +198,4 @@ public class FlwDefinitionController extends BaseController { public R active(@PathVariable Long id, @RequestParam boolean active) { return R.ok(active ? defService.active(id) : defService.unActive(id)); } - } diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwDepartController.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwDepartController.java new file mode 100644 index 0000000..848ce37 --- /dev/null +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwDepartController.java @@ -0,0 +1,46 @@ +package org.dromara.workflow.controller; + + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.domain.FlowDepart; +import org.dromara.workflow.service.FlwDepartService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +@Tag(name = "流程部门管理") +@ConditionalOnEnable +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/depart") +public class FlwDepartController { + + + private final FlwDepartService flwDepartService; + + /** + * 查询流程部门关系 + * flowCode + */ + @Operation(summary = "查询流程部门关系",description = "查询流程部门关系") + @GetMapping("/{flowCode}/getInfo") + public R getInfo(@PathVariable String flowCode) { + return R.ok(flwDepartService.getInfo(flowCode)); + } + + + /** + * 绑定流程部门关系 + * flowCode + */ + @Operation(summary = "绑定流程部门关系",description = "绑定流程部门关系") + @PostMapping("/bind/depart") + public R bindDepart(@Validated({AddGroup.class}) @RequestBody FlowDepart flowDepart) { + return R.ok(flwDepartService.bindDepart(flowDepart)); + } +} diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 2618ade..33aaf67 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -65,6 +65,21 @@ public class FlwTaskController extends BaseController { return toAjax(flwTaskService.completeTask(completeTaskBo)); } + /** + * 任务操作 + * + * @param bo 参数 + * @param taskOperation 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature + */ + @Operation(summary = "任务操作",description = "任务操作",parameters = { + @Parameter(name = "taskOperation", description = "操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature") + }) + @RepeatSubmit + @PostMapping("/taskOperation/{taskOperation}") + public R taskOperation(@Validated @RequestBody TaskOperationBo bo, @PathVariable String taskOperation) { + return toAjax(flwTaskService.taskOperation(bo, taskOperation)); + } + /** * 查询当前用户的待办任务 * @@ -148,21 +163,6 @@ public class FlwTaskController extends BaseController { return R.ok(flwTaskService.terminationTask(bo)); } - /** - * 任务操作 - * - * @param bo 参数 - * @param taskOperation 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature - */ - @Operation(summary = "任务操作",description = "任务操作",parameters = { - @Parameter(name = "taskOperation", description = "操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature") - }) - @RepeatSubmit - @PostMapping("/taskOperation/{taskOperation}") - public R taskOperation(@Validated @RequestBody TaskOperationBo bo, @PathVariable String taskOperation) { - return toAjax(flwTaskService.taskOperation(bo, taskOperation)); - } - /** * 修改任务办理人 * diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/FlowDepart.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/FlowDepart.java new file mode 100644 index 0000000..a2e3fb1 --- /dev/null +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/FlowDepart.java @@ -0,0 +1,48 @@ +package org.dromara.workflow.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.workflow.handler.ListTypeHandler; + +import java.util.List; + +/** + * 部门流程关系表 + */ +@Data +@TableName(value = "flow_depart",autoResultMap = true) +public class FlowDepart { + + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** + * 流程类型 + */ + @NotNull(message = "流程类型不能为空", groups = AddGroup.class) + private String flowType; + + /** + * 流程编码 + */ + @NotNull(message = "流程编码不能为空", groups = AddGroup.class) + private String flowCode; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 部门id集合 + */ + @NotNull(message = "部门id不能为空", groups = AddGroup.class) + @TableField(value = "dept_ids",typeHandler = ListTypeHandler.class) + List departIds; +} diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java index 3117a33..4c6a8ff 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java @@ -56,11 +56,22 @@ public class BackProcessBo implements Serializable { */ private String notice; + /** * 流程变量 */ private Map variables; + /** + * 预警类型 + */ + private String alertType; + + /** + * 是否违建 + */ + private Boolean isIllegal; + public Map getVariables() { if (variables == null) { return new HashMap<>(16); diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 9fdf484..7a626a3 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -64,6 +64,36 @@ public class CompleteTaskBo implements Serializable { */ private String ext; + /** + * 预警类型 + */ + private String alertType; + + /** + * 是否违建 + */ + private Boolean isIllegal; + + /** + * 选择其他的时候内容 + */ + private String alertTypeContent; + + /** + * 网关判断(是否需要介入) + */ + private Boolean flag = true; + + /** + * 动态负责人 + */ + private String handler; + + /** + * 是否需要指派 + */ + private Boolean assign = false; + public Map getVariables() { if (variables == null) { return new HashMap<>(16); diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java index 4348e31..936ded1 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/TaskOperationBo.java @@ -45,4 +45,19 @@ public class TaskOperationBo implements Serializable { */ private String message; + /** + * 预警类型 + */ + private String alertType; + + /** + * 是否违建 + */ + private Boolean isIllegal; + + /** + * 选择其他的时候内容 + */ + private String alertTypeContent; + } diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/dubbo/RemoteWorkflowServiceImpl.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/dubbo/RemoteWorkflowServiceImpl.java index f9def49..c5e2d02 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/dubbo/RemoteWorkflowServiceImpl.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/dubbo/RemoteWorkflowServiceImpl.java @@ -1,9 +1,11 @@ package org.dromara.workflow.dubbo; +import cn.dev33.satoken.stp.StpUtil; import lombok.RequiredArgsConstructor; 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.domain.FlowDepartVo; import org.dromara.workflow.api.domain.RemoteCompleteTask; import org.dromara.workflow.api.domain.RemoteStartProcess; import org.dromara.workflow.api.domain.RemoteStartProcessReturn; @@ -13,6 +15,9 @@ import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * RemoteWorkflowServiceImpl @@ -29,6 +34,8 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService { private final IFlwTaskService flwTaskService; + private static final ExecutorService executor = Executors.newFixedThreadPool(10); + @Override public boolean deleteInstance(List businessIds) { return workflowService.deleteInstance(businessIds); @@ -69,6 +76,11 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService { return workflowService.startWorkFlow(startProcess); } + @Override + public Boolean startWorkFlowBatch(List startProcess) { + return workflowService.startWorkFlowBatch(startProcess); + } + @Override public Map> currentTaskAllUser(List taskIds) { return flwTaskService.currentTaskAllUser(taskIds); @@ -84,6 +96,16 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService { return workflowService.processInvalid(instanceId); } + @Override + public List currentTaskAllUser(Long taskId) { + return workflowService.currentTaskAllUser(taskId); + } + + @Override + public FlowDepartVo getFlowDepart(Long deptId) { + return flwTaskService.getFlowDepart(deptId); + } + @Override public boolean completeTask(RemoteCompleteTask completeTask) { return workflowService.completeTask(completeTask); diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java index ee5afe9..2a6b8c5 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java @@ -3,12 +3,14 @@ package org.dromara.workflow.handler; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.warm.flow.core.dto.FlowParams; 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.springframework.stereotype.Component; +import java.util.HashMap; import java.util.Map; /** @@ -51,7 +53,7 @@ public class FlowProcessEventHandler { * @param taskId 任务id * @param businessId 业务id */ - public void processCreateTaskHandler(String flowCode, String nodeCode, Long taskId, String businessId) { + public void processCreateTaskHandler(String flowCode, String nodeCode, Long taskId, String businessId, Map variable, String message) { String tenantId = TenantHelper.getTenantId(); log.info("发布流程任务事件, 租户ID: {}, 流程编码: {}, 节点编码: {}, 任务ID: {}, 业务ID: {}", tenantId, flowCode, nodeCode, taskId, businessId); ProcessCreateTaskEvent processCreateTaskEvent = new ProcessCreateTaskEvent(); @@ -60,6 +62,8 @@ public class FlowProcessEventHandler { processCreateTaskEvent.setNodeCode(nodeCode); processCreateTaskEvent.setTaskId(taskId); processCreateTaskEvent.setBusinessId(businessId); + processCreateTaskEvent.setParams(variable); + processCreateTaskEvent.setMessage(message); SpringUtils.context().publishEvent(processCreateTaskEvent); } diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/FlwAlertHandler.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/FlwAlertHandler.java index d17dde1..3554140 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/FlwAlertHandler.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/FlwAlertHandler.java @@ -1,5 +1,6 @@ package org.dromara.workflow.handler; +import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; import org.dromara.business.api.RemoteBusinessAlertService; @@ -12,6 +13,8 @@ import org.dromara.workflow.common.handler.FlwCommonHandler; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; +import java.util.Map; + /** * 流程预警扩展业务 */ @@ -31,7 +34,7 @@ public class FlwAlertHandler implements FlwCommonHandler { @EventListener(condition = "#processEvent.flowCode.startsWith('alert')") @Override public void processHandler(ProcessEvent processEvent) { - alertService.updateAlertStatus(processEvent.getBusinessId(),processEvent.getStatus(),processEvent.getIsIllegal(),processEvent.getAlertType()); + alertService.updateAlertStatus(processEvent.getBusinessId(),processEvent.getStatus(),processEvent.getIsIllegal(),processEvent.getAlertType(),null,null); } /** @@ -43,7 +46,12 @@ public class FlwAlertHandler implements FlwCommonHandler { @EventListener(condition = "#processCreateTaskEvent.flowCode.startsWith('alert')") @Override public void processCreateTaskHandler(ProcessCreateTaskEvent processCreateTaskEvent) { - alertService.updateAlertStatus(processCreateTaskEvent.getBusinessId(), BusinessStatusEnum.WAITING.getStatus(),processCreateTaskEvent.getIsIllegal(),processCreateTaskEvent.getAlertType()); + String assignName = null; + if (ObjectUtil.isNotEmpty(processCreateTaskEvent.getParams())){ + assignName = ObjectUtil.isNotEmpty(processCreateTaskEvent.getParams().get("handler"))?(String)processCreateTaskEvent.getParams().get("handler"):null; + } + + alertService.updateAlertStatus(processCreateTaskEvent.getBusinessId(), BusinessStatusEnum.WAITING.getStatus(),processCreateTaskEvent.getIsIllegal(),processCreateTaskEvent.getAlertType(),processCreateTaskEvent.getMessage(),assignName); } /** diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/ListTypeHandler.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/ListTypeHandler.java new file mode 100644 index 0000000..f63591d --- /dev/null +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/ListTypeHandler.java @@ -0,0 +1,51 @@ +package org.dromara.workflow.handler; + +import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; +import org.dromara.workflow.utils.JsonUtil; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes({List.class}) +public class ListTypeHandler implements TypeHandler> { + + @Override + public void setParameter(PreparedStatement ps, int i, List list, JdbcType jdbcType) throws SQLException { + ps.setString(i, JsonUtil.toJson(list)); + } + + @Override + public List getResult(ResultSet rs, String columnName) throws SQLException { + if (StringUtils.isBlank(rs.getString(columnName))) { + return new ArrayList<>(); + } + return JsonUtil.jsonToList(rs.getString(columnName), Long.class); + } + + @Override + public List getResult(ResultSet rs, int columnIndex) throws SQLException { + if (StringUtils.isBlank(rs.getString(columnIndex))) { + return new ArrayList<>(); + } + return JsonUtil.jsonToList(rs.getString(columnIndex), Long.class); + } + + @Override + public List getResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + + if (StringUtils.isBlank(value)) { + return new ArrayList<>(); + } + return JsonUtil.jsonToList(value, Long.class); + } +} diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java index fcda1f0..9fbe450 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java @@ -41,7 +41,7 @@ public class WorkflowPermissionHandler implements PermissionHandler { return new ArrayList<>(); } // 使用一个流来构建权限列表 - return Stream.of( + List permissionList = Stream.of( // 角色权限前缀 loginUser.getRoles().stream() .map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), @@ -58,6 +58,9 @@ public class WorkflowPermissionHandler implements PermissionHandler { ) .flatMap(stream -> stream) .collect(Collectors.toList()); + + permissionList.add("${handler}"); + return permissionList; } /** diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index 272f9de..5d6202b 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -50,9 +50,11 @@ public class WorkflowGlobalListener implements GlobalListener { String businessId = instance.getBusinessId(); String flowStatus = instance.getFlowStatus(); Task task = listenerVariable.getTask(); + Map variable = listenerVariable.getVariable(); + FlowParams flowParams = listenerVariable.getFlowParams(); if (task != null && BusinessStatusEnum.WAITING.getStatus().equals(flowStatus)) { // 判断流程状态(发布审批中事件) - flowProcessEventHandler.processCreateTaskHandler(definition.getFlowCode(), task.getNodeCode(), task.getId(), businessId); + flowProcessEventHandler.processCreateTaskHandler(definition.getFlowCode(), task.getNodeCode(), task.getId(), businessId,variable,flowParams.getMessage()); } } diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/mapper/FlwDepartMapper.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/mapper/FlwDepartMapper.java new file mode 100644 index 0000000..56e6de2 --- /dev/null +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/mapper/FlwDepartMapper.java @@ -0,0 +1,15 @@ +package org.dromara.workflow.mapper; + +import jakarta.validation.constraints.NotNull; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.workflow.domain.FlowDepart; + +import java.util.List; +import java.util.Map; + +public interface FlwDepartMapper extends BaseMapperPlus { + FlowDepart getFlowDepart(@Param("deptId") Long deptId); + + Integer checkFlowDepart(@Param("deptIds") List departIds); +} diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java index fd86c82..fa31d6c 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java @@ -5,10 +5,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; +import org.dromara.warm.flow.orm.entity.FlowNode; import org.dromara.workflow.domain.bo.FlowTaskBo; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; +import java.util.LinkedList; import java.util.List; @@ -54,4 +56,5 @@ public interface FlwTaskMapper { * @return 结果 */ Page getTaskCopyByPage(@Param("page") Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + } diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/service/FlwDepartService.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/FlwDepartService.java new file mode 100644 index 0000000..c8c478a --- /dev/null +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/FlwDepartService.java @@ -0,0 +1,11 @@ +package org.dromara.workflow.service; + +import org.dromara.workflow.domain.FlowDepart; + +public interface FlwDepartService { + FlowDepart getInfo(String flowCode); + + FlowDepart bindDepart(FlowDepart flowDepart); + + FlowDepart getFlowDepart(Long deptId); +} diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 4dda912..e21c6c8 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -8,12 +8,15 @@ 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.FlowNode; import org.dromara.warm.flow.orm.entity.FlowTask; +import org.dromara.workflow.api.domain.FlowDepartVo; import org.dromara.workflow.api.domain.RemoteStartProcessReturn; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -200,4 +203,19 @@ public interface IFlwTaskService { * 返回当前用户权限集合 */ List getPermissions(); + + /** + * 获取所有审批节点 + * @param nodeCode + * @param definitionId + * @return + */ + List getByNodeCodes(String nodeCode,Long definitionId); + + /** + * 根据部门获取流程 + * @param deptId + * @return + */ + FlowDepartVo getFlowDepart(Long deptId); } diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/service/WorkflowService.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/WorkflowService.java index 8894d51..e970236 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/service/WorkflowService.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/WorkflowService.java @@ -1,5 +1,6 @@ package org.dromara.workflow.service; +import org.dromara.system.api.domain.vo.RemoteUserVo; import org.dromara.workflow.api.domain.RemoteCompleteTask; import org.dromara.workflow.api.domain.RemoteStartProcess; import org.dromara.workflow.api.domain.RemoteStartProcessReturn; @@ -90,4 +91,14 @@ public interface WorkflowService { * @return */ boolean processInvalid(Long instanceId); + + List currentTaskAllUser(Long taskId); + + /** + * 批量启动流程 + * + * @param startProcess 参数 + * @return 结果 + */ + Boolean startWorkFlowBatch(List startProcess); } diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwDepartServiceImpl.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwDepartServiceImpl.java new file mode 100644 index 0000000..5cfb40c --- /dev/null +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwDepartServiceImpl.java @@ -0,0 +1,49 @@ +package org.dromara.workflow.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.workflow.domain.FlowDepart; +import org.dromara.workflow.mapper.FlwDepartMapper; +import org.dromara.workflow.service.FlwDepartService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class FlwDepartServiceImpl extends ServiceImpl implements FlwDepartService { + + + @Override + public FlowDepart getInfo(String flowCode) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(FlowDepart::getFlowCode, flowCode); + + return this.baseMapper.selectOne(wrapper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public FlowDepart bindDepart(FlowDepart flowDepart) { + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.eq(FlowDepart::getFlowCode, flowDepart.getFlowCode()); + this.baseMapper.delete(updateWrapper); + + //查询部门是否还存在别的流程 + if (this.baseMapper.checkFlowDepart(flowDepart.getDepartIds()) > 0){ + throw new ServiceException("所选的部门中,已存在在其他流程中,请检查后在提交!"); + } + + this.baseMapper.insert(flowDepart); + + return flowDepart; + } + + @Override + public FlowDepart getFlowDepart(Long deptId) { + return this.baseMapper.getFlowDepart(deptId); + } +} diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index f047148..e149a0d 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; @@ -12,6 +13,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; 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.common.core.exception.ServiceException; import org.dromara.common.core.utils.SpringUtils; @@ -38,11 +40,13 @@ import org.dromara.warm.flow.orm.entity.*; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; +import org.dromara.workflow.api.domain.FlowDepartVo; import org.dromara.workflow.api.domain.RemoteStartProcessReturn; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.MessageTypeEnum; import org.dromara.workflow.common.enums.TaskAssigneeType; import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.dromara.workflow.domain.FlowDepart; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; @@ -50,8 +54,10 @@ import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.handler.WorkflowPermissionHandler; import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.mapper.FlwTaskMapper; +import org.dromara.workflow.service.FlwDepartService; import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.utils.WorkflowUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; @@ -88,13 +94,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final FlowProcessEventHandler flowProcessEventHandler; private final FlwTaskMapper flwTaskMapper; private final FlwCategoryMapper flwCategoryMapper; - + private final FlwDepartService flwDepartService; @DubboReference private RemoteUserService remoteUserService; - @DubboReference(stub = "true") - private final RemoteMessageService remoteMessageService; - @Autowired private ApplicationContext applicationContext; @@ -129,6 +132,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { FlowParams flowParams = new FlowParams(); flowParams.flowCode(startProcessBo.getFlowCode()); flowParams.variable(startProcessBo.getVariables()); + + flowParams.flowStatus(BusinessStatusEnum.DRAFT.getStatus()); Instance instance; try { @@ -145,7 +150,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService { dto.setProcessInstanceId(instance.getId()); dto.setTaskId(taskList.get(0).getId()); - //创建任务 executeTask(taskList.get(0).getId()); return dto; } @@ -178,11 +182,26 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } // 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息 FlowParams flowParams = new FlowParams(); - flowParams.variable(completeTaskBo.getVariables()); + + Map variables = completeTaskBo.getVariables(); + // 流程变量 + variables.put("flag",completeTaskBo.getFlag()); + variables.put("assign",completeTaskBo.getAssign()); + variables.put("handler", completeTaskBo.getHandler()); + + flowParams.variable(variables); flowParams.skipType(SkipType.PASS.getKey()); flowParams.message(completeTaskBo.getMessage()); flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.PASS.getStatus()); + // 构建 JSON 对象 + JSONObject extJson = new JSONObject(); + extJson.put("isIllegal", ObjectUtil.isNotEmpty(completeTaskBo.getIsIllegal())?completeTaskBo.getIsIllegal():false); + extJson.put("alertType", completeTaskBo.getAlertType()); + extJson.put("alertTypeContent", completeTaskBo.getAlertTypeContent()); + + flowParams.ext(extJson.toJSONString()); + flowParams.hisTaskExt(completeTaskBo.getFileId()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 Instance instance = taskService.skip(taskId, flowParams); @@ -304,6 +323,19 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return SpringUtils.getBean(WorkflowPermissionHandler.class).permissions(); } + @Override + public List getByNodeCodes(String nodeCode, Long definitionId) { + return nodeService.getByNodeCodes(Collections.singletonList(nodeCode), definitionId); + } + + @Override + public FlowDepartVo getFlowDepart(Long deptId) { + FlowDepart flowDepart = flwDepartService.getFlowDepart(deptId); + FlowDepartVo flowDepartVo = new FlowDepartVo(); + BeanUtils.copyProperties(flowDepart, flowDepartVo); + return flowDepartVo; + } + /** * 查询当前用户的已办任务 * @@ -587,6 +619,15 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Transactional(rollbackFor = Exception.class) public boolean taskOperation(TaskOperationBo bo, String taskOperation) { FlowParams flowParams = new FlowParams(); + + // 构建 JSON 对象 + JSONObject extJson = new JSONObject(); + extJson.put("isIllegal", ObjectUtil.isNotEmpty(bo.getIsIllegal())?bo.getIsIllegal():false); + extJson.put("alertType", bo.getAlertType()); + extJson.put("alertTypeContent", bo.getAlertTypeContent()); + + flowParams.ext(extJson.toJSONString()); + flowParams.message(bo.getMessage()); if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) { flowParams.ignore(true); diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index 48864b8..d113438 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -3,7 +3,10 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.StringUtils; +import org.dromara.system.api.domain.vo.RemoteUserVo; +import org.dromara.warm.flow.core.entity.Node; import org.dromara.warm.flow.orm.entity.FlowInstance; import org.dromara.workflow.api.domain.RemoteCompleteTask; import org.dromara.workflow.api.domain.RemoteStartProcess; @@ -16,10 +19,14 @@ import org.dromara.workflow.service.IFlwDefinitionService; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.service.WorkflowService; +import org.dromara.workflow.utils.BatchProcessorUtil; import org.springframework.stereotype.Service; +import java.lang.reflect.Field; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 通用 工作流服务实现 @@ -29,6 +36,7 @@ import java.util.Map; @ConditionalOnEnable @RequiredArgsConstructor @Service +@Slf4j public class WorkflowServiceImpl implements WorkflowService { private final IFlwInstanceService flwInstanceService; @@ -142,4 +150,21 @@ public class WorkflowServiceImpl implements WorkflowService { flowInvalidBo.setId(instanceId); return flwInstanceService.processInvalid(flowInvalidBo); } + + @Override + public List currentTaskAllUser(Long taskId) { + return flwTaskService.currentTaskAllUser(taskId); + } + + @Override + public Boolean startWorkFlowBatch(List startProcess) { + try { + startProcess.forEach(startProcessBo -> { + flwTaskService.startWorkFlow(BeanUtil.toBean(startProcessBo, StartProcessBo.class)); + }); + } catch (Exception e) { + return false; + } + return true; + } } diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/utils/BatchProcessorUtil.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/utils/BatchProcessorUtil.java new file mode 100644 index 0000000..34f68ab --- /dev/null +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/utils/BatchProcessorUtil.java @@ -0,0 +1,39 @@ +package org.dromara.workflow.utils; + +import java.util.List; +import java.util.function.Consumer; + +/** + * 分批处理工具类 + */ +public class BatchProcessorUtil { + + /** + * 分批处理数据 + * + * @param dataList 数据集合 + * @param batchSize 每批处理的数据量 + * @param startIndex 起始位置 + * @param batchHandler 每批数据的处理逻辑 + * @return 下一次的起始位置 + */ + public static boolean processBatches(List dataList, int batchSize, int startIndex, Consumer> batchHandler) { + if (dataList == null || dataList.isEmpty()) { + return true; // 数据为空,直接返回当前起始位置 + } + + int totalSize = dataList.size(); + while (startIndex < totalSize) { + int endIndex = Math.min(startIndex + batchSize, totalSize); + List batch = dataList.subList(startIndex, endIndex); + + // 处理当前批次的数据 + batchHandler.accept(batch); + + // 更新起始位置 + startIndex = endIndex; + } + + return startIndex >= totalSize; // 返回下一次的起始位置 + } +} diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/utils/JsonUtil.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/utils/JsonUtil.java new file mode 100644 index 0000000..e11692e --- /dev/null +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/utils/JsonUtil.java @@ -0,0 +1,126 @@ +package org.dromara.workflow.utils; + +import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang3.StringUtils; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 定义响应结构 + */ +public class JsonUtil { + + private static ObjectMapper MAPPER; + static{ + MAPPER=new ObjectMapper(); + } + + /** + * 将对象转换成json字符串。 + * @param data + * @return + */ + public static String toJson(Object data){ + String string = null; + try { + string = MAPPER.writeValueAsString(data); + if(StringUtils.isEmpty(string)){ + return null; + } + return string; + } catch (JsonProcessingException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 将json结果集转化为对象 + * + * @param jsonData json数据 + * @return + */ + public static T jsonToPojo(String jsonData, Class beanType) { + try { + T t = MAPPER.readValue(jsonData, beanType); + return t; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 将json数据转换成pojo对象list + *

Title: jsonToList

+ *

Description:

+ * @param jsonData + * @param beanType + * @return + */ + public static List jsonToList(String jsonData, Class beanType) { + JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); + try { + List list = MAPPER.readValue(jsonData, javaType); + return list; + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + /** + * 将Object对象里面的属性和值转化成Map对象 + * + * @param obj + * @return + * @throws IllegalAccessException + */ + public static Map objectToMap(Object obj){ + try { + Map map = new HashMap(); + Class clazz = obj.getClass(); + for (Field field : clazz.getDeclaredFields()) { + field.setAccessible(true); + String fieldName = field.getName(); + if(ObjectUtil.isNotEmpty(field.get(obj))){ + Object value = field.get(obj); + map.put(fieldName, value); + }else{ + map.put(fieldName, ""); + } + } + return map; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static Map jsonToMap(String json){ + try { + return MAPPER.readValue(json, new TypeReference>(){}); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return null; + } + } + + public static LinkedHashMap jsonToStrMap(String json){ + try { + return MAPPER.readValue(json, new TypeReference>(){}); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/dk-modules/workflow/src/main/resources/mapper/workflow/FlwDepartMapper.xml b/dk-modules/workflow/src/main/resources/mapper/workflow/FlwDepartMapper.xml new file mode 100644 index 0000000..e8d2908 --- /dev/null +++ b/dk-modules/workflow/src/main/resources/mapper/workflow/FlwDepartMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + +