diff --git a/dk-api/api-bom/pom.xml b/dk-api/api-bom/pom.xml index e989a65..3e6a7b4 100644 --- a/dk-api/api-bom/pom.xml +++ b/dk-api/api-bom/pom.xml @@ -41,6 +41,12 @@ ${revision} + + org.dromara + api-business + ${revision} + + diff --git a/dk-api/api-business/pom.xml b/dk-api/api-business/pom.xml new file mode 100644 index 0000000..ea00ddb --- /dev/null +++ b/dk-api/api-business/pom.xml @@ -0,0 +1,26 @@ + + + + org.dromara + dk-api + ${revision} + + 4.0.0 + + api-business + + api-business业务接口模块 + + + + + + + org.dromara + common-core + + + + 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 new file mode 100644 index 0000000..d475630 --- /dev/null +++ b/dk-api/api-business/src/main/java/org/dromara/business/api/RemoteBusinessAlertService.java @@ -0,0 +1,19 @@ +package org.dromara.business.api; + + + +/** + * 预警服务 + * + * @author Lion Li + */ +public interface RemoteBusinessAlertService { + + + /** + * 更新此条预警审批时候的状态 + * @param businessId 业务id(预警、工单) + * @param flowStatus 流程状态 + */ + void updateAlertStatus(String businessId, String flowStatus); +} diff --git a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java index 7b5e5e6..bc2f96a 100644 --- a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java +++ b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java @@ -3,6 +3,7 @@ package org.dromara.system.api; import org.dromara.system.api.domain.vo.RemoteDeptVo; import java.util.List; +import java.util.Map; /** * 部门服务 @@ -20,4 +21,10 @@ public interface RemoteDeptService { String selectDeptNameByIds(String deptIds); List selectDeptsByList(); + + RemoteDeptVo selectDeptById(Long deptId); + + List> getNamePathList(); + + List selectListByParentId(String deptId); } diff --git a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteUserService.java b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteUserService.java index 1269d8b..6fc0210 100644 --- a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteUserService.java +++ b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteUserService.java @@ -155,4 +155,6 @@ public interface RemoteUserService { * @return 用户 */ List selectUsersByPostIds(List postIds); + + List selectUserByUserIds(List userIds); } diff --git a/dk-api/api-workflow/pom.xml b/dk-api/api-workflow/pom.xml index 9a22a63..7275463 100644 --- a/dk-api/api-workflow/pom.xml +++ b/dk-api/api-workflow/pom.xml @@ -27,6 +27,11 @@ common-bus + + org.dromara + api-system + + 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 f533381..0bc8945 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,5 +1,6 @@ package org.dromara.workflow.api; +import org.dromara.system.api.domain.vo.RemoteUserVo; import org.dromara.workflow.api.domain.RemoteCompleteTask; import org.dromara.workflow.api.domain.RemoteStartProcess; import org.dromara.workflow.api.domain.RemoteStartProcessReturn; @@ -77,12 +78,26 @@ public interface RemoteWorkflowService { */ RemoteStartProcessReturn startWorkFlow(RemoteStartProcess startProcess); +// /** +// * 办理任务 +// * +// * @param completeTask 参数 +// * @return 结果 +// */ +// boolean completeTask(RemoteCompleteTask completeTask); + /** - * 办理任务 + * 获取当前任务的所有办理人 * - * @param completeTask 参数 + * @param taskId 任务id * @return 结果 */ - boolean completeTask(RemoteCompleteTask completeTask); + Map> currentTaskAllUser(List taskId); + + /** + * 审批前获取当前办理人,办理时会校验的该权限集合 + * 返回当前用户权限集合 + */ + List getPermissions(); } diff --git a/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/domain/enums/WorkflowCodeEnum.java b/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/domain/enums/WorkflowCodeEnum.java new file mode 100644 index 0000000..89a74b0 --- /dev/null +++ b/dk-api/api-workflow/src/main/java/org/dromara/workflow/api/domain/enums/WorkflowCodeEnum.java @@ -0,0 +1,19 @@ +package org.dromara.workflow.api.domain.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 流程类型,后续有的话可以根据具体业务加,要保证流程定义里面的标识key和这边code保持一致 + */ +@Getter +@AllArgsConstructor +public enum WorkflowCodeEnum { + + ALERT("alert","预警流程"); + + final String code; + + final String description; + +} diff --git a/dk-api/pom.xml b/dk-api/pom.xml index 98a3afc..273f93e 100644 --- a/dk-api/pom.xml +++ b/dk-api/pom.xml @@ -13,6 +13,7 @@ api-system api-resource api-workflow + api-business dk-api diff --git a/dk-auth/src/main/java/org/dromara/auth/controller/CaptchaController.java b/dk-auth/src/main/java/org/dromara/auth/controller/CaptchaController.java index 8293127..255d5d2 100644 --- a/dk-auth/src/main/java/org/dromara/auth/controller/CaptchaController.java +++ b/dk-auth/src/main/java/org/dromara/auth/controller/CaptchaController.java @@ -3,6 +3,8 @@ package org.dromara.auth.controller; import cn.hutool.captcha.AbstractCaptcha; import cn.hutool.captcha.generator.CodeGenerator; import cn.hutool.core.util.IdUtil; +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.auth.domain.vo.CaptchaVo; @@ -31,6 +33,7 @@ import java.time.Duration; * * @author Lion Li */ +@Tag(name = "验证码相关操作") @Slf4j @Validated @RequiredArgsConstructor @@ -42,6 +45,7 @@ public class CaptchaController { /** * 生成验证码 */ + @Operation(summary = "生成验证码",description = "生成验证码") @RateLimiter(time = 60, count = 10, limitType = LimitType.IP) @GetMapping("/code") public R getCode() { diff --git a/dk-auth/src/main/java/org/dromara/auth/controller/TokenController.java b/dk-auth/src/main/java/org/dromara/auth/controller/TokenController.java index 5ce3c0d..d82fdc1 100644 --- a/dk-auth/src/main/java/org/dromara/auth/controller/TokenController.java +++ b/dk-auth/src/main/java/org/dromara/auth/controller/TokenController.java @@ -4,6 +4,8 @@ import cn.dev33.satoken.exception.NotLoginException; import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -52,6 +54,7 @@ import java.util.concurrent.TimeUnit; * * @author Lion Li */ +@Tag(name = "token相关服务") @Slf4j @RequiredArgsConstructor @RestController @@ -78,6 +81,7 @@ public class TokenController { * @param body 登录信息 * @return 结果 */ + @Operation(summary = "登录",description = "登录") @ApiEncrypt @PostMapping("/login") public R login(@RequestBody String body) { @@ -113,6 +117,7 @@ public class TokenController { * @param source 登录来源 * @return 结果 */ + @Operation(summary = "第三方登录请求",description = "第三方登录请求") @GetMapping("/binding/{source}") public R authBinding(@PathVariable("source") String source, @RequestParam String tenantId, @RequestParam String domain) { @@ -135,6 +140,7 @@ public class TokenController { * @param loginBody 请求体 * @return 结果 */ + @Operation(summary = "第三方登录回调业务处理",description = "第三方登录回调业务处理") @PostMapping("/social/callback") public R socialCallback(@RequestBody SocialLoginBody loginBody) { // 获取第三方登录信息 @@ -156,6 +162,7 @@ public class TokenController { * * @param socialId socialId */ + @Operation(summary = "取消授权",description = "取消授权") @DeleteMapping(value = "/unlock/{socialId}") public R unlockSocial(@PathVariable Long socialId) { Boolean rows = remoteSocialService.deleteWithValidById(socialId); @@ -165,6 +172,7 @@ public class TokenController { /** * 登出方法 */ + @Operation(summary = "登出方法",description = "登出方法") @PostMapping("logout") public R logout() { sysLoginService.logout(); @@ -174,6 +182,7 @@ public class TokenController { /** * 用户注册 */ + @Operation(summary = "用户注册",description = "用户注册") @ApiEncrypt @PostMapping("register") public R register(@RequestBody RegisterBody registerBody) { @@ -190,6 +199,7 @@ public class TokenController { * * @return 租户列表 */ + @Operation(summary = "登录页面租户下拉框",description = "登录页面租户下拉框") @GetMapping("/tenant/list") public R tenantList(HttpServletRequest request) throws Exception { // 返回对象 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 96f13d9..d2c38dd 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 @@ -8,6 +8,7 @@ import org.dromara.common.core.utils.StringUtils; import java.util.Arrays; import java.util.List; +import java.util.Optional; /** * 业务状态枚举 @@ -17,6 +18,12 @@ import java.util.List; @Getter @AllArgsConstructor public enum BusinessStatusEnum { + + /** + * 验证 + */ + VERIFY("verify", "验证"), + /** * 已撤销 */ @@ -72,6 +79,17 @@ public enum BusinessStatusEnum { .orElse(StrUtil.EMPTY); } + + /** + * 根据status获取枚举 + * @param status + * @return + */ + public static BusinessStatusEnum getByStatus(String status){ + Optional optional = Arrays.stream(values()).filter(p -> StrUtil.equals(p.getStatus(),status)).findFirst(); + return optional.orElse(null); + } + /** * 启动流程校验 * diff --git a/dk-common/common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java b/dk-common/common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java index 0cf8054..81cdda2 100644 --- a/dk-common/common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java +++ b/dk-common/common-sse/src/main/java/org/dromara/common/sse/config/SseAutoConfiguration.java @@ -14,7 +14,7 @@ import org.springframework.context.annotation.Bean; * @author Lion Li */ @AutoConfiguration -@ConditionalOnProperty(value = "sse.enabled", havingValue = "true") +//@ConditionalOnProperty(value = "sse.enabled", havingValue = "true") @EnableConfigurationProperties(SseProperties.class) public class SseAutoConfiguration { diff --git a/dk-common/common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java b/dk-common/common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java index 41832fc..7f99f6f 100644 --- a/dk-common/common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java +++ b/dk-common/common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java @@ -21,7 +21,7 @@ import java.util.List; * @author Lion Li */ @RestController -@ConditionalOnProperty(value = "sse.enabled", havingValue = "true") +//@ConditionalOnProperty(value = "sse.enabled", havingValue = "true") @RequiredArgsConstructor public class SseController implements DisposableBean { @@ -30,7 +30,7 @@ public class SseController implements DisposableBean { /** * 建立 SSE 连接 */ - @GetMapping(value = "${sse.path}", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + @GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter connect() { String tokenValue = StpUtil.getTokenValue(); Long userId = LoginHelper.getUserId(); @@ -40,7 +40,7 @@ public class SseController implements DisposableBean { /** * 关闭 SSE 连接 */ - @GetMapping(value = "${sse.path}/close") + @GetMapping(value = "/sse/close") public R close() { String tokenValue = StpUtil.getTokenValue(); Long userId = LoginHelper.getUserId(); @@ -54,7 +54,7 @@ public class SseController implements DisposableBean { * @param userId 目标用户的 ID * @param msg 要发送的消息内容 */ - @GetMapping(value = "${sse.path}/send") + @GetMapping(value = "/sse/send") public R send(Long userId, String msg) { SseMessageDto dto = new SseMessageDto(); dto.setUserIds(List.of(userId)); @@ -68,7 +68,7 @@ public class SseController implements DisposableBean { * * @param msg 要发送的消息内容 */ - @GetMapping(value = "${sse.path}/sendAll") + @GetMapping(value = "/sse/sendAll") public R send(String msg) { sseEmitterManager.publishAll(msg); return R.ok(); diff --git a/dk-common/common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java b/dk-common/common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java index 7a4dff1..ed4eeb1 100644 --- a/dk-common/common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java +++ b/dk-common/common-sse/src/main/java/org/dromara/common/sse/listener/SseTopicListener.java @@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.Ordered; +import org.springframework.stereotype.Component; /** * SSE 主题订阅监听器 diff --git a/dk-modules/business/pom.xml b/dk-modules/business/pom.xml index 3d16372..6b6ef01 100644 --- a/dk-modules/business/pom.xml +++ b/dk-modules/business/pom.xml @@ -91,6 +91,56 @@ common-encrypt + + org.dromara + api-business + + + + + org.jeecgframework + autopoi-web + 1.4.4 + + + commons-codec + commons-codec + + + + + + org.dromara + api-workflow + + + + + org.geotools + gt-geojson + ${geotools.version} + + + org.geotools + gt-geometry + ${geotools.version} + + + org.geotools + gt-epsg-hsql + ${geotools.version} + + + org.geotools + gt-jts-wrapper + ${geotools.version} + + + org.geotools + gt-shapefile + 29.5 + + ${project.artifactId} @@ -109,6 +159,7 @@ - + + 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 new file mode 100644 index 0000000..dbe7159 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java @@ -0,0 +1,61 @@ +package org.dromara.business.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.dromara.business.domain.BusinessAlert; +import org.dromara.business.domain.bo.BusinessAlertBo; +import org.dromara.business.service.IBusinessAlertService; +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.*; + +/** + * 预警服务 + * + * @author LionLi + * @date 2025-02-27 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping +@Tag(name = "预警服务") +public class BusinessAlertController extends BaseController { + + + private final IBusinessAlertService businessAlertService; + + /** + * 查询全部预警 + */ + @Operation(summary ="查询全部预警",description = "查询全部预警") + @GetMapping("/alert/page/all") + public TableDataInfo pageBusinessAlert(BusinessAlertBo bo, PageQuery pageQuery) { + return businessAlertService.pageBusinessAlert(bo, pageQuery); + } + + /** + * 查询审批的预警 + */ + @Operation(summary ="查询待办的预警",description = "查询待办的预警") + @GetMapping("/alert/page/todo") + public TableDataInfo pageBusinessAlertTodo(BusinessAlertBo bo, PageQuery pageQuery) { + return businessAlertService.pageBusinessAlertTodo(bo, pageQuery); + } + + /** + * 查询审批完成的预警 + * @param bo + * @param pageQuery + * @return + */ + @Operation(summary ="查询审批完成的预警",description = "查询审批完成的预警") + @GetMapping("/alert/page/finish") + public TableDataInfo pageBusinessAlertFinish(BusinessAlertBo bo, PageQuery pageQuery) { + return businessAlertService.pageBusinessAlertFinish(bo, pageQuery); + } + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertStatisticsController.java b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertStatisticsController.java new file mode 100644 index 0000000..cc29d2e --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertStatisticsController.java @@ -0,0 +1,63 @@ +package org.dromara.business.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.dromara.business.domain.bo.BusinessAlertBo; +import org.dromara.business.domain.model.StatObj; +import org.dromara.business.service.BusinessAlertStatisticsService; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 预警统计相关服务 + */ +@Tag(name = "预警统计相关服务") +@RequiredArgsConstructor +@RestController +@RequestMapping("/alert/statistics") +public class BusinessAlertStatisticsController extends BaseController { + + private final BusinessAlertStatisticsService statisticsService; + + + //饼图显示每个月根据部门 + @Operation(summary="根据月份显示预警个数", description="根据月份显示预警个数") + @GetMapping(value = "/month/count") + public R> countMonthAlert(BusinessAlertBo businessAlertBo) { + return R.ok(statisticsService.countMonthAlert(businessAlertBo)); + } + + //饼图部门分类预警个数占比 + @Operation(summary="根据部门显示预警个数", description="根据部门显示预警个数") + @GetMapping(value = "/depart/count") + public R> countDepartAlert(BusinessAlertBo businessAlertBo) { + return R.ok(statisticsService.countDepartAlert(businessAlertBo)); + } + + //折线图处理状态各个月展示个数部门 + @Operation(summary="根据月份,状态统计显示预警个数", description="根据月份,状态统计显示预警个数") + @GetMapping(value = "/month/status/count") + public R> countMonthAlertStatus(BusinessAlertBo businessAlertBo) { + return R.ok(statisticsService.countMonthAlertStatus(businessAlertBo)); + } + + //折线图处理状态预警个数分布部门 + @Operation(summary="根据部门,状态统计显示预警个数", description="根据部门,状态统计显示预警个数") + @GetMapping(value = "/depart/status/count") + public R> countDepartAlertStatus(BusinessAlertBo businessAlertBo) { + return R.ok(statisticsService.countDepartAlertStatus(businessAlertBo)); + } + + //预警对比统计 + //1、处理状态柱状图,x轴为选中的部门 + //2、预警类型柱状图,x轴为选中的部门 + + + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessDepartBoundaryController.java b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessDepartBoundaryController.java new file mode 100644 index 0000000..4c65faa --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessDepartBoundaryController.java @@ -0,0 +1,89 @@ +package org.dromara.business.controller; + + +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.business.domain.BusinessDepartBoundary; +import org.dromara.business.service.IBusinessDepartBoundaryService; +import org.dromara.common.core.domain.R; +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.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +/** + * 部门区域 + */ +@Tag(name = "部门区域") +@RestController +@RequestMapping("/depart/boundary") +@Slf4j +@RequiredArgsConstructor +public class BusinessDepartBoundaryController extends BaseController { + + private final IBusinessDepartBoundaryService departBoundaryService; + + + /** + * 查询部门的地理位置 + * @param departBoundary + * @return + */ + @Operation(summary ="查询部门的地理位置",description = "查询部门的地理位置") + @GetMapping(value = "/listJson") + public R listJson(BusinessDepartBoundary departBoundary) { + String listJson = departBoundaryService.listJson(departBoundary); + return R.ok("查询成功!",listJson); +} + + + /** + * 分页查询部门区域列表 + * @return + */ + @Operation(summary ="查询部门区域列表",description = "查询部门区域列表") + @RequestMapping(value = "/page", method = RequestMethod.GET) + public TableDataInfo queryPageList(BusinessDepartBoundary departBoundary, PageQuery pageQuery) { + return departBoundaryService.listSysDepartBoundary(pageQuery, departBoundary); + } + + + /** + * 解析shp文件 + * @return + */ + @Operation(summary ="批量新增部门区域",description = "批量新增部门区域") + @RequestMapping(value = "/upload", method = RequestMethod.POST) + public R uploadShpFile(@RequestParam("file") MultipartFile file, + @RequestParam(value = "deptId" ,required = false)String deptId) { + return toAjax(departBoundaryService.uploadShpFile(file,deptId)); + } + + /** + * 编辑 + * + * @param + * @return + */ + @Operation(summary ="编辑部门区域",description = "编辑部门区域") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public R updateDepartBoundary(@RequestBody BusinessDepartBoundary departBoundary) { + return toAjax(departBoundaryService.updateDepartBoundary(departBoundary)); + } + + + /** + * 通过id删除 + * + * @param id + * @return + */ + @Operation(summary ="删除部门区域",description = "删除部门区域") + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public R deleteDepartBoundary(@RequestParam(name = "id") String id) { + return toAjax(departBoundaryService.deleteDepartBoundary(id)); + } +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/controller/WaylineAlertController.java b/dk-modules/business/src/main/java/org/dromara/business/controller/WaylineAlertController.java deleted file mode 100644 index 0dc2d35..0000000 --- a/dk-modules/business/src/main/java/org/dromara/business/controller/WaylineAlertController.java +++ /dev/null @@ -1,99 +0,0 @@ -package org.dromara.business.controller; - -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.RequiredArgsConstructor; -import org.dromara.business.domain.bo.WaylineAlertBo; -import org.dromara.business.domain.vo.WaylineAlertVo; -import org.dromara.business.service.IWaylineAlertService; -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.excel.utils.ExcelUtil; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -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.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 预警任务 - * - * @author LionLi - * @date 2025-02-27 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/alert/task") -public class WaylineAlertController extends BaseController { - - private final IWaylineAlertService waylineAlertService; - - /** - * 查询预警任务列表 - */ - @GetMapping("/page") - public TableDataInfo pageWaylineAlert(WaylineAlertBo bo, PageQuery pageQuery) { - return waylineAlertService.pageWaylineAlert(bo, pageQuery); - } - - /** - * 获取预警任务详细信息 - * - * @param alertId 主键 - */ - @GetMapping("/{alertId}") - public R getWaylineAlert(@NotNull(message = "主键不能为空") - @PathVariable String alertId) { - return R.ok(waylineAlertService.getWaylineAlert(alertId)); - } - - /** - * 新增预警任务 - */ - @Log(title = "预警任务", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping("/add") - public R addWaylineAlert(@Validated(AddGroup.class) @RequestBody WaylineAlertBo param) { - return toAjax(waylineAlertService.addWaylineAlert(param)); - } - - /** - * 修改预警任务 - */ - @Log(title = "预警任务", businessType = BusinessType.UPDATE) - @RepeatSubmit() - @PostMapping("/update") - public R updateWaylineAlert(@Validated(EditGroup.class) @RequestBody WaylineAlertBo bo) { - return toAjax(waylineAlertService.updateWaylineAlert(bo)); - } - - /** - * 删除预警任务 - * - * @param alertIdList 主键串 - */ - @Log(title = "预警任务", businessType = BusinessType.DELETE) - @DeleteMapping("/delete") - public R deleteWaylineAlert(@NotEmpty(message = "主键不能为空") - @RequestParam List alertIdList) { - return toAjax(waylineAlertService.deleteWaylineAlert(alertIdList, true)); - } - - /** - * 导出预警任务列表 - */ - @Log(title = "预警任务", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void exportWaylineAlert(WaylineAlertBo bo, HttpServletResponse response) { - List list = waylineAlertService.listWaylineAlert(bo); - ExcelUtil.exportExcel(list, "预警任务", WaylineAlertVo.class, response); - } -} 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 new file mode 100644 index 0000000..609babb --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java @@ -0,0 +1,232 @@ +package org.dromara.business.domain; + +import org.dromara.business.domain.enums.AlertTypeEnum; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; + +import java.util.Date; + +import java.io.Serial; + +/** + * 预警任务对象 business_alert + * + * @author LionLi + * @date 2025-02-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("business_alert") +public class BusinessAlert extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 任务轮id + */ + private String wheelId; + + /** + * 媒体id + */ + private String taskId; + + /** + * 图片id + */ + private String taskImageId; + + /** + * 处理原因 + */ + private String reason; + + /** + * 图片文件 + */ + private String images; + + /** + * 预警类型 + */ + private AlertTypeEnum alertType; + + /** + * 纬度 + */ + private Long lat; + + /** + * 精度 + */ + private Long lng; + + /** + * 任务类型 + */ + private String taskHandleType; + + + /** + * 任务内容 + */ + private String taskContent; + + /** + * 完成时间 + */ + private Date completeDate; + + + /** + * 删除 0 正常 1已删除 + */ + @TableLogic + private Long delFlag; + + /** + * 模板图片 + */ + private String mateSourceImgUrl; + + /** + * 放大模板违建区域图片 + */ + private String maxMateSourceImgUrl; + + /** + * 放大违建区域图片 + */ + private String maxImages; + + /** + * 面积 + */ + private Long area; + + /** + * 面积:长 + */ + private Long areaL; + + /** + * 面积:宽 + */ + private Long areaW; + + /** + * 流程处置状态(verify:验证,cancel:已撤销,draft:草稿,waiting:待审核,finish:已完成,invalid:已作废,back:已退回,termination:已终止) + */ + private BusinessStatusEnum handleType; + + /** + * 是否违建 0:否,1:是 + */ + private Long isIllegal; + + /** + * 部门id + */ + private String deptId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 预警名称 + */ + private String jobName; + + /** + * 处理时间 + */ + private Date handleTime; + + /** + * 其他:内容 + */ + private String taskHandle; + + /** + * 平台类型 + */ + private String platformType; + + /** + * 像素坐标 + */ + private String pixelCoordinate; + + /** + * 当前位置预警数量 + */ + private Long handleNum; + + /** + * 国土所备注 + */ + private String territoryRemark; + + /** + * 地类信息数据 + */ + private String landCategories; + + /** + * 相关文件 + */ + private String territoryUrl; + + /** + * 图片 + */ + private String territoryPath; + + + /** + * 忽略原因 + */ + private String ignoringCause; + + /** + * 来源:0:平台 1:小程序 + */ + private Long handleSource; + + /** + * 审批者 + */ + @TableField(exist = false) + private String approver; + + /** + * 审批者 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "approver") + @TableField(exist = false) + private String approveName; + + @TableField(exist = false) + private Long flowTaskId; + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessDepartBoundary.java b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessDepartBoundary.java new file mode 100644 index 0000000..4f3408f --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessDepartBoundary.java @@ -0,0 +1,75 @@ +package org.dromara.business.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.jeecgframework.poi.excel.annotation.Excel; + +import java.io.Serial; + +/** + * 部门区域边界表 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("business_depart_boundary") +public class BusinessDepartBoundary extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /**ID*/ + @TableId(type = IdType.AUTO) + private String id; + + /** + * 租户Id + */ + private String tenantId; + + /**机构ID*/ + private String deptId; + /**机构/部门名称*/ + @Excel(name="机构/部门名称",width=15) + private String deptName; + + /**是否显示0显示,1不显示*/ + private Integer type; + /**边界*/ + + private String communityName; + /**边界*/ + private String boundary; + + /** + * 周长 + */ + private Double perimeter; + + /** + * 面积平方公里 + */ + private Double area; + + /** + * 面积亩 + */ + private Double areaMu; + + /** + * 编号 + */ + private String shpNo; + + /** + * 0不为村级别,1为村级别 + */ + private Integer villageType; + + /**删除状态(0,正常,1已删除)*/ + private String delFlag; + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessGeospatialVectors.java b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessGeospatialVectors.java new file mode 100644 index 0000000..4ab224c --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessGeospatialVectors.java @@ -0,0 +1,151 @@ +package org.dromara.business.domain; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + *存储解析的shp的矢量数据 + */ +@Data +@TableName("business_geospatial_vectors") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class BusinessGeospatialVectors { + + /** + * ID + */ + @TableId(type = IdType.AUTO) + private String id; + + /** + * 租户Id + */ + private String tenantId; + + // 1. 图形基础属性 + private String landCategories; // 几何信息 + + private String lineColor; // 线颜色 + + private String areaColor; // 面颜色 + + private String lineTransparency; // 线透明度 + + private String lineWidth; // 线宽度 + + private String areaTransparency; // 面透明度 + + private String shapeLength; // 形状长度 + + private String shapeArea; // 形状面积 + + // 2. 图斑标识信息 + private String featureCode; // 标识码 + + private String featureTypeCode; // 要素代码 + + private String temporaryFeatureId; // 图斑预编号 + + private String featureId; // 图斑编号 + + private String featureType; // 图斑类型 + + private String objectId; // 对象ID + + // 3. 地类信息 + private String landTypeCode; // 地类编码 + + private String landTypeName; // 地类名称 + + private String landUseType; // 土地利用类型 + + private String landActualUse; // 土地用途 + + // 4. 权属与行政区划信息 + private String ownershipNature; // 权属性质 + + private String ownershipUnitCode; // 权属单位代码 + + private String ownershipUnitName; // 权属单位名称 + + private String landUnitCode; // 坐落单位代码 + + private String landUnitName; // 坐落单位名称 + + private String adminDivisionCode; // 行政区代码 + + private String adminDivisionName; // 行政区名称 + + // 5. 面积信息 + private String featureArea; // 图斑面积 + + private String deductionArea; // 扣除面积 + + private String featureLandArea; // 图斑地类面积 + + private String linearFeatureWidth; // 线状地物宽度 + + // 6. 农用地相关信息 + private String arableLandQuality; // 耕地等别 + + private String arableLandQualityCode; // 耕地等别代码 + + private String basicFarmlandType; // 基本农田类型 + + // 7. 规划信息 + private String planningPurpose; // 规划用途 + + private String planningPurposeCode; // 规划用途代码 + + private String planningPeriod; // 规划期限 + + // 8. 变更与历史信息 + private String originalFeatureCode; // 原始代码 + + private String originalLandTypeCode; // 原地类编码 + + private String changeRecordId; // 变更编号 + + private String changeDate; // 变更日期 + + // 9. 时间信息 + private String updateDate; // 更新日期 + + private String completionDate; // 建设日期 + + private String dataYear; // 数据年份 + + // 10. 其他属性 + private String notes; // 备注 + + private String approvalNumber; // 批准文号 + + private String urbanVillageCode; // 城镇村属性码 + + private String extendedInfo; // 扩展信息 + + private String belongingArea; // 所属区域 + + private String geographicLocation; // 地理位置 + + // 11. 拆转查相关信息 + private String demolitionType; // 拆查类型 + + private String demolitionArea; // 拆查面积 + + private String demolitionName; // 拆查名称 + + private Integer batchNo; //批次号 + + private Date createTime; //创建时间 + + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessPatrolAreas.java b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessPatrolAreas.java new file mode 100644 index 0000000..fbddfda --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessPatrolAreas.java @@ -0,0 +1,76 @@ +package org.dromara.business.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 lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.jeecgframework.poi.excel.annotation.Excel; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: 巡查区域 + */ +@Data +@TableName("business_patrol_areas") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class BusinessPatrolAreas extends BaseEntity { + + /** + * ID + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /**区域名称*/ + @Excel(name = "区域名称", width = 15) + private String name; + + /**区域编号*/ + @Excel(name = "区域编号", width = 15) + private String number; + + /**所属乡镇id*/ + @Excel(name = "所属乡镇id", width = 15) + private String deptId; + + /**地理数据*/ + private String landCategories; + + /**所属乡镇id*/ + @Excel(name = "所属乡镇名称", width = 15) + @TableField(exist = false) + private String deptName; + + @Excel(name = "所属乡镇ids", width = 15) + private String deptIds; + + @Excel(name = "平台类型", width = 15) + private String platformType; + + /**分管领导所属乡镇id**/ + private String leaderDeptId; + + /**用户id**/ + private String userId; + + /**用户姓名**/ + private String userName; + + /**是否禁用:0:禁用 1:启用**/ + private Integer isDisable; + + /**巡查区域平台类型集合**/ + @TableField(exist = false) + private List patrolAreasIdList = new ArrayList<>(); + + @TableField(exist = false) + private List areasIdList = new ArrayList<>(); + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessVectorDict.java b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessVectorDict.java new file mode 100644 index 0000000..dbb7ba1 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessVectorDict.java @@ -0,0 +1,47 @@ +package org.dromara.business.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 lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.util.List; + +/** + * 矢量数据字段映射主表 + */ +@Data +@TableName("Business_vector_dict") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class BusinessVectorDict extends BaseEntity { + + /** + * + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** + * 租户Id + */ + private String tenantId; + + /** + * 字段名称 + */ + private String dictCode; + + /** + * 描述 + */ + private String dictName; + + @TableField(exist = false) + private List fieldMappingsList; + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessVectorDictItem.java b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessVectorDictItem.java new file mode 100644 index 0000000..1e0f829 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/BusinessVectorDictItem.java @@ -0,0 +1,47 @@ +package org.dromara.business.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 矢量数据字段映射关联表 + */ +@Data +@TableName("Business_vector_dict_item") +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class BusinessVectorDictItem extends BaseEntity { + + /** + * + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** + * 租户Id + */ + private String tenantId; + + /** + * 字段名称 + */ + private String itemValue; + + /** + * 关联id + */ + private String dictId; + + /** + * 描述 + */ + private String itemText; + + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/WaylineAlert.java b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java similarity index 79% rename from dk-modules/business/src/main/java/org/dromara/business/domain/WaylineAlert.java rename to dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java index bd1e375..417d3b6 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/WaylineAlert.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java @@ -1,34 +1,27 @@ -package org.dromara.business.domain; +package org.dromara.business.domain.bo; +import com.baomidou.mybatisplus.annotation.TableField; +import org.dromara.business.domain.BusinessAlert; import org.dromara.common.mybatis.core.domain.BaseEntity; -import com.baomidou.mybatisplus.annotation.*; +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.Date; -import com.fasterxml.jackson.annotation.JsonFormat; - -import java.io.Serial; +import java.util.List; /** - * 预警任务对象 wayline_alert + * 预警任务业务对象 business_alert * * @author LionLi * @date 2025-02-27 */ @Data @EqualsAndHashCode(callSuper = true) -@TableName("wayline_alert") -public class WaylineAlert extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * - */ - @TableId(value = "id") - private String id; - +@AutoMapper(target = BusinessAlert.class, reverseConvertGenerate = false) +public class BusinessAlertBo extends BaseEntity { /** * 任务轮id */ @@ -54,6 +47,11 @@ public class WaylineAlert extends BaseEntity { */ private String images; + /** + * 预警类型 + */ + private String alertType; + /** * 纬度 */ @@ -81,12 +79,6 @@ public class WaylineAlert extends BaseEntity { private Date completeDate; - /** - * 删除 0 正常 1已删除 - */ - @TableLogic - private Long delFlag; - /** * 模板图片 */ @@ -117,10 +109,6 @@ public class WaylineAlert extends BaseEntity { */ private Long areaW; - /** - * 0:验证 - */ - private Long handleInType; /** * 是否违建 0:否,1:是 @@ -199,4 +187,7 @@ public class WaylineAlert extends BaseEntity { private Long handleSource; + List deptIdList; + + } diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessPatrolAreasBo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessPatrolAreasBo.java new file mode 100644 index 0000000..a07b4d7 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessPatrolAreasBo.java @@ -0,0 +1,44 @@ +package org.dromara.business.domain.bo; + + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.business.domain.BusinessAlert; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.util.ArrayList; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusinessAlert.class, reverseConvertGenerate = false) +public class BusinessPatrolAreasBo extends BaseEntity { + + /** + * 所属乡镇id + */ + private String deptId; + + /** + * 所属乡镇名称 + */ + private String deptName; + + /** + * 预警类型 + */ + private String platformType; + + /** + * 是否禁用:0:禁用 1:启用 + */ + private Integer isDisable; + + /** + * 下级所有部门id + */ + private List deptIds = new ArrayList<>(); + + private String name; +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessPlatformInfoBo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessPlatformInfoBo.java new file mode 100644 index 0000000..c88887b --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessPlatformInfoBo.java @@ -0,0 +1,11 @@ +package org.dromara.business.domain.bo; + +import lombok.Data; + +@Data +public class BusinessPlatformInfoBo { + + /**查询条件**/ + private String search; + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/WaylineAlertBo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/bo/WaylineAlertBo.java deleted file mode 100644 index f8203d5..0000000 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/bo/WaylineAlertBo.java +++ /dev/null @@ -1,226 +0,0 @@ -package org.dromara.business.domain.bo; - -import org.dromara.business.domain.WaylineAlert; -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.Date; - -/** - * 预警任务业务对象 wayline_alert - * - * @author LionLi - * @date 2025-02-27 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = WaylineAlert.class, reverseConvertGenerate = false) -public class WaylineAlertBo extends BaseEntity { - - /** - * - */ - @NotBlank(message = "不能为空", groups = { EditGroup.class }) - private String id; - - /** - * 任务轮id - */ - @NotBlank(message = "任务轮id不能为空", groups = { AddGroup.class, EditGroup.class }) - private String wheelId; - - /** - * 媒体id - */ - @NotBlank(message = "媒体id不能为空", groups = { AddGroup.class, EditGroup.class }) - private String taskId; - - /** - * 图片id - */ - @NotBlank(message = "图片id不能为空", groups = { AddGroup.class, EditGroup.class }) - private String taskImageId; - - /** - * 处理原因 - */ - @NotBlank(message = "处理原因不能为空", groups = { AddGroup.class, EditGroup.class }) - private String reason; - - /** - * 图片文件 - */ - @NotBlank(message = "图片文件不能为空", groups = { AddGroup.class, EditGroup.class }) - private String images; - - /** - * 纬度 - */ - @NotNull(message = "纬度不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long lat; - - /** - * 精度 - */ - @NotNull(message = "精度不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long lng; - - /** - * 任务类型 - */ - @NotBlank(message = "任务类型不能为空", groups = { AddGroup.class, EditGroup.class }) - private String taskHandleType; - - - /** - * 任务内容 - */ - @NotBlank(message = "任务内容不能为空", groups = { AddGroup.class, EditGroup.class }) - private String taskContent; - - /** - * 完成时间 - */ - @NotNull(message = "完成时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Date completeDate; - - - /** - * 模板图片 - */ - @NotBlank(message = "模板图片不能为空", groups = { AddGroup.class, EditGroup.class }) - private String mateSourceImgUrl; - - /** - * 放大模板违建区域图片 - */ - @NotBlank(message = "放大模板违建区域图片不能为空", groups = { AddGroup.class, EditGroup.class }) - private String maxMateSourceImgUrl; - - /** - * 放大违建区域图片 - */ - @NotBlank(message = "放大违建区域图片不能为空", groups = { AddGroup.class, EditGroup.class }) - private String maxImages; - - /** - * 面积 - */ - @NotNull(message = "面积不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long area; - - /** - * 面积:长 - */ - @NotNull(message = "面积:长不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long areaL; - - /** - * 面积:宽 - */ - @NotNull(message = "面积:宽不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long areaW; - - /** - * 0:验证 - */ - @NotNull(message = "0:验证", groups = { AddGroup.class, EditGroup.class }) - private Long handleInType; - - /** - * 是否违建 0:否,1:是 - */ - @NotNull(message = "是否违建 0:否,1:是不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long isIllegal; - - /** - * 部门id - */ - @NotBlank(message = "部门id不能为空", groups = { AddGroup.class, EditGroup.class }) - private String deptId; - - /** - * 部门名称 - */ - @NotBlank(message = "部门名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String deptName; - - /** - * 预警名称 - */ - @NotBlank(message = "预警名称不能为空", groups = { AddGroup.class, EditGroup.class }) - private String jobName; - - /** - * 处理时间 - */ - @NotNull(message = "处理时间不能为空", groups = { AddGroup.class, EditGroup.class }) - private Date handleTime; - - /** - * 其他:内容 - */ - @NotBlank(message = "其他:内容不能为空", groups = { AddGroup.class, EditGroup.class }) - private String taskHandle; - - /** - * 平台类型 - */ - @NotBlank(message = "平台类型不能为空", groups = { AddGroup.class, EditGroup.class }) - private String platformType; - - /** - * 像素坐标 - */ - @NotBlank(message = "像素坐标不能为空", groups = { AddGroup.class, EditGroup.class }) - private String pixelCoordinate; - - /** - * 当前位置预警数量 - */ - @NotNull(message = "当前位置预警数量不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long handleNum; - - /** - * 国土所备注 - */ - @NotBlank(message = "国土所备注不能为空", groups = { AddGroup.class, EditGroup.class }) - private String territoryRemark; - - /** - * 地类信息数据 - */ - @NotBlank(message = "地类信息数据不能为空", groups = { AddGroup.class, EditGroup.class }) - private String landCategories; - - /** - * 相关文件 - */ - @NotBlank(message = "相关文件不能为空", groups = { AddGroup.class, EditGroup.class }) - private String territoryUrl; - - /** - * 图片 - */ - @NotBlank(message = "图片不能为空", groups = { AddGroup.class, EditGroup.class }) - private String territoryPath; - - - /** - * 忽略原因 - */ - @NotBlank(message = "忽略原因不能为空", groups = { AddGroup.class, EditGroup.class }) - private String ignoringCause; - - /** - * 来源:0:平台 1:小程序 - */ - @NotNull(message = "来源:0:平台 1:小程序不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long handleSource; - - -} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/enums/AlertTypeEnum.java b/dk-modules/business/src/main/java/org/dromara/business/domain/enums/AlertTypeEnum.java new file mode 100644 index 0000000..0260bdd --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/enums/AlertTypeEnum.java @@ -0,0 +1,31 @@ +package org.dromara.business.domain.enums; + +import cn.hutool.core.util.StrUtil; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 预警类型枚举类 + */ +@Getter +public enum AlertTypeEnum { + + + + + ; + + + private String code; + + private String description; + + + public static AlertTypeEnum getTypeByCode(String code){ + if(StrUtil.isNotEmpty(code)){ + return Arrays.stream(values()).filter(p -> StrUtil.equals(p.name(),code.toUpperCase())).findAny().orElse(null); + } + return null; + } +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/model/StatObj.java b/dk-modules/business/src/main/java/org/dromara/business/domain/model/StatObj.java new file mode 100644 index 0000000..b2aacc1 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/model/StatObj.java @@ -0,0 +1,86 @@ +package org.dromara.business.domain.model; + +import cn.hutool.json.JSONObject; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 统计信息返回类 + */ +@Data +public class StatObj implements Serializable { + + /** + * 统计字段 + */ + private String statKey; + /** + * 统计值 + */ + private Object statVal; + + private List statValues; + /** + * 子集信息 + */ + List nextStatList; + + /** + * 补充字段 + */ + private JSONObject extra; + + /** + * 跳转链接 + */ + private String url; + + + public StatObj(){ + + } + + public StatObj(String statKey, Object statVal){ + this.statKey = statKey; + this.statVal = statVal; + } + + public StatObj(String statKey, Long statVal, String extraKey, Object extraValue){ + this.statKey = statKey; + this.statVal = statVal; + this.extra = new JSONObject().put(extraKey,extraValue); + } + + public StatObj(String statKey, BigDecimal percentage){ + this.statKey = statKey; + this.statVal = percentage; + } + + public StatObj(String statKey, Long statVal, String url){ + this.statKey = statKey; + this.statVal = statVal; + this.url = url; + } + + public StatObj(String statKey, List nextStatList){ + this.statKey = statKey; + this.nextStatList = nextStatList; + } + + public StatObj(String statKey, List nextStatList,String extraKey, Object extraValue){ + this.statKey = statKey; + this.nextStatList = nextStatList; + this.extra = new JSONObject().put(extraKey,extraValue); + } + + public void addExtra(String key,Object value){ + if(this.extra == null){ + this.extra = new JSONObject(); + } + this.extra.set(key,value); + } + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/WaylineAlertVo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java similarity index 86% rename from dk-modules/business/src/main/java/org/dromara/business/domain/vo/WaylineAlertVo.java rename to dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java index 632319b..b83e3fb 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/WaylineAlertVo.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java @@ -4,7 +4,11 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; -import org.dromara.business.domain.WaylineAlert; +import org.dromara.business.domain.BusinessAlert; +import org.dromara.business.domain.enums.AlertTypeEnum; +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; @@ -20,18 +24,12 @@ import java.util.Date; */ @Data @ExcelIgnoreUnannotated -@AutoMapper(target = WaylineAlert.class) -public class WaylineAlertVo implements Serializable { +@AutoMapper(target = BusinessAlert.class) +public class BusinessAlertVo implements Serializable { @Serial private static final long serialVersionUID = 1L; - /** - * - */ - @ExcelProperty(value = "") - private String id; - /** * 任务轮id */ @@ -62,6 +60,12 @@ public class WaylineAlertVo implements Serializable { @ExcelProperty(value = "图片文件") private String images; + + /** + * 预警类型 + */ + private String alertType; + /** * 纬度 */ @@ -130,10 +134,9 @@ public class WaylineAlertVo implements Serializable { private Long areaW; /** - * 0:验证 + * 流程处置状态(verify:验证,cancel:已撤销,draft:草稿,waiting:待审核,finish:已完成,invalid:已作废,back:已退回,termination:已终止) */ - @ExcelProperty(value = "0:验证") - private Long handleInType; + private BusinessStatusEnum handleType; /** * 是否违建 0:否,1:是 @@ -225,5 +228,4 @@ public class WaylineAlertVo implements Serializable { @ExcelProperty(value = "来源:0:平台 1:小程序") private Long handleSource; - } 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 new file mode 100644 index 0000000..58c7a30 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/dubbo/RemoteBusinessAlertServiceImpl.java @@ -0,0 +1,29 @@ +package org.dromara.business.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.business.api.RemoteBusinessAlertService; +import org.dromara.business.service.IBusinessAlertService; +import org.springframework.stereotype.Service; + +/** + * 预警相关服务开放 + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteBusinessAlertServiceImpl implements RemoteBusinessAlertService { + + private final IBusinessAlertService businessAlertService; + + + /** + * 更新此条预警审批时候的状态 + * @param businessId 业务id(预警、工单) + * @param flowStatus 流程状态 + */ + @Override + public void updateAlertStatus(String businessId, String flowStatus) { + businessAlertService.updateAlertStatus(businessId,flowStatus); + } +} 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 new file mode 100644 index 0000000..326a43a --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessAlertMapper.java @@ -0,0 +1,51 @@ +package org.dromara.business.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.business.domain.BusinessAlert; +import org.dromara.business.domain.bo.BusinessAlertBo; +import org.dromara.business.domain.vo.BusinessAlertVo; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +import java.util.List; +import java.util.Map; + +/** + * 预警任务Mapper接口 + * + * @author LionLi + * @date 2025-02-27 + */ +public interface BusinessAlertMapper extends BaseMapperPlus { + + Page pageBusinessAlert(Page page, QueryWrapper ew); + + Page pageAlertFinish(Page page, QueryWrapper ew); + + Page pageAlertTodo(Page page, QueryWrapper ew); + + @DataPermission( + @DataColumn(key = "deptName", value = "ba.dept_id") + ) + List> listMonthAlert(@Param("param") BusinessAlertBo businessAlertBo); + + @DataPermission( + @DataColumn(key = "deptName", value = "ba.dept_id") + ) + List> listDepartAlert(@Param("param") BusinessAlertBo businessAlertBo); + + @DataPermission( + @DataColumn(key = "deptName", value = "ba.dept_id") + ) + List> listMonthAlertStatus(@Param("param")BusinessAlertBo businessAlertBo); + + @DataPermission( + @DataColumn(key = "deptName", value = "ba.dept_id") + ) + List> listDepartAlertStatus(@Param("param") BusinessAlertBo businessAlertBo); +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessDepartBoundaryMapper.java b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessDepartBoundaryMapper.java new file mode 100644 index 0000000..75926dd --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessDepartBoundaryMapper.java @@ -0,0 +1,30 @@ +package org.dromara.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.business.domain.BusinessDepartBoundary; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; + +import java.util.List; + +/** + * 部门 Mapper 接口 + */ +public interface BusinessDepartBoundaryMapper extends BaseMapper { + Page listSysDepartBoundary(Page page,@Param("condition") BusinessDepartBoundary sysDepartBoundary); + + List listSysDepartBoundaryGeomFromText(@Param("condition") BusinessDepartBoundary sysDepartBoundary); + /** + * 通过部门编码获取部门边界数据 + * @param deptId 部门编码 + * @return String + */ + List queryByDeptId(@Param("deptId") String deptId); + + void saveBatchBoundary(@Param("list") List boundaryList); + + String listJson(@Param("param") BusinessDepartBoundary departBoundary); + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessPatrolAreasMapper.java b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessPatrolAreasMapper.java new file mode 100644 index 0000000..252eb43 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessPatrolAreasMapper.java @@ -0,0 +1,22 @@ +package org.dromara.business.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.business.domain.BusinessPatrolAreas; +import org.dromara.business.domain.bo.BusinessPatrolAreasBo; + + +import java.util.List; + +/** + * @Description: 巡查区域 + */ +public interface BusinessPatrolAreasMapper extends BaseMapper { + + IPage listPatrolAreas(Page page, @Param("condition") BusinessPatrolAreasBo patrolAreasBo, @Param("deptIds") List deptIds); + + List listPatrolAreas(@Param("condition") BusinessPatrolAreasBo patrolAreasBo, @Param("deptIds") List deptIds); +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessVectorDictItemMapper.java b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessVectorDictItemMapper.java new file mode 100644 index 0000000..7831c13 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessVectorDictItemMapper.java @@ -0,0 +1,8 @@ +package org.dromara.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.dromara.business.domain.BusinessVectorDictItem; + +public interface BusinessVectorDictItemMapper extends BaseMapper { + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessVectorDictMapper.java b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessVectorDictMapper.java new file mode 100644 index 0000000..403886e --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessVectorDictMapper.java @@ -0,0 +1,10 @@ +package org.dromara.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.dromara.business.domain.BusinessVectorDict; + +import java.util.List; + +public interface BusinessVectorDictMapper extends BaseMapper { + List listVectorField(); +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/mapper/WaylineAlertMapper.java b/dk-modules/business/src/main/java/org/dromara/business/mapper/WaylineAlertMapper.java deleted file mode 100644 index 1502119..0000000 --- a/dk-modules/business/src/main/java/org/dromara/business/mapper/WaylineAlertMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.dromara.business.mapper; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.dromara.business.domain.WaylineAlert; -import org.dromara.business.domain.vo.WaylineAlertVo; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; - -/** - * 预警任务Mapper接口 - * - * @author LionLi - * @date 2025-02-27 - */ -public interface WaylineAlertMapper extends BaseMapperPlus { - - Page pageAlert(Page page, LambdaQueryWrapper lqw); -} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/BusinessAlertStatisticsService.java b/dk-modules/business/src/main/java/org/dromara/business/service/BusinessAlertStatisticsService.java new file mode 100644 index 0000000..9f9d07e --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/service/BusinessAlertStatisticsService.java @@ -0,0 +1,17 @@ +package org.dromara.business.service; + + +import org.dromara.business.domain.bo.BusinessAlertBo; +import org.dromara.business.domain.model.StatObj; + +import java.util.List; + +public interface BusinessAlertStatisticsService { + List countMonthAlert(BusinessAlertBo businessAlertBo); + + List countDepartAlert(BusinessAlertBo businessAlertBo); + + List countMonthAlertStatus(BusinessAlertBo businessAlertBo); + + List countDepartAlertStatus(BusinessAlertBo businessAlertBo); +} 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 new file mode 100644 index 0000000..314d53d --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java @@ -0,0 +1,66 @@ +package org.dromara.business.service; + +import org.dromara.business.domain.BusinessAlert; +import org.dromara.business.domain.bo.BusinessAlertBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.List; + +/** + * 预警任务Service接口 + * + * @author LionLi + * @date 2025-02-27 + */ +public interface IBusinessAlertService { + + + TableDataInfo pageBusinessAlertTodo(BusinessAlertBo bo, PageQuery pageQuery); + + TableDataInfo pageBusinessAlertFinish(BusinessAlertBo bo, PageQuery pageQuery); + + TableDataInfo pageBusinessAlert(BusinessAlertBo bo, PageQuery pageQuery); + + /** + * 新增预警任务 + * + * @param param 预警任务 + * @return 是否新增成功 + */ + Boolean addBusinessAlert(BusinessAlertBo param); + + + /** + * 批量新增预警任务 + * + * @param alertList 预警任务 + * @return 是否新增成功 + */ + Boolean batchAddBusinessAlert(List alertList); + + /** + * 修改预警任务 + * + * @param param 预警任务 + * @return 是否修改成功 + */ + Boolean editBusinessAlert(BusinessAlertBo param); + + /** + * 校验并批量删除预警任务信息 + * + * @param alertIdList 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteBusinessAlert(List alertIdList, Boolean isValid); + + /** + * 修改预警中处置状态 + * @param businessId + * @param flowStatus + */ + void updateAlertStatus(String businessId, String flowStatus); + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessDepartBoundaryService.java b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessDepartBoundaryService.java new file mode 100644 index 0000000..22c2679 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessDepartBoundaryService.java @@ -0,0 +1,30 @@ +package org.dromara.business.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.business.domain.BusinessDepartBoundary; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 部门区域 服务实现类 + */ +public interface IBusinessDepartBoundaryService extends IService{ + TableDataInfo listSysDepartBoundary(PageQuery page, BusinessDepartBoundary departBoundary); + + List listSysDepartBoundaryGeomFromText(BusinessDepartBoundary departBoundary); + + List queryByDeptId(String deptId); + + boolean uploadShpFile(MultipartFile file,String deptId); + + boolean deleteDepartBoundary(String id); + + boolean updateDepartBoundary(BusinessDepartBoundary departBoundary); + + boolean addDepartBoundary(BusinessDepartBoundary departBoundary); + + String listJson(BusinessDepartBoundary departBoundary); +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessPatrolAreasService.java b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessPatrolAreasService.java new file mode 100644 index 0000000..1d7aec4 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessPatrolAreasService.java @@ -0,0 +1,29 @@ +package org.dromara.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import org.apache.ibatis.annotations.Param; +import org.dromara.business.domain.BusinessPatrolAreas; +import org.dromara.business.domain.bo.BusinessPatrolAreasBo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @Description: 巡查区域 + */ +public interface IBusinessPatrolAreasService extends IService { + TableDataInfo pagePatrolAreas(PageQuery pageQuery, BusinessPatrolAreasBo patrolAreasBo); + + List listPatrolAreas(BusinessPatrolAreasBo patrolAreasBo); + + void addPatrolAreas(MultipartFile file); + + boolean updatePatrolAreas(BusinessPatrolAreas patrolAreas); + + List exportXls(BusinessPatrolAreas patrolAreas); + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessVectorDictItemService.java b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessVectorDictItemService.java new file mode 100644 index 0000000..03f4553 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessVectorDictItemService.java @@ -0,0 +1,12 @@ +package org.dromara.business.service; + + +import org.dromara.business.domain.BusinessVectorDictItem; + +import java.util.List; + +public interface IBusinessVectorDictItemService { + + List findDictItemByDictId(String dictId); + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessVectorDictService.java b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessVectorDictService.java new file mode 100644 index 0000000..620416f --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessVectorDictService.java @@ -0,0 +1,17 @@ +package org.dromara.business.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.business.domain.BusinessVectorDict; + +import java.util.List; + +public interface IBusinessVectorDictService { + + List listVectorField(); + + BusinessVectorDict findVectorDictById(String dictId); + + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/IWaylineAlertService.java b/dk-modules/business/src/main/java/org/dromara/business/service/IWaylineAlertService.java deleted file mode 100644 index 1dedc19..0000000 --- a/dk-modules/business/src/main/java/org/dromara/business/service/IWaylineAlertService.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.dromara.business.service; - -import org.dromara.business.domain.WaylineAlert; -import org.dromara.business.domain.vo.WaylineAlertVo; -import org.dromara.business.domain.bo.WaylineAlertBo; -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-02-27 - */ -public interface IWaylineAlertService { - - /** - * 查询预警任务 - * - * @param id 主键 - * @return 预警任务 - */ - WaylineAlertVo getWaylineAlert(String id); - - /** - * 分页查询预警任务列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 预警任务分页列表 - */ - TableDataInfo pageWaylineAlert(WaylineAlertBo bo, PageQuery pageQuery); - - /** - * 查询符合条件的预警任务列表 - * - * @param param 查询条件 - * @return 预警任务列表 - */ - List listWaylineAlert(WaylineAlertBo param); - - /** - * 新增预警任务 - * - * @param param 预警任务 - * @return 是否新增成功 - */ - Boolean addWaylineAlert(WaylineAlertBo param); - - - /** - * 批量新增预警任务 - * - * @param alertList 预警任务 - * @return 是否新增成功 - */ - Boolean saveBatchAlert(List alertList); - - /** - * 修改预警任务 - * - * @param param 预警任务 - * @return 是否修改成功 - */ - Boolean updateWaylineAlert(WaylineAlertBo param); - - /** - * 校验并批量删除预警任务信息 - * - * @param alertIdList 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - Boolean deleteWaylineAlert(List alertIdList, Boolean isValid); -} 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 new file mode 100644 index 0000000..02d325c --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java @@ -0,0 +1,214 @@ +package org.dromara.business.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.business.domain.BusinessAlert; +import org.dromara.business.domain.bo.BusinessAlertBo; +import org.dromara.business.mapper.BusinessAlertMapper; +import org.dromara.business.service.IBusinessAlertService; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.domain.vo.RemoteUserVo; +import org.dromara.workflow.api.RemoteWorkflowService; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * 预警任务Service业务层处理 + * + * @author LionLi + * @date 2025-02-27 + */ +@RequiredArgsConstructor +@Service +public class BusinessAlertServiceImpl implements IBusinessAlertService { + + private final BusinessAlertMapper baseMapper; + + @DubboReference + RemoteWorkflowService remoteWorkflowService; + + + /** + * 新增预警任务 + * + * @param param 预警任务 + * @return 是否新增成功 + */ + @Override + public Boolean addBusinessAlert(BusinessAlertBo param) { + BusinessAlert alert = MapstructUtils.convert(param, BusinessAlert.class); + validEntityBeforeSave(alert,false); + return this.baseMapper.insert(alert) > 0; + } + + /** + * 批量添加 + * @param alertList 预警任务 + * @return + */ + @Override + public Boolean batchAddBusinessAlert(List alertList) { + return this.baseMapper.insertBatch(alertList); + } + + /** + * 修改预警任务 + * + * @param param 预警任务 + * @return 是否修改成功 + */ + @Override + public Boolean editBusinessAlert(BusinessAlertBo param) { + BusinessAlert businessAlert = MapstructUtils.convert(param, BusinessAlert.class); + validEntityBeforeSave(businessAlert,true); + return baseMapper.updateById(businessAlert) > 0; + } + + + /** + * 校验并批量删除预警任务信息 + * + * @param alertIdList 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteBusinessAlert(List alertIdList, Boolean isValid) { + if(isValid){ + if (ObjectUtil.isEmpty(alertIdList)){ + throw new ServiceException("预警【Id】为空!"); + } + } + return baseMapper.deleteByIds(alertIdList) > 0; + } + + /** + * 修改预警中处置状态 + * @param businessId + * @param flowStatus + */ + @Override + public void updateAlertStatus(String businessId, String flowStatus) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.set(BusinessAlert::getHandleType, BusinessStatusEnum.getByStatus(flowStatus)); + + wrapper.eq(BusinessAlert::getId, businessId); + + this.baseMapper.update(wrapper); + + } + + + /** + * 查询全部预警 + * @param bo + * @param pageQuery + * @return + */ + @Override + public TableDataInfo pageBusinessAlert(BusinessAlertBo bo, PageQuery pageQuery) { + QueryWrapper wrapper = buildQueryWrapper(bo); + + Page page = this.baseMapper.pageBusinessAlert(pageQuery.build(), wrapper); + + return TableDataInfo.build(page); + } + + /** + * 查询当前用户已完成预警 + * @param bo + * @param pageQuery + * @return + */ + @Override + public TableDataInfo pageBusinessAlertFinish(BusinessAlertBo bo, PageQuery pageQuery) { + QueryWrapper wrapper = buildQueryWrapper(bo); + buildCommonQueryWrapper(wrapper); + + wrapper.in("a.approver", LoginHelper.getUserId()); + Page page = this.baseMapper.pageAlertFinish(pageQuery.build(), wrapper); + + return TableDataInfo.build(page); + } + + + /** + * 查询当前用户待办预警 + * @param bo + * @param pageQuery + * @return + */ + @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("a.processed_by", remoteWorkflowService.getPermissions()); + wrapper.in("a.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); + Map> listMap = remoteWorkflowService.currentTaskAllUser(taskIds); + records.forEach(t -> { + List userList = listMap.getOrDefault(t.getId(), Collections.emptyList()); + if (CollUtil.isNotEmpty(userList)) { + t.setApprover(StreamUtils.join(userList, e -> String.valueOf(e.getUserId()))); + t.setApproveName(StreamUtils.join(userList, RemoteUserVo::getNickName)); + } + }); + } + return TableDataInfo.build(page); + } + + + /** + * 构建wrapper + * @param bo + * @return + */ + private QueryWrapper buildQueryWrapper(BusinessAlertBo bo) { + QueryWrapper wrapper = new QueryWrapper<>(); + + wrapper.orderByAsc("ba.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); + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusinessAlert alert, Boolean validId){ + if (ObjectUtil.isEmpty(alert.getId())){ + throw new ServiceException("预警【Id】为空!"); + } + } +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java new file mode 100644 index 0000000..186dca2 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java @@ -0,0 +1,98 @@ +package org.dromara.business.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.business.domain.bo.BusinessAlertBo; +import org.dromara.business.domain.model.StatObj; +import org.dromara.business.mapper.BusinessAlertMapper; +import org.dromara.business.service.BusinessAlertStatisticsService; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.system.api.RemoteDeptService; +import org.dromara.system.api.domain.vo.RemoteDeptVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * + *预警统计Service业务层处理 + */ +@RequiredArgsConstructor +@Service +public class BusinessAlertStatisticsServiceImpl implements BusinessAlertStatisticsService { + + private final BusinessAlertMapper baseMapper; + + @DubboReference + RemoteDeptService remoteDeptService; + + /** + * 按照月份分类预警数量(包含权限) + * @param businessAlertBo + * @return + */ + @Override + public List countMonthAlert(BusinessAlertBo businessAlertBo) { + if (ObjectUtil.isEmpty(businessAlertBo.getDeptId())){ + throw new ServiceException("部门【id】为空"); + } + + List remoteDeptVoList = remoteDeptService.selectListByParentId(businessAlertBo.getDeptId()); + List departIdList = remoteDeptVoList.stream().map(RemoteDeptVo::getDeptId).toList(); + businessAlertBo.setDeptIdList(departIdList); + + List> mapList = baseMapper.listMonthAlert(businessAlertBo); + + return mapList.stream().map(data -> new StatObj(data.get("dateMonth") + "", data.get("total"))).collect(Collectors.toList()); + + } + + + @Override + public ListcountDepartAlert(BusinessAlertBo businessAlertBo) { + List> mapList = baseMapper.listDepartAlert(businessAlertBo); + + return mapList.stream().map(data -> new StatObj(data.get("deptName") + "", Long.parseLong(data.get("total") + ""),"deptId",data.get("deptId"))).collect(Collectors.toList()); + } + + @Override + public List countMonthAlertStatus(BusinessAlertBo businessAlertBo) { + List> mapList = baseMapper.listMonthAlertStatus(businessAlertBo); + + return mapList.stream() + .map(map -> new StatObj( + Objects.toString(map.get("dateMonth")), + List.of( + new StatObj("total", map.get("total")), + new StatObj("todoCount", map.get("todoCount")), + new StatObj("finishCount", map.get("finishCount")) + ) + )) + .collect(Collectors.toList()); + + } + + @Override + public List countDepartAlertStatus(BusinessAlertBo businessAlertBo) { + List> mapList = baseMapper.listDepartAlertStatus(businessAlertBo); + + return mapList.stream() + .map(map -> new StatObj( + Objects.toString(map.get("deptName")), + List.of( + new StatObj("total", map.get("total")), + new StatObj("todoCount", map.get("todoCount")), + new StatObj("finishCount", map.get("finishCount")) + ),"deptId",map.get("deptId") + )) + .collect(Collectors.toList()); + } + + +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessDepartBoundaryServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessDepartBoundaryServiceImpl.java new file mode 100644 index 0000000..34a9542 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessDepartBoundaryServiceImpl.java @@ -0,0 +1,235 @@ +package org.dromara.business.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.business.domain.BusinessDepartBoundary; +import org.dromara.business.domain.BusinessGeospatialVectors; +import org.dromara.business.domain.BusinessPatrolAreas; +import org.dromara.business.domain.BusinessVectorDict; +import org.dromara.business.mapper.BusinessDepartBoundaryMapper; +import org.dromara.business.service.IBusinessDepartBoundaryService; +import org.dromara.business.service.IBusinessVectorDictService; +import org.dromara.business.utils.BatchProcessorUtil; +import org.dromara.business.utils.ShpAnalysisUtil; +import org.dromara.common.core.exception.ServiceException; +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.RemoteDeptService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.sql.DataSource; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 部门区域 + */ +@Service +@RequiredArgsConstructor +public class BusinessDepartBoundaryServiceImpl extends ServiceImpl implements IBusinessDepartBoundaryService { + + + private final IBusinessVectorDictService vectorDictService; + + @DubboReference + RemoteDeptService remoteDeptService; + + private final DataSource dataSource; + + @Override + public TableDataInfo listSysDepartBoundary(PageQuery pageQuery, BusinessDepartBoundary departBoundary) { + Page page = baseMapper.listSysDepartBoundary(pageQuery.build(),departBoundary); + + return TableDataInfo.build(page); + + } + + @Override + public List listSysDepartBoundaryGeomFromText(BusinessDepartBoundary departBoundary) { + return baseMapper.listSysDepartBoundaryGeomFromText(departBoundary); + } + + @Override + public List queryByDeptId(String deptId) { + return baseMapper.queryByDeptId(deptId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean uploadShpFile(MultipartFile file,String deptId) { + List geospatialVectorsList = new ArrayList<>(); + try { + //1、首先调用解析工具拿到解析的字段集合 + InputStream inputStream = file.getInputStream(); + List> mapList = ShpAnalysisUtil.analysisShpFile(inputStream); + + // 3. 构建字典map + List fieldsInfoList = vectorDictService.listVectorField(); + + Map> dictMap = fieldsInfoList + .stream() + .collect(Collectors.toMap( + BusinessVectorDict::getDictCode, + v -> v.getFieldMappingsList().stream() + .map(mapping -> mapping.getItemValue().toLowerCase()) // 转小写 + .collect(Collectors.toList()) + )); + + // 4. 遍历 mapList,替换映射关系并只保留有效条目 + List> resultList = mapList.stream() + .map(originalMap -> originalMap.entrySet().stream() + .filter(entry -> { + String keyLower = entry.getKey().toLowerCase(); // 将 mapList 中的 key 转换为小写 + // 遍历 dictMap 的所有 List,检查其中是否包含该 key + return dictMap.values().stream() + .anyMatch(list -> list.contains(keyLower)); // 判断 dictMap 中的 List 是否包含该 key + }) + .collect(Collectors.toMap( + entry -> { + // 根据匹配的 key 查找 dictMap 中对应的 key + return dictMap.entrySet().stream() + .filter(mapEntry -> mapEntry.getValue().contains(entry.getKey().toLowerCase())) + .map(Map.Entry::getKey) + .findFirst() + .orElse(""); // 如果没有匹配到,则返回空字符串 + }, + Map.Entry::getValue + )) + ) + .filter(transformedMap -> !transformedMap.isEmpty()) // 过滤空的 Map + .collect(Collectors.toList()); + + + // 5. 通过反射设置 GeospatialVectors 对象的属性 + for (Map transformedMap : resultList) { + BusinessGeospatialVectors geoVector = new BusinessGeospatialVectors(); + + transformedMap.forEach((key, value) -> { + try { + // 尝试通过反射找到相应的Setter方法,并调用 + Method setterMethod = BusinessGeospatialVectors.class.getMethod("set" + capitalizeFirstLetter(key), String.class); + + setterMethod.invoke(geoVector, value); + } catch (Exception e) { + e.printStackTrace(); + } + }); + + geoVector.setCreateTime(new Date()); + geospatialVectorsList.add(geoVector); + } + + //6、生成新的对象集合存储数据表中 + List boundaryList = buildBusinessDepartBoundary(geospatialVectorsList,deptId); + + // 分批处理 + int startIndex = 0; // 从第 0 条开始 + int batchSize = 2000; // 每批处理 2000 条 + boolean flag = BatchProcessorUtil.processBatches(boundaryList, batchSize, startIndex, batch -> { + //批量新增部门区域数据 +// this.baseMapper.saveBatchBoundary(batch); + }); + + if (flag) { + System.out.println("所有数据处理完成!"); + } + + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + @Override + public boolean updateDepartBoundary(BusinessDepartBoundary departBoundary) { + if (ObjectUtil.isEmpty(departBoundary.getId())) { + throw new ServiceException("【id】参数为空"); + } + + return this.updateById(departBoundary); + } + + @Override + public boolean addDepartBoundary(BusinessDepartBoundary departBoundary) { + return this.saveOrUpdate(departBoundary); + } + + @Override + public String listJson(BusinessDepartBoundary departBoundary) { + if(StringUtils.isBlank(departBoundary.getDeptId())){ + throw new ServiceException("部门【id】不存在"); + } + + return this.baseMapper.listJson(departBoundary); + } + + @Override + public boolean deleteDepartBoundary(String id) { + BusinessDepartBoundary departBoundary = this.baseMapper.selectById(id); + + if (ObjectUtil.isEmpty(departBoundary)) { + throw new ServiceException("实体不存在!"); + } + + return this.baseMapper.deleteById(departBoundary.getId())>0; + } + + + /** + * 根据解析的shp文件数据,构建部门区域 + * @param geospatialVectorsList + * @return + */ + private List buildBusinessDepartBoundary(List geospatialVectorsList,String deptId) { + List resultList = new ArrayList<>(); + + List> namePathList = remoteDeptService.getNamePathList(); + + Map>> namePathMap = namePathList.stream() + .filter(item -> item.containsKey("shpNo")) + .collect(Collectors.groupingBy(item -> item.get("shpNo").toString())); + + geospatialVectorsList.forEach(param->{ + BusinessDepartBoundary businessDepartBoundary = new BusinessDepartBoundary(); + businessDepartBoundary.setBoundary(param.getLandCategories()); + businessDepartBoundary.setShpNo(param.getLandUnitCode()); + if (ObjectUtil.isNotEmpty(namePathMap.get(param.getLandUnitCode()))){ + businessDepartBoundary.setDeptName(namePathMap.get(param.getLandUnitCode()).get(0).get("deptName") + ""); + businessDepartBoundary.setDeptId(namePathMap.get(param.getLandUnitCode()).get(0).get("deptId") + ""); + businessDepartBoundary.setCommunityName(namePathMap.get(param.getLandUnitCode()).get(0).get("namePath") + ""); + + resultList.add(businessDepartBoundary); + } + }); + return resultList; + } + + + private static String capitalizeFirstLetter(String str) { + if (str == null || str.isEmpty()) { + return str; + } + return str.substring(0, 1).toUpperCase() + str.substring(1); + } +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessPatrolAreasServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessPatrolAreasServiceImpl.java new file mode 100644 index 0000000..670e32d --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessPatrolAreasServiceImpl.java @@ -0,0 +1,197 @@ +package org.dromara.business.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.business.domain.*; +import org.dromara.business.domain.bo.BusinessPatrolAreasBo; +import org.dromara.business.mapper.BusinessPatrolAreasMapper; +import org.dromara.business.service.*; +import org.dromara.business.utils.ShpAnalysisUtil; +import org.dromara.common.core.exception.ServiceException; +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.RemoteDeptService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteDeptVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 巡查区域 + */ +@RequiredArgsConstructor +@Service +public class BusinessPatrolAreasServiceImpl extends ServiceImpl implements IBusinessPatrolAreasService { + + private final IBusinessVectorDictService vectorDictService; + + @DubboReference + private RemoteUserService remoteUserService; + @DubboReference + private RemoteDeptService remoteDeptService; + + @Override + public TableDataInfo pagePatrolAreas(PageQuery pageQuery, BusinessPatrolAreasBo patrolAreasBo) { + LoginUser user = LoginHelper.getLoginUser(); + List deptIds = new ArrayList<>(); + String departIds = null; + if(StringUtils.isBlank(patrolAreasBo.getDeptId())){ + RemoteDeptVo remoteDeptVo = remoteDeptService.selectDeptById(user.getDeptId()); + if(ObjectUtil.isEmpty(remoteDeptVo)){ + throw new ServiceException("部门不存在"); + } + departIds = user.getDeptId() + ""; + }else { + departIds = patrolAreasBo.getDeptId(); + } + + deptIds.add(departIds); + + return TableDataInfo.build(this.baseMapper.listPatrolAreas(pageQuery.build(), patrolAreasBo, deptIds)); + } + + @Override + public List listPatrolAreas(BusinessPatrolAreasBo patrolAreasBo) { + return this.baseMapper.listPatrolAreas(patrolAreasBo, patrolAreasBo.getDeptIds()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updatePatrolAreas(BusinessPatrolAreas patrolAreas) { + patrolAreas.setUserName(remoteUserService.selectUserNameById(Long.valueOf(patrolAreas.getUserId()))); + return this.updateById(patrolAreas); + } + + @Override + public List exportXls(BusinessPatrolAreas patrolAreas) { + LambdaQueryWrapper wrapper = buildWrapper(patrolAreas); + + return this.list(wrapper); + } + + @Override + public void addPatrolAreas(MultipartFile file) { + List geospatialVectorsList = new ArrayList<>(); + try { + //1、首先调用解析工具拿到解析的字段集合 + InputStream inputStream = file.getInputStream(); + List> mapList = ShpAnalysisUtil.analysisShpFile(inputStream); + + // 3. 构建字典map + List fieldsInfoList = vectorDictService.listVectorField(); + + Map> dictMap = fieldsInfoList + .stream() + .collect(Collectors.toMap( + BusinessVectorDict::getDictCode, + v -> v.getFieldMappingsList().stream() + .map(mapping -> mapping.getItemValue().toLowerCase()) // 转小写 + .collect(Collectors.toList()) + )); + + // 4. 遍历 mapList,替换映射关系并只保留有效条目 + List> resultList = mapList.stream() + .map(originalMap -> originalMap.entrySet().stream() + .filter(entry -> { + String keyLower = entry.getKey().toLowerCase(); // 将 mapList 中的 key 转换为小写 + // 遍历 dictMap 的所有 List,检查其中是否包含该 key + return dictMap.values().stream() + .anyMatch(list -> list.contains(keyLower)); // 判断 dictMap 中的 List 是否包含该 key + }) + .collect(Collectors.toMap( + entry -> { + // 根据匹配的 key 查找 dictMap 中对应的 key + return dictMap.entrySet().stream() + .filter(mapEntry -> mapEntry.getValue().contains(entry.getKey().toLowerCase())) + .map(Map.Entry::getKey) + .findFirst() + .orElse(""); // 如果没有匹配到,则返回空字符串 + }, + Map.Entry::getValue + )) + ) + .filter(transformedMap -> !transformedMap.isEmpty()) // 过滤空的 Map + .collect(Collectors.toList()); + + + // 5. 通过反射设置 GeospatialVectors 对象的属性 + for (Map transformedMap : resultList) { + BusinessGeospatialVectors geoVector = new BusinessGeospatialVectors(); + + transformedMap.forEach((key, value) -> { + try { + // 尝试通过反射找到相应的Setter方法,并调用 + Method setterMethod = BusinessGeospatialVectors.class.getMethod("set" + capitalizeFirstLetter(key), String.class); + + setterMethod.invoke(geoVector, value); + } catch (Exception e) { + e.printStackTrace(); + } + }); + + geoVector.setCreateTime(new Date()); + geospatialVectorsList.add(geoVector); + } + + //6、生成新的对象集合存储数据表中 + //todo 处理这个集合geospatialVectorsList + List areasList = buildBusinessPatrolAreas(geospatialVectorsList); + + + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 根据解析shp得到的内容封装到BusinessPatrolAreas这个类里面 + * @param paramList + * @return + */ + private List buildBusinessPatrolAreas(List paramList) { + List resultList = new ArrayList<>(); + + return resultList; + } + + private static String capitalizeFirstLetter(String str) { + if (str == null || str.isEmpty()) { + return str; + } + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + + private LambdaQueryWrapper buildWrapper(BusinessPatrolAreas patrolAreas) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + + if (ObjectUtil.isNotEmpty(patrolAreas.getName())){ + wrapper.like(BusinessPatrolAreas::getName, patrolAreas.getName()); + } + + if (ObjectUtil.isNotEmpty(patrolAreas.getDeptId())){ + wrapper.eq(BusinessPatrolAreas::getDeptId, patrolAreas.getDeptId()); + } + + if (ObjectUtil.isNotEmpty(patrolAreas.getAreasIdList())){ + wrapper.in(BusinessPatrolAreas::getId, patrolAreas.getAreasIdList()); + } + + return wrapper; + } +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessVectorDictItemServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessVectorDictItemServiceImpl.java new file mode 100644 index 0000000..cebde8c --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessVectorDictItemServiceImpl.java @@ -0,0 +1,28 @@ +package org.dromara.business.service.impl; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.dromara.business.domain.BusinessVectorDictItem; +import org.dromara.business.mapper.BusinessVectorDictItemMapper; +import org.dromara.business.service.IBusinessVectorDictItemService; +import org.springframework.stereotype.Service; + +import java.util.List; + + +/** + * 矢量数据字段映射关联服务类 + */ +@Service +public class BusinessVectorDictItemServiceImpl extends ServiceImpl implements IBusinessVectorDictItemService { + + + @Override + public List findDictItemByDictId(String dictId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(BusinessVectorDictItem::getDictId, dictId); + + return this.baseMapper.selectList(wrapper); + } +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessVectorDictServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessVectorDictServiceImpl.java new file mode 100644 index 0000000..363d5b3 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessVectorDictServiceImpl.java @@ -0,0 +1,37 @@ +package org.dromara.business.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.dromara.business.domain.BusinessVectorDict; +import org.dromara.business.mapper.BusinessVectorDictMapper; +import org.dromara.business.service.IBusinessVectorDictService; +import org.springframework.stereotype.Service; + +import java.util.List; + + +/** + * 矢量数据字段映射主表服务类 + */ +@Service +public class BusinessVectorDictServiceImpl extends ServiceImpl implements IBusinessVectorDictService { + + + @Override + public List listVectorField() { + return this.baseMapper.listVectorField(); + } + + @Override + public BusinessVectorDict findVectorDictById(String dictId) { + if (ObjectUtil.isEmpty(dictId)){ + throw new RuntimeException("【dictId】为空,参数为空!"); + } + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(BusinessVectorDict::getId, dictId); + + return this.baseMapper.selectOne(wrapper); + } +} diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/WaylineAlertServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/WaylineAlertServiceImpl.java deleted file mode 100644 index 9c1c574..0000000 --- a/dk-modules/business/src/main/java/org/dromara/business/service/impl/WaylineAlertServiceImpl.java +++ /dev/null @@ -1,141 +0,0 @@ -package org.dromara.business.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.dromara.business.domain.WaylineAlert; -import org.dromara.business.domain.bo.WaylineAlertBo; -import org.dromara.business.domain.vo.WaylineAlertVo; -import org.dromara.business.mapper.WaylineAlertMapper; -import org.dromara.business.service.IWaylineAlertService; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 预警任务Service业务层处理 - * - * @author LionLi - * @date 2025-02-27 - */ -@RequiredArgsConstructor -@Service -public class WaylineAlertServiceImpl implements IWaylineAlertService { - - private final WaylineAlertMapper baseMapper; - - /** - * 查询预警任务 - * - * @param id 主键 - * @return 预警任务 - */ - @Override - public WaylineAlertVo getWaylineAlert(String id){ - return baseMapper.selectVoById(id); - } - - /** - * 分页查询预警任务列表 - * - * @param param 查询条件 - * @param pageQuery 分页参数 - * @return 预警任务分页列表 - */ - @Override - public TableDataInfo pageWaylineAlert(WaylineAlertBo param, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(param); - Page result = baseMapper.pageAlert(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - - /** - * 查询符合条件的预警任务列表 - * - * @param param 查询条件 - * @return 预警任务列表 - */ - @Override - public List listWaylineAlert(WaylineAlertBo param) { - LambdaQueryWrapper lqw = buildQueryWrapper(param); - return baseMapper.selectVoList(lqw); - } - - - /** - * 新增预警任务 - * - * @param param 预警任务 - * @return 是否新增成功 - */ - @Override - public Boolean addWaylineAlert(WaylineAlertBo param) { - WaylineAlert alert = MapstructUtils.convert(param, WaylineAlert.class); - validEntityBeforeSave(alert,false); - return this.baseMapper.insert(alert) > 0; - } - - /** - * 批量添加 - * @param alertList 预警任务 - * @return - */ - @Override - public Boolean saveBatchAlert(List alertList) { - return this.baseMapper.insertBatch(alertList); - } - - /** - * 修改预警任务 - * - * @param param 预警任务 - * @return 是否修改成功 - */ - @Override - public Boolean updateWaylineAlert(WaylineAlertBo param) { - WaylineAlert alert = MapstructUtils.convert(param, WaylineAlert.class); - validEntityBeforeSave(alert,true); - return baseMapper.updateById(alert) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(WaylineAlert alert,Boolean validId){ - if (ObjectUtil.isEmpty(alert.getId())){ - throw new ServiceException("预警【Id】为空!"); - } - } - - /** - * 校验并批量删除预警任务信息 - * - * @param alertIdList 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 - */ - @Override - public Boolean deleteWaylineAlert(List alertIdList, Boolean isValid) { - if(isValid){ - if (ObjectUtil.isEmpty(alertIdList)){ - throw new ServiceException("预警Id为空!"); - } - } - return baseMapper.deleteByIds(alertIdList) > 0; - } - - private LambdaQueryWrapper buildQueryWrapper(WaylineAlertBo bo) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - - - wrapper.orderByAsc(WaylineAlert::getCreateTime); - return wrapper; - } -} diff --git a/dk-modules/business/src/main/java/org/dromara/business/utils/BatchProcessorUtil.java b/dk-modules/business/src/main/java/org/dromara/business/utils/BatchProcessorUtil.java new file mode 100644 index 0000000..e16155c --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/utils/BatchProcessorUtil.java @@ -0,0 +1,39 @@ +package org.dromara.business.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/business/src/main/java/org/dromara/business/utils/ShpAnalysisUtil.java b/dk-modules/business/src/main/java/org/dromara/business/utils/ShpAnalysisUtil.java new file mode 100644 index 0000000..58a8268 --- /dev/null +++ b/dk-modules/business/src/main/java/org/dromara/business/utils/ShpAnalysisUtil.java @@ -0,0 +1,368 @@ +package org.dromara.business.utils; + +import cn.hutool.core.util.ObjectUtil; +import org.geotools.data.FileDataStore; +import org.geotools.data.FileDataStoreFinder; +import org.geotools.data.shapefile.ShapefileDataStore; +import org.geotools.data.simple.SimpleFeatureCollection; +import org.geotools.data.simple.SimpleFeatureIterator; +import org.geotools.data.simple.SimpleFeatureSource; +import org.geotools.geometry.jts.JTS; +import org.geotools.referencing.CRS; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.MultiPolygon; +import org.locationtech.jts.geom.Polygon; +import org.locationtech.jts.operation.union.UnaryUnionOp; +import org.opengis.feature.Property; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.TransformException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipException; +import java.util.zip.ZipInputStream; + +/** + * shp文件读取工具类 + * 支持不同类型的地理要素 + */ +public class ShpAnalysisUtil { + + private static final Logger log = LoggerFactory.getLogger(ShpAnalysisUtil.class); + + private static final String CHECK_FIELD = "O_Com"; + + /** + * 读取shp文件,返回要素集合 + * @param shpPath shp文件路径 + * @return 要素集合,包含地理位置和属性信息 + */ + public static List> analysisShpFile(String shpPath) { + List> resultList = new ArrayList<>(); + + try { + resultList=analysisShpFile(shpPath, "GBK"); + } catch (Exception e) { + log.error("无法使用支持的字符编码读取shp文件: {}", e.getMessage()); + } + + return resultList; + } + + /** + * 读取shp文件,返回要素集合 + * @param shpInputStream shp文件输入流 + * @return 要素集合,包含地理位置和属性信息 + */ + public static List> analysisShpFile(InputStream shpInputStream) { + List> resultList = new ArrayList<>(); + + try { + resultList = analysisShpFile(shpInputStream, "GBK"); + } catch (Exception e) { + log.error("无法使用支持的字符编码读取shp文件输入流: {}", e.getMessage()); + } + + return resultList; + } + + /** + * 读取shp文件的主要方法(仅支持ZIP输入流) + * + * @param shpInputStream shp文件ZIP输入流 + * @param charset 字符编码 + * @return 要素集合,包含地理位置和属性信息 + * @throws IllegalArgumentException 如果输入流不是ZIP格式 + */ + public static List> analysisShpFile(InputStream shpInputStream, String charset) { + // 存储解析出的要素集合 + List> resultList = new ArrayList<>(); + File tempDir = null; + + try { + // 创建临时目录 + tempDir = Files.createTempDirectory("plough_shp_").toFile(); + tempDir.deleteOnExit(); // 额外保障 + + // 使用指定编码的ZipInputStream处理 + Charset zipCharset = Charset.forName(charset); + try (ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(shpInputStream), zipCharset)) { + ZipEntry entry; + boolean shpFound = false; + while ((entry = zipInputStream.getNextEntry()) != null) { + // 处理文件名编码问题 + log.info("文件名字:{}",entry.getName()); + File outputFile = new File(tempDir, entry.getName()); + + // 创建父目录 + if (entry.isDirectory()) { + outputFile.mkdirs(); + } else { + // 确保父目录存在 + outputFile.getParentFile().mkdirs(); + + // 写入文件 + try (FileOutputStream fos = new FileOutputStream(outputFile)) { + byte[] buffer = new byte[1024]; + int len; + while ((len = zipInputStream.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + } + + // 检查是否为SHP文件 + if (entry.getName().toLowerCase().endsWith(".shp")) { + shpFound = true; + } + } + } + + // 如果没有找到SHP文件,抛出异常 + if (!shpFound) { + throw new FileNotFoundException("ZIP压缩包中未找到SHP文件"); + } + } catch (ZipException e) { + // 非ZIP输入流,抛出异常 + throw new IllegalArgumentException("输入流不是有效的ZIP格式", e); + } + + // 查找第一个.shp文件 + File shpFile = findFirstShpFile(tempDir); + if (shpFile == null) { + throw new FileNotFoundException("未找到SHP文件"); + } + + // 使用找到的SHP文件路径调用现有方法 + resultList = analysisShpFile(shpFile.getAbsolutePath(), charset); + + } catch (Exception e) { + log.error("处理SHP文件输入流失败: {}", e.getMessage(), e); + throw new RuntimeException("处理SHP文件失败", e); + } finally { + // 尝试删除临时目录及其内容 + if (tempDir != null && tempDir.exists()) { + deleteDirectory(tempDir); + } + //关闭流文件 + try { + shpInputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return resultList; + } + + + /** + * 读取shp文件的主要方法 + * + * @param shpPath shp文件路径 + * @param charset 字符编码 + * @return 要素集合,包含地理位置和属性信息 + */ + public static List> analysisShpFile(String shpPath, String charset) { + // 存储解析出的要素集合 + List> resultList = new ArrayList<>(); + + try { + // 1、验证文件在路径中是否存在 + File shpFile = new File(shpPath); + if (!shpFile.exists()) { + log.error("shp文件不存在:{} ", shpPath); + return resultList; + } + + // 2、设置GeoTools坐标的字符编码 + System.setProperty("org.geotools.referencing.charset", charset); + System.setProperty("org.geotools.shapefile.charset", charset); + + // 3、获取数据存储实例 + FileDataStore dataStore = FileDataStoreFinder.getDataStore(shpFile); + if (ObjectUtil.isEmpty(dataStore)) { + log.error("无法打开shape文件:{} ", shpPath); + return resultList; + } + + // 4、设置shp文件的DBF文件编码 + if (dataStore instanceof ShapefileDataStore) { + ((ShapefileDataStore) dataStore).setCharset(Charset.forName(charset)); + } + + try { + // 5、获取要素源和要素集合 + SimpleFeatureSource featureSource = dataStore.getFeatureSource(); + SimpleFeatureCollection featureCollection = featureSource.getFeatures(); + String typeName = dataStore.getTypeNames()[0]; + CoordinateReferenceSystem sourceCRS = dataStore.getFeatureSource(typeName).getSchema().getCoordinateReferenceSystem(); + CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326"); + MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true); + + // 遍历处理每个要素 + try (SimpleFeatureIterator iterator = featureCollection.features()) { + while (iterator.hasNext()) { + SimpleFeature feature = iterator.next(); + Map featureMap = new HashMap<>(); + + for (Property property : feature.getProperties()) { + String name = property.getName().toString(); + Object value = property.getValue(); + + // 处理几何数据 + try { + if (value instanceof Geometry) { + // 如果值本身就是Geometry类型,直接使用 + value = analysisGeometry((Geometry) value, transform); + } + } catch (Exception e) { + log.warn("Error processing geometry for property {}: {}", name, e.getMessage()); + } + + // 处理特殊字段 + if (name.startsWith(CHECK_FIELD)) { + Map parsedValues = parseOComValue(value); + featureMap.putAll(parsedValues); + } else { + featureMap.put(name, value.toString()); + } + } + + resultList.add(featureMap); + } + } + } finally { + // 确保数据存储被正确关闭 + dataStore.dispose(); + } + + } catch (Exception e) { + e.printStackTrace(); + log.error("读取shape文件失败: {}", e.getMessage()); + } + + return resultList; + } + + + /** + * 解析O_Com字段值 + * + * @param oComValue O_Com字段值 + * @return 解析后的属性Map + */ + private static Map parseOComValue(Object oComValue) { + // 初始化返回结果Map + Map attributes = new HashMap<>(); + if (ObjectUtil.isEmpty(oComValue)) return attributes; + + // 预处理字符串,去除多余空格 + String comStr = oComValue.toString().trim(); + + try { + // 按分号分割键值对 + String[] pairs = comStr.split(";"); + for (String pair : pairs) { + pair = pair.trim(); + if (pair.isEmpty()) continue; + + // 解析键值对 + String[] keyValue = pair.split(":"); + if (keyValue.length == 2) { + // 清理键值中的引号 + String key = keyValue[0].trim().replace("\"", ""); + String value = keyValue[1].trim().replace("\"", ""); + + // 直接存储字符串值,不进行类型转换 + attributes.put(key, value); + } + } + } catch (Exception e) { + log.error("解析O_Com字段值失败: {}", e.getMessage()); + } + + return attributes; + } + + + private static String analysisGeometry(Geometry geometry, MathTransform transform) throws TransformException { + String resultStr = ""; + // 对每个 Polygon 进行坐标转换 + Geometry transformedGeometry = JTS.transform(geometry, transform); + MultiPolygon multiPolygon = (MultiPolygon) transformedGeometry; + Geometry unionGeometry = UnaryUnionOp.union(multiPolygon); + if (unionGeometry instanceof Polygon) { + Polygon polygon = (Polygon) unionGeometry; + resultStr = convertPolygonToWKT(polygon); + } + + return resultStr; + } + + + + private static String convertPolygonToWKT(Polygon polygon) { + StringBuffer polygonSb = new StringBuffer("GEOMETRYCOLLECTION(POLYGON(("); + + Coordinate[] coordinates = polygon.getCoordinates(); + for (int i = 0; i < coordinates.length; i++) { + Coordinate coord = coordinates[i]; + if (i > 0) polygonSb.append(","); + polygonSb.append(coord.y + " " + coord.x); + } + if(coordinates[0].x !=coordinates[coordinates.length-1].x){ + polygonSb.append(","+coordinates[0].y + " " + coordinates[0].x); + } + polygonSb.append(")))"); + return polygonSb.toString(); + } + + + /** + * 递归删除目录 + * @param directory 要删除的目录 + */ + private static void deleteDirectory(File directory) { + File[] files = directory.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isDirectory()) { + deleteDirectory(file); + } else { + boolean deleted = file.delete(); + if (!deleted) { + log.warn("删除文件 {} 失败", file.getAbsolutePath()); + } + } + } + } + + boolean dirDeleted = directory.delete(); + if (!dirDeleted) { + log.warn("删除目录 {} 失败", directory.getAbsolutePath()); + } + } + + /** + * 在指定目录中查找第一个.shp文件 + * @param directory 搜索目录 + * @return 找到的第一个.shp文件,未找到返回null + */ + private static File findFirstShpFile(File directory) { + File[] files = directory.listFiles((dir, name) -> name.toLowerCase().endsWith(".shp")); + return files != null && files.length > 0 ? files[0] : null; + } + + +} diff --git a/dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml b/dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml new file mode 100644 index 0000000..1d99790 --- /dev/null +++ b/dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/dk-modules/business/src/main/resources/mapper/business/BusinessDepartBoundaryMapper.xml b/dk-modules/business/src/main/resources/mapper/business/BusinessDepartBoundaryMapper.xml new file mode 100644 index 0000000..4a17ca7 --- /dev/null +++ b/dk-modules/business/src/main/resources/mapper/business/BusinessDepartBoundaryMapper.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + INSERT INTO business_depart_boundary ( + dept_id, + dept_name, + community_name, + boundary, + perimeter, + area, + area_mu, + shp_no, + village_type, + create_by, + create_time, + update_by, + update_time, + create_dept + ) + VALUES + + (#{item.deptId}, + #{item.deptName}, + #{item.communityName}, + ST_GeomFromText(#{item.boundary}), + #{item.perimeter}, + #{item.area}, + #{item.areaMu}, + #{item.shpNo}, + #{item.villageType}, + #{item.createBy}, + #{item.createTime}, + #{item.updateBy}, + #{item.updateTime}, + #{item.createDept}) + + + + + + diff --git a/dk-modules/business/src/main/resources/mapper/business/BusinessPatrolAreasMapper.xml b/dk-modules/business/src/main/resources/mapper/business/BusinessPatrolAreasMapper.xml new file mode 100644 index 0000000..51d376f --- /dev/null +++ b/dk-modules/business/src/main/resources/mapper/business/BusinessPatrolAreasMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/dk-modules/business/src/main/resources/mapper/business/BusinessVectorDictItemMapper.xml b/dk-modules/business/src/main/resources/mapper/business/BusinessVectorDictItemMapper.xml new file mode 100644 index 0000000..b217399 --- /dev/null +++ b/dk-modules/business/src/main/resources/mapper/business/BusinessVectorDictItemMapper.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/dk-modules/business/src/main/resources/mapper/business/BusinessVectorDictMapper.xml b/dk-modules/business/src/main/resources/mapper/business/BusinessVectorDictMapper.xml new file mode 100644 index 0000000..215e4aa --- /dev/null +++ b/dk-modules/business/src/main/resources/mapper/business/BusinessVectorDictMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + diff --git a/dk-modules/business/src/main/resources/mapper/business/WaylineAlertMapper.xml b/dk-modules/business/src/main/resources/mapper/business/WaylineAlertMapper.xml deleted file mode 100644 index eeef8da..0000000 --- a/dk-modules/business/src/main/resources/mapper/business/WaylineAlertMapper.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - diff --git a/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysEmailController.java b/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysEmailController.java index 19da5ba..d5ae8b2 100644 --- a/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysEmailController.java +++ b/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysEmailController.java @@ -2,6 +2,8 @@ package org.dromara.resource.controller; import cn.hutool.core.util.RandomUtil; +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.core.constant.Constants; @@ -30,6 +32,7 @@ import java.time.Duration; @RequiredArgsConstructor @RestController @RequestMapping("/email") +@Tag(name = "邮件功能") public class SysEmailController extends BaseController { private final MailProperties mailProperties; @@ -39,6 +42,7 @@ public class SysEmailController extends BaseController { * * @param email 邮箱 */ + @Operation(summary = "邮箱验证码",description = "邮箱验证码") @RateLimiter(key = "#email", time = 60, count = 1) @GetMapping("/code") public R emailCode(@NotBlank(message = "{user.email.not.blank}") String email) { diff --git a/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysOssConfigController.java b/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysOssConfigController.java index 506cdb7..d8803a4 100644 --- a/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysOssConfigController.java +++ b/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysOssConfigController.java @@ -1,6 +1,8 @@ package org.dromara.resource.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; @@ -28,6 +30,7 @@ import java.util.Arrays; * @author 孤舟烟雨 * @date 2021-08-13 */ +@Tag(name = "对象存储配置") @Validated @RequiredArgsConstructor @RestController @@ -41,6 +44,7 @@ public class SysOssConfigController extends BaseController { */ @SaCheckPermission("system:ossConfig:list") @GetMapping("/list") + @Operation(summary = "查询对象存储配置列表",description = "查询对象存储配置列表") public TableDataInfo list(@Validated(QueryGroup.class) SysOssConfigBo bo, PageQuery pageQuery) { return iSysOssConfigService.queryPageList(bo, pageQuery); } @@ -52,6 +56,7 @@ public class SysOssConfigController extends BaseController { */ @SaCheckPermission("system:ossConfig:list") @GetMapping("/{ossConfigId}") + @Operation(summary = "获取对象存储配置详细信息",description = "获取对象存储配置详细信息") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("ossConfigId") Long ossConfigId) { return R.ok(iSysOssConfigService.queryById(ossConfigId)); } @@ -62,6 +67,7 @@ public class SysOssConfigController extends BaseController { @SaCheckPermission("system:ossConfig:add") @Log(title = "对象存储配置", businessType = BusinessType.INSERT) @PostMapping() + @Operation(summary = "新增对象存储配置",description = "新增对象存储配置") public R add(@Validated(AddGroup.class) @RequestBody SysOssConfigBo bo) { return toAjax(iSysOssConfigService.insertByBo(bo)); } @@ -72,6 +78,7 @@ public class SysOssConfigController extends BaseController { @SaCheckPermission("system:ossConfig:edit") @Log(title = "对象存储配置", businessType = BusinessType.UPDATE) @PutMapping() + @Operation(summary = "对象存储配置",description = "对象存储配置") public R edit(@Validated(EditGroup.class) @RequestBody SysOssConfigBo bo) { return toAjax(iSysOssConfigService.updateByBo(bo)); } @@ -84,6 +91,7 @@ public class SysOssConfigController extends BaseController { @SaCheckPermission("system:ossConfig:remove") @Log(title = "对象存储配置", businessType = BusinessType.DELETE) @DeleteMapping("/{ossConfigIds}") + @Operation(summary = "删除对象存储配置",description = "删除对象存储配置") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ossConfigIds) { return toAjax(iSysOssConfigService.deleteWithValidByIds(Arrays.asList(ossConfigIds), true)); } @@ -94,6 +102,7 @@ public class SysOssConfigController extends BaseController { @SaCheckPermission("system:ossConfig:edit") @Log(title = "对象存储状态修改", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") + @Operation(summary = "对象存储状态修改",description = "对象存储状态修改") public R changeStatus(@RequestBody SysOssConfigBo bo) { return toAjax(iSysOssConfigService.updateOssConfigStatus(bo)); } diff --git a/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysOssController.java b/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysOssController.java index 4efe0ab..f0291ab 100644 --- a/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysOssController.java +++ b/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysOssController.java @@ -3,6 +3,8 @@ package org.dromara.resource.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.ObjectUtil; +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.QueryGroup; @@ -35,6 +37,7 @@ import java.util.List; @RequiredArgsConstructor @RestController @RequestMapping("/oss") +@Tag(name = "文件上传") public class SysOssController extends BaseController { private final ISysOssService iSysOssService; @@ -44,6 +47,7 @@ public class SysOssController extends BaseController { */ @SaCheckPermission("system:oss:list") @GetMapping("/list") + @Operation(summary = "查询OSS对象存储列表",description = "查询OSS对象存储列表") public TableDataInfo list(@Validated(QueryGroup.class) SysOssBo bo, PageQuery pageQuery) { return iSysOssService.queryPageList(bo, pageQuery); } @@ -55,6 +59,7 @@ public class SysOssController extends BaseController { */ @SaCheckPermission("system:oss:list") @GetMapping("/listByIds/{ossIds}") + @Operation(summary = "查询OSS对象基于id串",description = "查询OSS对象基于id串") public R> listByIds(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ossIds) { List list = iSysOssService.listByIds(Arrays.asList(ossIds)); return R.ok(list); @@ -68,6 +73,7 @@ public class SysOssController extends BaseController { @SaCheckPermission("system:oss:upload") @Log(title = "OSS对象存储", businessType = BusinessType.INSERT) @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation(summary = "上传OSS对象存储",description = "上传OSS对象存储") public R upload(@RequestPart("file") MultipartFile file) { if (ObjectUtil.isNull(file)) { return R.fail("上传文件不能为空"); @@ -87,6 +93,7 @@ public class SysOssController extends BaseController { */ @SaCheckPermission("system:oss:download") @GetMapping("/download/{ossId}") + @Operation(summary = "下载OSS对象存储",description = "下载OSS对象存储") public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException { iSysOssService.download(ossId, response); } @@ -99,6 +106,7 @@ public class SysOssController extends BaseController { @SaCheckPermission("system:oss:remove") @Log(title = "OSS对象存储", businessType = BusinessType.DELETE) @DeleteMapping("/{ossIds}") + @Operation(summary = "删除OSS对象存储",description = "删除OSS对象存储") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ossIds) { return toAjax(iSysOssService.deleteWithValidByIds(Arrays.asList(ossIds), true)); } diff --git a/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysSmsController.java b/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysSmsController.java index f5ae8f4..6d8f490 100644 --- a/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysSmsController.java +++ b/dk-modules/resource/src/main/java/org/dromara/resource/controller/SysSmsController.java @@ -2,6 +2,8 @@ package org.dromara.resource.controller; import cn.hutool.core.util.RandomUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -32,6 +34,7 @@ import java.util.LinkedHashMap; @RequiredArgsConstructor @RestController @RequestMapping("/sms") +@Tag(name = "短信功能") public class SysSmsController extends BaseController { /** @@ -41,6 +44,7 @@ public class SysSmsController extends BaseController { */ @RateLimiter(key = "#phonenumber", time = 60, count = 1) @GetMapping("/code") + @Operation(summary = "短信验证码",description = "短信验证码") public R smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; String code = RandomUtil.randomNumbers(4); diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/CacheController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/CacheController.java index 51ca79d..354fe84 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/CacheController.java +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/CacheController.java @@ -1,6 +1,8 @@ package org.dromara.system.controller.monitor; import cn.dev33.satoken.annotation.SaCheckPermission; +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.utils.StringUtils; @@ -21,6 +23,7 @@ import java.util.*; @RequiredArgsConstructor @RestController @RequestMapping("/cache") +@Tag(name = "缓存监控") public class CacheController { private final RedissonConnectionFactory connectionFactory; @@ -30,6 +33,7 @@ public class CacheController { */ @SaCheckPermission("monitor:cache:list") @GetMapping() + @Operation(summary = "获取缓存监控列表",description = "获取缓存监控列表") public R getInfo() throws Exception { RedisConnection connection = connectionFactory.getConnection(); Properties commandStats = connection.commands().info("commandstats"); diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java index 2e88bb7..3d3754c 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java @@ -1,6 +1,8 @@ package org.dromara.system.controller.monitor; import cn.dev33.satoken.annotation.SaCheckPermission; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheConstants; @@ -25,6 +27,7 @@ import java.util.List; * * @author Lion Li */ +@Tag(name = "系统访问记录") @Validated @RequiredArgsConstructor @RestController @@ -36,6 +39,7 @@ public class SysLogininforController extends BaseController { /** * 获取系统访问记录列表 */ + @Operation(summary = "获取系统访问记录列表",description = "获取系统访问记录列表") @SaCheckPermission("monitor:logininfor:list") @GetMapping("/list") public TableDataInfo list(SysLogininforBo logininfor, PageQuery pageQuery) { @@ -45,6 +49,7 @@ public class SysLogininforController extends BaseController { /** * 导出系统访问记录列表 */ + @Operation(summary = "登录日志",description = "登录日志") @Log(title = "登录日志", businessType = BusinessType.EXPORT) @SaCheckPermission("monitor:logininfor:export") @PostMapping("/export") @@ -57,6 +62,7 @@ public class SysLogininforController extends BaseController { * 批量删除登录日志 * @param infoIds 日志ids */ + @Operation(summary = "登录日志",description = "登录日志") @SaCheckPermission("monitor:logininfor:remove") @Log(title = "登录日志", businessType = BusinessType.DELETE) @DeleteMapping("/{infoIds}") @@ -67,6 +73,7 @@ public class SysLogininforController extends BaseController { /** * 清理系统访问记录 */ + @Operation(summary = "清理系统访问记录",description = "清理系统访问记录") @SaCheckPermission("monitor:logininfor:remove") @Log(title = "登录日志", businessType = BusinessType.CLEAN) @DeleteMapping("/clean") @@ -75,6 +82,7 @@ public class SysLogininforController extends BaseController { return R.ok(); } + @Operation(summary = "账户解锁",description = "账户解锁") @SaCheckPermission("monitor:logininfor:unlock") @Log(title = "账户解锁", businessType = BusinessType.OTHER) @GetMapping("/unlock/{userName}") diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java index 5af1a01..25d1963 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java @@ -1,6 +1,8 @@ package org.dromara.system.controller.monitor; import cn.dev33.satoken.annotation.SaCheckPermission; +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.web.core.BaseController; @@ -23,6 +25,7 @@ import java.util.List; * * @author Lion Li */ +@Tag(name = "操作日志记录") @Validated @RequiredArgsConstructor @RestController @@ -34,6 +37,7 @@ public class SysOperlogController extends BaseController { /** * 获取操作日志记录列表 */ + @Operation(summary = "获取操作日志记录列表",description = "获取操作日志记录列表") @SaCheckPermission("monitor:operlog:list") @GetMapping("/list") public TableDataInfo list(SysOperLogBo operLog, PageQuery pageQuery) { @@ -43,6 +47,7 @@ public class SysOperlogController extends BaseController { /** * 导出操作日志记录列表 */ + @Operation(summary = "导出操作日志记录列表",description = "导出操作日志记录列表") @Log(title = "操作日志", businessType = BusinessType.EXPORT) @SaCheckPermission("monitor:operlog:export") @PostMapping("/export") @@ -55,6 +60,7 @@ public class SysOperlogController extends BaseController { * 批量删除操作日志记录 * @param operIds 日志ids */ + @Operation(summary = "批量删除操作日志记录",description = "批量删除操作日志记录") @Log(title = "操作日志", businessType = BusinessType.DELETE) @SaCheckPermission("monitor:operlog:remove") @DeleteMapping("/{operIds}") @@ -65,6 +71,7 @@ public class SysOperlogController extends BaseController { /** * 清理操作日志记录 */ + @Operation(summary = "清理操作日志记录",description = "清理操作日志记录") @SaCheckPermission("monitor:operlog:remove") @Log(title = "操作日志", businessType = BusinessType.CLEAN) @DeleteMapping("/clean") diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java index dfef1f5..f3362cb 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java @@ -4,6 +4,8 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheConstants; import org.dromara.common.core.domain.R; @@ -27,6 +29,7 @@ import java.util.stream.Collectors; * * @author Lion Li */ +@Tag(name = "在线用户监控") @RequiredArgsConstructor @RestController @RequestMapping("/online") @@ -38,6 +41,7 @@ public class SysUserOnlineController extends BaseController { * @param ipaddr IP地址 * @param userName 用户名 */ + @Operation(summary = "获取在线用户监控列表",description = "获取在线用户监控列表") @SaCheckPermission("monitor:online:list") @GetMapping("/list") public TableDataInfo list(String ipaddr, String userName) { @@ -77,8 +81,9 @@ public class SysUserOnlineController extends BaseController { * * @param tokenId token值 */ + @Operation(summary = "强退用户",description = "强退用户") @SaCheckPermission("monitor:online:forceLogout") - @Log(title = "在线用户", businessType = BusinessType.FORCE) + @Log(title = "强退用户", businessType = BusinessType.FORCE) @DeleteMapping("/{tokenId}") public R forceLogout(@PathVariable String tokenId) { try { @@ -91,6 +96,7 @@ public class SysUserOnlineController extends BaseController { /** * 获取当前用户登录在线设备 */ + @Operation(summary = "获取当前用户登录在线设备",description = "获取当前用户登录在线设备") @GetMapping() public TableDataInfo getInfo() { // 获取指定账号 id 的 token 集合 @@ -111,7 +117,8 @@ public class SysUserOnlineController extends BaseController { * * @param tokenId token值 */ - @Log(title = "在线设备", businessType = BusinessType.FORCE) + @Operation(summary = "强退当前在线设备",description = "强退当前在线设备") + @Log(title = "强退当前在线设备", businessType = BusinessType.FORCE) @PostMapping("/{tokenId}") public R remove(@PathVariable("tokenId") String tokenId) { try { diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysMenuController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysMenuController.java index 5edb6f6..bfb4b82 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysMenuController.java +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysMenuController.java @@ -42,9 +42,9 @@ public class SysMenuController extends BaseController { * * @return 路由信息 */ - @GetMapping("/getRouters") - public R> getRouters() { - List menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId()); + @GetMapping("/{platformType}/getRouters") + public R> getRouters(@PathVariable String platformType) { + List menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId(),platformType); return R.ok(menuService.buildMenus(menus)); } 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 b54dd33..50d5e7b 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 @@ -1,5 +1,6 @@ package org.dromara.system.domain; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; @@ -81,4 +82,9 @@ public class SysDept extends TenantEntity { */ private String ancestors; + /** + * 边界编码 + */ + private String shpNo; + } diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/SysMenu.java b/dk-modules/system/src/main/java/org/dromara/system/domain/SysMenu.java index 0cdb508..8bcf6cb 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/domain/SysMenu.java +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/SysMenu.java @@ -45,6 +45,11 @@ public class SysMenu extends BaseEntity { */ private Integer orderNum; + /** + * 菜单类型 (backend、pc、h5) + */ + private String platformType; + /** * 路由地址 */ 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 5f64d6f..7ec0687 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 @@ -73,4 +73,9 @@ public class SysDeptBo extends BaseEntity { */ private String status; + /** + * 边界编码 + */ + private String shpNo; + } diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java index 7a610e7..89906b4 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java @@ -46,6 +46,12 @@ public class SysMenuBo extends BaseEntity { @NotNull(message = "显示顺序不能为空") private Integer orderNum; + /** + * 菜单类型 (backend、pc、h5) + */ + @NotNull(message = "菜单类型不能为空") + private String platformType; + /** * 路由地址 */ diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java index 098b865..722290f 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java @@ -36,6 +36,11 @@ public class SysDeptVo implements Serializable { */ private Long parentId; + /** + * 边界编码 + */ + private String shpNo; + /** * 父部门名称 */ diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java index a51564a..70e5700 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java @@ -43,6 +43,11 @@ public class SysMenuVo implements Serializable { */ private Integer orderNum; + /** + * 菜单类型 (backend、pc、h5) + */ + private String platformType; + /** * 路由地址 */ diff --git a/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java index be10745..02794ba 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java @@ -10,6 +10,7 @@ import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; /** * 部门服务 @@ -38,5 +39,25 @@ public class RemoteDeptServiceImpl implements RemoteDeptService { public List selectDeptsByList() { List list = sysDeptService.selectDeptsSimple(); return BeanUtil.copyToList(list, RemoteDeptVo.class); + + + } + + @Override + public RemoteDeptVo selectDeptById(Long deptId) { + SysDeptVo sysDeptVo = sysDeptService.selectDeptById(deptId); + return BeanUtil.copyProperties(sysDeptVo, RemoteDeptVo.class); + } + + @Override + public List> getNamePathList() { + return sysDeptService.getNamePathList(); + } + + @Override + public List selectListByParentId(String deptId) { + List deptVoList = sysDeptService.selectListByParentId(deptId); + + return BeanUtil.copyToList(deptVoList, RemoteDeptVo.class); } } diff --git a/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java index 5efa36a..cb6bba9 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java @@ -386,4 +386,10 @@ public class RemoteUserServiceImpl implements RemoteUserService { return selectListByIds(new ArrayList<>(userIds)); } + @Override + public List selectUserByUserIds(List userIds) { + List sysUserVos = userService.selectUserByUserIds(userIds); + return MapstructUtils.convert(sysUserVos, RemoteUserVo.class); + } + } diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index 90982d3..7d942c4 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -13,6 +13,7 @@ import org.dromara.system.domain.vo.SysDeptVo; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Map; /** * 部门管理 数据层 @@ -69,4 +70,6 @@ public interface SysDeptMapper extends BaseMapperPlus { }) Page selectPageDeptList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + List> getNamePathList(); + } diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java index ac646c0..4949cc7 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java @@ -47,10 +47,11 @@ public interface SysMenuMapper extends BaseMapperPlus { * * @return 菜单列表 */ - default List selectMenuTreeAll() { + default List selectMenuTreeAll(String platformType) { LambdaQueryWrapper lqw = new LambdaQueryWrapper() .in(SysMenu::getMenuType, UserConstants.TYPE_DIR, UserConstants.TYPE_MENU) .eq(SysMenu::getStatus, UserConstants.MENU_NORMAL) + .eq(SysMenu::getPlatformType, platformType) .orderByAsc(SysMenu::getParentId) .orderByAsc(SysMenu::getOrderNum); return this.selectList(lqw); @@ -62,7 +63,7 @@ public interface SysMenuMapper extends BaseMapperPlus { * @param userId 用户ID * @return 菜单列表 */ - List selectMenuTreeByUserId(Long userId); + List selectMenuTreeByUserId(Long userId,String platformType); /** * 根据角色ID查询菜单树信息 diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/SysUserMapper.java index fc7fc6e..bec69cc 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/mapper/SysUserMapper.java +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/SysUserMapper.java @@ -1,6 +1,7 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; @@ -74,6 +75,8 @@ public interface SysUserMapper extends BaseMapperPlus { }) long countUserById(Long userId); + List selectUserByUserIds(@Param(Constants.WRAPPER) Wrapper queryWrapper); + @Override @DataPermission({ @DataColumn(key = "deptName", value = "dept_id"), diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/ISysDeptService.java b/dk-modules/system/src/main/java/org/dromara/system/service/ISysDeptService.java index b3a2afe..cd5b88d 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/ISysDeptService.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -5,6 +5,7 @@ import org.dromara.system.domain.bo.SysDeptBo; import org.dromara.system.domain.vo.SysDeptVo; import java.util.List; +import java.util.Map; /** * 部门管理 服务层 @@ -138,4 +139,17 @@ public interface ISysDeptService { * @return 部门列表 */ List selectDeptsSimple(); + + /** + * 查询每个部门的所属的部门全路径 + * @return + */ + List> getNamePathList(); + + /** + * 根据父级找子级 + * @param deptId + * @return + */ + List selectListByParentId(String deptId); } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/ISysMenuService.java b/dk-modules/system/src/main/java/org/dromara/system/service/ISysMenuService.java index 72d705e..d8aeb7e 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/ISysMenuService.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/ISysMenuService.java @@ -55,7 +55,7 @@ public interface ISysMenuService { * @param userId 用户ID * @return 菜单列表 */ - List selectMenuTreeByUserId(Long userId); + List selectMenuTreeByUserId(Long userId,String platformType); /** * 根据角色ID查询菜单树信息 diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/ISysUserService.java b/dk-modules/system/src/main/java/org/dromara/system/service/ISysUserService.java index a6f18c7..4887005 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/ISysUserService.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -268,4 +268,5 @@ public interface ISysUserService { */ List selectUserIdsByRoleIds(List roleIds); + List selectUserByUserIds(List userIds); } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 262dfd5..74815e0 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.system.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.tree.Tree; @@ -19,6 +20,7 @@ import org.dromara.common.core.utils.TreeBuildUtils; import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.redis.utils.CacheUtils; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.domain.vo.RemoteDeptVo; import org.dromara.system.domain.SysDept; import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysUser; @@ -35,6 +37,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; /** * 部门管理 服务实现 @@ -354,4 +357,17 @@ public class SysDeptServiceImpl implements ISysDeptService { .eq(SysDept::getStatus, SystemConstants.NORMAL)); } + + @Override + public List> getNamePathList() { + return baseMapper.getNamePathList(); + } + + @Override + public List selectListByParentId(String deptId) { + List resultList = baseMapper.selectListByParentId(Long.parseLong(deptId)); + + return BeanUtil.copyToList(resultList, SysDeptVo.class); + } + } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java index 1b6a9aa..2a320e6 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -130,12 +130,12 @@ public class SysMenuServiceImpl implements ISysMenuService { * @return 菜单列表 */ @Override - public List selectMenuTreeByUserId(Long userId) { + public List selectMenuTreeByUserId(Long userId,String platformType) { List menus; if (LoginHelper.isSuperAdmin(userId)) { - menus = baseMapper.selectMenuTreeAll(); + menus = baseMapper.selectMenuTreeAll(platformType); } else { - menus = baseMapper.selectMenuTreeByUserId(userId); + menus = baseMapper.selectMenuTreeByUserId(userId,platformType); } return getChildPerms(menus, 0); } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index bacf9eb..111ec7e 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -185,7 +185,7 @@ public class SysUserServiceImpl implements ISysUserService { @Override public List selectUserByIds(List userIds, Long deptId) { return baseMapper.selectUserList(new LambdaQueryWrapper() - .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber) .eq(SysUser::getStatus, UserConstants.USER_NORMAL) + .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber).eq(SysUser::getStatus, UserConstants.USER_NORMAL) .eq(ObjectUtil.isNotNull(deptId), SysUser::getDeptId, deptId) .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds)); } @@ -559,6 +559,13 @@ public class SysUserServiceImpl implements ISysUserService { return StreamUtils.toList(userRoles, SysUserRole::getUserId); } + @Override + public List selectUserByUserIds(List userIds) { + return baseMapper.selectUserByUserIds(new LambdaQueryWrapper() + .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber).eq(SysUser::getStatus, UserConstants.USER_NORMAL) + .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds)); + } + /** * 通过用户ID查询用户账户 * diff --git a/dk-modules/system/src/main/resources/mapper/system/SysDeptMapper.xml b/dk-modules/system/src/main/resources/mapper/system/SysDeptMapper.xml index e400192..e75d498 100644 --- a/dk-modules/system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/dk-modules/system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -44,4 +44,44 @@ from sys_dept ${ew.getCustomSqlSegment} + + diff --git a/dk-modules/system/src/main/resources/mapper/system/SysMenuMapper.xml b/dk-modules/system/src/main/resources/mapper/system/SysMenuMapper.xml index b9eced8..3a23587 100644 --- a/dk-modules/system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/dk-modules/system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -9,7 +9,7 @@ diff --git a/dk-modules/system/src/main/resources/mapper/system/SysUserMapper.xml b/dk-modules/system/src/main/resources/mapper/system/SysUserMapper.xml index bb3c53d..d1750d3 100644 --- a/dk-modules/system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/dk-modules/system/src/main/resources/mapper/system/SysUserMapper.xml @@ -70,4 +70,17 @@ + + diff --git a/dk-modules/workflow/pom.xml b/dk-modules/workflow/pom.xml index 5f13aa5..3a1529e 100644 --- a/dk-modules/workflow/pom.xml +++ b/dk-modules/workflow/pom.xml @@ -97,6 +97,17 @@ org.dromara api-workflow + + + org.dromara + api-resource + + + + org.dromara + api-business + + diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/common/handler/FlwCommonHandler.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/common/handler/FlwCommonHandler.java new file mode 100644 index 0000000..69920a8 --- /dev/null +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/common/handler/FlwCommonHandler.java @@ -0,0 +1,34 @@ +package org.dromara.workflow.common.handler; + +import org.dromara.workflow.api.event.ProcessCreateTaskEvent; +import org.dromara.workflow.api.event.ProcessDeleteEvent; +import org.dromara.workflow.api.event.ProcessEvent; + +public interface FlwCommonHandler { + + /** + * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等) + * + * @param processEvent 参数 + */ + public void processHandler(ProcessEvent processEvent); + + /** + * 执行任务创建监听 + * 在方法中判断流程节点key + * if ("xxx".equals(processCreateTaskEvent.getNodeCode())) { + * //执行业务逻辑 + * } + * + * @param processCreateTaskEvent 参数 + */ + public void processCreateTaskHandler(ProcessCreateTaskEvent processCreateTaskEvent); + + /** + * 监听删除流程事件 + * 正常使用只需#processDeleteEvent.flowCode=='leave1' + * + * @param processDeleteEvent 参数 + */ + public void processDeleteHandler(ProcessDeleteEvent processDeleteEvent); +} diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java index 8332f3b..cae0e5b 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwCategoryController.java @@ -2,6 +2,8 @@ package org.dromara.workflow.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.lang.tree.Tree; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; @@ -27,6 +29,7 @@ import java.util.List; * * @author may */ +@Tag(name = "流程分类") @ConditionalOnEnable @Validated @RequiredArgsConstructor @@ -39,7 +42,7 @@ public class FlwCategoryController extends BaseController { /** * 查询流程分类列表 */ - @SaCheckPermission("workflow:category:list") + @Operation(summary = "查询流程分类列表",description ="查询流程分类列表") @GetMapping("/list") public R> list(FlowCategoryBo bo) { List list = flwCategoryService.queryList(bo); @@ -49,8 +52,7 @@ public class FlwCategoryController extends BaseController { /** * 导出流程分类列表 */ - @SaCheckPermission("workflow:category:export") - @Log(title = "流程分类", businessType = BusinessType.EXPORT) + @Operation(summary = "导出流程分类列表",description ="导出流程分类列表") @PostMapping("/export") public void export(FlowCategoryBo bo, HttpServletResponse response) { List list = flwCategoryService.queryList(bo); @@ -62,7 +64,7 @@ public class FlwCategoryController extends BaseController { * * @param categoryId 主键 */ - @SaCheckPermission("workflow:category:query") + @Operation(summary = "获取流程分类详细信息",description ="获取流程分类详细信息") @GetMapping("/{categoryId}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long categoryId) { flwCategoryService.checkCategoryDataScope(categoryId); @@ -72,8 +74,7 @@ public class FlwCategoryController extends BaseController { /** * 新增流程分类 */ - @SaCheckPermission("workflow:category:add") - @Log(title = "流程分类", businessType = BusinessType.INSERT) + @Operation(summary = "新增流程分类",description ="新增流程分类") @RepeatSubmit() @PostMapping() public R add(@Validated(AddGroup.class) @RequestBody FlowCategoryBo category) { @@ -86,8 +87,7 @@ public class FlwCategoryController extends BaseController { /** * 修改流程分类 */ - @SaCheckPermission("workflow:category:edit") - @Log(title = "流程分类", businessType = BusinessType.UPDATE) + @Operation(summary = "修改流程分类",description ="修改流程分类") @RepeatSubmit() @PutMapping() public R edit(@Validated(EditGroup.class) @RequestBody FlowCategoryBo category) { @@ -106,8 +106,7 @@ public class FlwCategoryController extends BaseController { * * @param categoryId 主键 */ - @SaCheckPermission("workflow:category:remove") - @Log(title = "流程分类", businessType = BusinessType.DELETE) + @Operation(summary = "删除流程分类",description ="删除流程分类") @DeleteMapping("/{categoryId}") public R remove(@PathVariable Long categoryId) { if (flwCategoryService.hasChildByCategoryId(categoryId)) { @@ -124,6 +123,7 @@ public class FlwCategoryController extends BaseController { * * @param categoryBo 流程分类 */ + @Operation(summary = "获取流程分类树列表",description ="获取流程分类树列表") @GetMapping("/categoryTree") public R>> categoryTree(FlowCategoryBo categoryBo) { return R.ok(flwCategoryService.selectCategoryTreeList(categoryBo)); 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 ad848bd..3db2857 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 @@ -1,5 +1,7 @@ package org.dromara.workflow.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; @@ -28,6 +30,7 @@ import java.util.List; * * @author may */ +@Tag(name = "流程定义管理") @ConditionalOnEnable @Validated @RequiredArgsConstructor @@ -44,6 +47,7 @@ public class FlwDefinitionController extends BaseController { * @param flowDefinition 参数 * @param pageQuery 分页 */ + @Operation(summary = "查询流程定义列表",description = "查询流程定义列表") @GetMapping("/list") public TableDataInfo list(FlowDefinition flowDefinition, PageQuery pageQuery) { return flwDefinitionService.queryList(flowDefinition, pageQuery); @@ -55,6 +59,7 @@ public class FlwDefinitionController extends BaseController { * @param flowDefinition 参数 * @param pageQuery 分页 */ + @Operation(summary = "查询未发布的流程定义列表",description = "查询未发布的流程定义列表") @GetMapping("/unPublishList") public TableDataInfo unPublishList(FlowDefinition flowDefinition, PageQuery pageQuery) { return flwDefinitionService.unPublishList(flowDefinition, pageQuery); @@ -65,6 +70,7 @@ public class FlwDefinitionController extends BaseController { * * @param id 流程定义id */ + @Operation(summary = "获取流程定义详细信息",description = "获取流程定义详细信息") @GetMapping(value = "/{id}") public R getInfo(@PathVariable Long id) { return R.ok(defService.getById(id)); @@ -75,7 +81,7 @@ public class FlwDefinitionController extends BaseController { * * @param flowDefinition 参数 */ - @Log(title = "流程定义", businessType = BusinessType.INSERT) + @Operation(summary = "新增流程定义",description = "新增流程定义") @PostMapping @RepeatSubmit() @Transactional(rollbackFor = Exception.class) @@ -88,7 +94,7 @@ public class FlwDefinitionController extends BaseController { * * @param flowDefinition 参数 */ - @Log(title = "流程定义", businessType = BusinessType.UPDATE) + @Operation(summary = "修改流程定义",description = "修改流程定义") @PutMapping @RepeatSubmit() @Transactional(rollbackFor = Exception.class) @@ -101,7 +107,7 @@ public class FlwDefinitionController extends BaseController { * * @param id 流程定义id */ - @Log(title = "流程定义", businessType = BusinessType.INSERT) + @Operation(summary = "发布流程定义",description = "发布流程定义") @PutMapping("/publish/{id}") @RepeatSubmit() public R publish(@PathVariable Long id) { @@ -113,7 +119,7 @@ public class FlwDefinitionController extends BaseController { * * @param id 流程定义id */ - @Log(title = "流程定义", businessType = BusinessType.INSERT) + @Operation(summary = "取消发布流程定义",description = "取消发布流程定义") @PutMapping("/unPublish/{id}") @RepeatSubmit() @Transactional(rollbackFor = Exception.class) @@ -124,7 +130,7 @@ public class FlwDefinitionController extends BaseController { /** * 删除流程定义 */ - @Log(title = "流程定义", businessType = BusinessType.DELETE) + @Operation(summary = "删除流程定义",description = "删除流程定义") @DeleteMapping("/{ids}") public R remove(@PathVariable List ids) { return toAjax(flwDefinitionService.removeDef(ids)); @@ -135,7 +141,7 @@ public class FlwDefinitionController extends BaseController { * * @param id 流程定义id */ - @Log(title = "流程定义", businessType = BusinessType.INSERT) + @Operation(summary = "复制流程定义",description = "复制流程定义") @PostMapping("/copy/{id}") @RepeatSubmit() @Transactional(rollbackFor = Exception.class) @@ -149,7 +155,7 @@ public class FlwDefinitionController extends BaseController { * @param file 文件 * @param category 分类 */ - @Log(title = "流程定义", businessType = BusinessType.IMPORT) + @Operation(summary = "导入流程定义",description = "导入流程定义") @PostMapping("/importDef") public R importDef(MultipartFile file, String category) { return R.ok(flwDefinitionService.importJson(file, category)); @@ -162,7 +168,7 @@ public class FlwDefinitionController extends BaseController { * @param response 响应 * @throws IOException 异常 */ - @Log(title = "流程定义", businessType = BusinessType.EXPORT) + @Operation(summary = "导出流程定义",description = "导出流程定义") @PostMapping("/exportDef/{id}") public void exportDef(@PathVariable Long id, HttpServletResponse response) throws IOException { flwDefinitionService.exportDef(id, response); @@ -173,6 +179,7 @@ public class FlwDefinitionController extends BaseController { * * @param id 流程定义id */ + @Operation(summary = "获取流程定义JSON字符串",description = "获取流程定义JSON字符串") @GetMapping("/xmlString/{id}") public R xmlString(@PathVariable Long id) { return R.ok("操作成功", defService.exportJson(id)); @@ -184,6 +191,7 @@ public class FlwDefinitionController extends BaseController { * @param id 流程定义id * @param active 激活/挂起 */ + @Operation(summary = "激活/挂起流程定义",description = "激活/挂起流程定义") @RepeatSubmit() @PutMapping("/active/{id}") @Transactional(rollbackFor = Exception.class) diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index 4b52bda..1bffc80 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -1,5 +1,7 @@ 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.idempotent.annotation.RepeatSubmit; @@ -26,6 +28,7 @@ import java.util.Map; * * @author may */ +@Tag(name = "流程实例管理") @ConditionalOnEnable @Validated @RequiredArgsConstructor @@ -42,6 +45,7 @@ public class FlwInstanceController extends BaseController { * @param flowInstanceBo 流程实例 * @param pageQuery 分页 */ + @Operation(summary = "查询正在运行的流程实例列表",description = "查询正在运行的流程实例列表") @GetMapping("/pageByRunning") public TableDataInfo selectRunningInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { return flwInstanceService.selectRunningInstanceList(flowInstanceBo, pageQuery); @@ -53,6 +57,7 @@ public class FlwInstanceController extends BaseController { * @param flowInstanceBo 流程实例 * @param pageQuery 分页 */ + @Operation(summary = "查询已结束的流程实例列表",description = "查询已结束的流程实例列表") @GetMapping("/pageByFinish") public TableDataInfo selectFinishInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { return flwInstanceService.selectFinishInstanceList(flowInstanceBo, pageQuery); @@ -63,6 +68,7 @@ public class FlwInstanceController extends BaseController { * * @param businessId 业务id */ + @Operation(summary = "根据业务id查询流程实例详细信息",description = "根据业务id查询流程实例详细信息") @GetMapping("/getInfo/{businessId}") public R getInfo(@PathVariable Long businessId) { return R.ok(flwInstanceService.queryByBusinessId(businessId)); @@ -73,6 +79,7 @@ public class FlwInstanceController extends BaseController { * * @param businessIds 业务id */ + @Operation(summary = "按照业务id删除流程实例",description = "按照业务id删除流程实例") @DeleteMapping("/deleteByBusinessIds/{businessIds}") public R deleteByBusinessIds(@PathVariable List businessIds) { return toAjax(flwInstanceService.deleteByBusinessIds(businessIds)); @@ -83,6 +90,7 @@ public class FlwInstanceController extends BaseController { * * @param instanceIds 实例id */ + @Operation(summary = "按照实例id删除流程实例",description = "按照实例id删除流程实例") @DeleteMapping("/deleteByInstanceIds/{instanceIds}") public R deleteByInstanceIds(@PathVariable List instanceIds) { return toAjax(flwInstanceService.deleteByInstanceIds(instanceIds)); @@ -93,6 +101,7 @@ public class FlwInstanceController extends BaseController { * * @param bo 参数 */ + @Operation(summary = "撤销流程",description = "撤销流程") @RepeatSubmit() @PutMapping("/cancelProcessApply") public R cancelProcessApply(@RequestBody FlowCancelBo bo) { @@ -105,6 +114,7 @@ public class FlwInstanceController extends BaseController { * @param id 流程实例id * @param active 激活/挂起 */ + @Operation(summary = "激活/挂起流程实例",description = "激活/挂起流程实例") @RepeatSubmit() @PutMapping("/active/{id}") public R active(@PathVariable Long id, @RequestParam boolean active) { @@ -117,6 +127,7 @@ public class FlwInstanceController extends BaseController { * @param flowInstanceBo 参数 * @param pageQuery 分页 */ + @Operation(summary = "获取当前登陆人发起的流程实例",description = "获取当前登陆人发起的流程实例") @GetMapping("/pageByCurrent") public TableDataInfo selectCurrentInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) { return flwInstanceService.selectCurrentInstanceList(flowInstanceBo, pageQuery); @@ -127,6 +138,7 @@ public class FlwInstanceController extends BaseController { * * @param businessId 业务id */ + @Operation(summary = "获取流程图,流程记录",description = "获取流程图,流程记录") @GetMapping("/flowImage/{businessId}") public R> flowImage(@PathVariable String businessId) { return R.ok(flwInstanceService.flowImage(businessId)); @@ -137,6 +149,7 @@ public class FlwInstanceController extends BaseController { * * @param instanceId 流程实例id */ + @Operation(summary = "获取流程变量",description = "获取流程变量") @GetMapping("/instanceVariable/{instanceId}") public R> instanceVariable(@PathVariable Long instanceId) { return R.ok(flwInstanceService.instanceVariable(instanceId)); @@ -147,7 +160,7 @@ public class FlwInstanceController extends BaseController { * * @param bo 参数 */ - @Log(title = "流程实例管理", businessType = BusinessType.INSERT) + @Operation(summary = "作废流程",description = "作废流程") @RepeatSubmit() @PostMapping("/invalid") public R invalid(@Validated @RequestBody FlowInvalidBo bo) { 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 ffaff0b..2618ade 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 @@ -1,5 +1,8 @@ package org.dromara.workflow.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +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; @@ -27,6 +30,7 @@ import java.util.List; * * @author may */ +@Tag(name = "任务管理") @ConditionalOnEnable @Validated @RequiredArgsConstructor @@ -41,7 +45,7 @@ public class FlwTaskController extends BaseController { * * @param startProcessBo 启动流程参数 */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) + @Operation(summary = "启动任务",description = "启动任务") @RepeatSubmit() @PostMapping("/startWorkFlow") public R startWorkFlow(@Validated(AddGroup.class) @RequestBody StartProcessBo startProcessBo) { @@ -54,7 +58,7 @@ public class FlwTaskController extends BaseController { * * @param completeTaskBo 办理任务参数 */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) + @Operation(summary = "办理任务",description = "办理任务") @RepeatSubmit() @PostMapping("/completeTask") public R completeTask(@Validated(AddGroup.class) @RequestBody CompleteTaskBo completeTaskBo) { @@ -67,6 +71,7 @@ public class FlwTaskController extends BaseController { * @param flowTaskBo 参数 * @param pageQuery 分页 */ + @Operation(summary = "查询当前用户的待办任务",description = "查询当前用户的待办任务") @GetMapping("/pageByTaskWait") public TableDataInfo pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { return flwTaskService.pageByTaskWait(flowTaskBo, pageQuery); @@ -78,7 +83,7 @@ public class FlwTaskController extends BaseController { * @param flowTaskBo 参数 * @param pageQuery 分页 */ - + @Operation(summary = "查询当前用户的已办任务",description = "查询当前用户的已办任务") @GetMapping("/pageByTaskFinish") public TableDataInfo pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { return flwTaskService.pageByTaskFinish(flowTaskBo, pageQuery); @@ -90,6 +95,7 @@ public class FlwTaskController extends BaseController { * @param flowTaskBo 参数 * @param pageQuery 分页 */ + @Operation(summary = "查询待办任务",description = "查询待办任务") @GetMapping("/pageByAllTaskWait") public TableDataInfo pageByAllTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { return flwTaskService.pageByAllTaskWait(flowTaskBo, pageQuery); @@ -101,6 +107,7 @@ public class FlwTaskController extends BaseController { * @param flowTaskBo 参数 * @param pageQuery 分页 */ + @Operation(summary = "查询已办任务",description = "查询已办任务") @GetMapping("/pageByAllTaskFinish") public TableDataInfo pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { return flwTaskService.pageByAllTaskFinish(flowTaskBo, pageQuery); @@ -112,6 +119,7 @@ public class FlwTaskController extends BaseController { * @param flowTaskBo 参数 * @param pageQuery 分页 */ + @Operation(summary = "查询当前用户的抄送",description = "查询当前用户的抄送") @GetMapping("/pageByTaskCopy") public TableDataInfo pageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) { return flwTaskService.pageByTaskCopy(flowTaskBo, pageQuery); @@ -122,6 +130,7 @@ public class FlwTaskController extends BaseController { * * @param taskId 任务id */ + @Operation(summary = "根据taskId查询任务",description = "根据taskId查询任务") @GetMapping("/getTask/{taskId}") public R getTask(@PathVariable Long taskId) { return R.ok(flwTaskService.selectById(taskId)); @@ -132,7 +141,7 @@ public class FlwTaskController extends BaseController { * * @param bo 参数 */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) + @Operation(summary = "终止任务",description = "终止任务") @RepeatSubmit() @PostMapping("/terminationTask") public R terminationTask(@RequestBody FlowTerminationBo bo) { @@ -145,7 +154,9 @@ public class FlwTaskController extends BaseController { * @param bo 参数 * @param taskOperation 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature */ - @Log(title = "任务管理", businessType = BusinessType.UPDATE) + @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) { @@ -158,7 +169,7 @@ public class FlwTaskController extends BaseController { * @param taskIdList 任务id * @param userId 办理人id */ - @Log(title = "任务管理", businessType = BusinessType.UPDATE) + @Operation(summary = "修改任务办理人",description = "修改任务办理人") @RepeatSubmit() @PutMapping("/updateAssignee/{userId}") public R updateAssignee(@RequestBody List taskIdList, @PathVariable String userId) { @@ -170,7 +181,7 @@ public class FlwTaskController extends BaseController { * * @param bo 参数 */ - @Log(title = "任务管理", businessType = BusinessType.INSERT) + @Operation(summary = "驳回审批",description = "驳回审批") @RepeatSubmit() @PostMapping("/backProcess") public R backProcess(@Validated({AddGroup.class}) @RequestBody BackProcessBo bo) { @@ -183,6 +194,7 @@ public class FlwTaskController extends BaseController { * @param definitionId 流程定义id * @param nowNodeCode 当前节点 */ + @Operation(summary = "获取可驳回的前置节点",description = "获取可驳回的前置节点") @GetMapping("/getBackTaskNode/{definitionId}/{nowNodeCode}") public R> getBackTaskNode(@PathVariable Long definitionId, @PathVariable String nowNodeCode) { return R.ok(flwTaskService.getBackTaskNode(definitionId, nowNodeCode)); @@ -193,6 +205,7 @@ public class FlwTaskController extends BaseController { * * @param taskId 任务id */ + @Operation(summary = "获取当前任务的所有办理人",description = "获取当前任务的所有办理人") @GetMapping("/currentTaskAllUser/{taskId}") public R> currentTaskAllUser(@PathVariable Long taskId) { return R.ok(flwTaskService.currentTaskAllUser(taskId)); diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java index 64dd082..dfcafae 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java @@ -52,4 +52,9 @@ public class FlowTaskBo implements Serializable { */ private List createByIds; + /** + * 业务Id + */ + private String businessId; + } diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java index ea21a81..a0893fa 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java @@ -23,13 +23,13 @@ public class StartProcessBo implements Serializable { private static final long serialVersionUID = 1L; /** - * 业务唯一值id + * 业务唯一值id,根据具体业务来例如预警可以为预警Id */ @NotBlank(message = "业务ID不能为空", groups = {AddGroup.class}) private String businessId; /** - * 流程定义编码 + * 流程定义编码,不同的审批流程,例如预警可以为alert */ @NotBlank(message = "流程定义编码不能为空", groups = {AddGroup.class}) private String flowCode; 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 d9a83ed..2f0b230 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 @@ -2,10 +2,12 @@ package org.dromara.workflow.dubbo; 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.RemoteCompleteTask; import org.dromara.workflow.api.domain.RemoteStartProcess; import org.dromara.workflow.api.domain.RemoteStartProcessReturn; +import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.service.WorkflowService; import org.springframework.stereotype.Service; @@ -25,6 +27,8 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService { private final WorkflowService workflowService; + private final IFlwTaskService flwTaskService; + @Override public boolean deleteInstance(List businessIds) { return workflowService.deleteInstance(businessIds); @@ -66,8 +70,18 @@ public class RemoteWorkflowServiceImpl implements RemoteWorkflowService { } @Override - public boolean completeTask(RemoteCompleteTask completeTask) { - return workflowService.completeTask(completeTask); + public Map> currentTaskAllUser(List taskIds) { + return flwTaskService.currentTaskAllUser(taskIds); } + @Override + public List getPermissions() { + return flwTaskService.getPermissions(); + } + +// @Override +// public boolean completeTask(RemoteCompleteTask completeTask) { +// return workflowService.completeTask(completeTask); +// } + } 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 new file mode 100644 index 0000000..0e4dfbc --- /dev/null +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/handler/FlwAlertHandler.java @@ -0,0 +1,60 @@ +package org.dromara.workflow.handler; + +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.business.api.RemoteBusinessAlertService; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.workflow.api.event.ProcessCreateTaskEvent; +import org.dromara.workflow.api.event.ProcessDeleteEvent; +import org.dromara.workflow.api.event.ProcessEvent; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.common.handler.FlwCommonHandler; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +/** + * 流程预警扩展业务 + */ +@ConditionalOnEnable +@Slf4j +@Component +public class FlwAlertHandler implements FlwCommonHandler { + + @DubboReference + RemoteBusinessAlertService alertService; + + /** + * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等) + * + * @param processEvent 参数 + */ + @EventListener(condition = "#processEvent.flowCode.startsWith('alert')") + @Override + public void processHandler(ProcessEvent processEvent) { + alertService.updateAlertStatus(processEvent.getBusinessId(),processEvent.getStatus()); + } + + /** + * 流程创建的时候,将预警表中的状态进行修改 + * 执行任务创建监听 + * + * @param processCreateTaskEvent 参数 + */ + @EventListener(condition = "#processCreateTaskEvent.flowCode.startsWith('alert')") + @Override + public void processCreateTaskHandler(ProcessCreateTaskEvent processCreateTaskEvent) { + alertService.updateAlertStatus(processCreateTaskEvent.getBusinessId(), BusinessStatusEnum.WAITING.getStatus()); + } + + /** + * 监听删除流程事件 + * 正常使用只需#processDeleteEvent.flowCode=='leave1' + * + * @param processDeleteEvent 参数 + */ + @EventListener(condition = "#processDeleteEvent.flowCode.startsWith('alert')") + @Override + public void processDeleteHandler(ProcessDeleteEvent processDeleteEvent) { + + } +} 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 65f990e..4dda912 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 @@ -3,7 +3,10 @@ package org.dromara.workflow.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.system.api.domain.vo.RemoteUserVo; +import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.Node; +import org.dromara.warm.flow.core.entity.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.FlowTask; import org.dromara.workflow.api.domain.RemoteStartProcessReturn; @@ -46,6 +49,7 @@ public interface IFlwTaskService { */ TableDataInfo pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery); + /** * 查询当前租户所有待办任务 * @@ -55,6 +59,8 @@ public interface IFlwTaskService { */ TableDataInfo pageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery); + + /** * 查询待办任务 * @@ -188,4 +194,10 @@ public interface IFlwTaskService { * @return 结果 */ List currentTaskAllUser(Long taskId); + + /** + * 审批前获取当前办理人,办理时会校验的该权限集合 + * 返回当前用户权限集合 + */ + List getPermissions(); } diff --git a/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 873023a..89f5d00 100644 --- a/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/dk-modules/workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -160,7 +160,7 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand */ private List getUsersByType(TaskAssigneeEnum type, List ids) { return switch (type) { - case USER -> remoteUserService.selectListByIds(ids); + case USER -> remoteUserService.selectUserByUserIds(ids); case ROLE -> remoteUserService.selectUsersByRoleIds(ids); case DEPT -> remoteUserService.selectUsersByDeptIds(ids); case POST -> remoteUserService.selectUsersByPostIds(ids); 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 c7f2d1e..f047148 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 @@ -20,9 +20,13 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mail.utils.MailUtils; 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.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.resource.api.RemoteMessageService; import org.dromara.system.api.RemoteUserService; import org.dromara.system.api.domain.vo.RemoteUserVo; import org.dromara.warm.flow.core.dto.FlowParams; @@ -36,6 +40,7 @@ import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; 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.bo.*; @@ -47,11 +52,15 @@ import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.mapper.FlwTaskMapper; import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.utils.WorkflowUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static org.dromara.workflow.common.constant.FlowConstant.*; @@ -83,6 +92,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @DubboReference private RemoteUserService remoteUserService; + @DubboReference(stub = "true") + private final RemoteMessageService remoteMessageService; + + @Autowired + private ApplicationContext applicationContext; + /** * 启动任务 * @@ -129,6 +144,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { RemoteStartProcessReturn dto = new RemoteStartProcessReturn(); dto.setProcessInstanceId(instance.getId()); dto.setTaskId(taskList.get(0).getId()); + + //创建任务 + executeTask(taskList.get(0).getId()); return dto; } @@ -169,8 +187,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { // 执行任务跳转,并根据返回的处理人设置下一步处理人 Instance instance = taskService.skip(taskId, flowParams); this.setHandler(instance, flowTask, flowCopyList); - // 消息通知 -// WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); + // 待办消息通知 + WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -269,12 +287,23 @@ public class FlwTaskServiceImpl implements IFlwTaskService { public TableDataInfo pageByTaskWait(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); - queryWrapper.in("t.processed_by", SpringUtils.getBean(WorkflowPermissionHandler.class).permissions()); + queryWrapper.in("t.processed_by", this.getPermissions()); queryWrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus()); Page page = this.getFlowTaskVoPage(pageQuery, queryWrapper); + + return TableDataInfo.build(page); } + /** + * 审批前获取当前办理人,办理时会校验的该权限集合 + * 返回当前用户权限集合 + */ + @Override + public List getPermissions() { + return SpringUtils.getBean(WorkflowPermissionHandler.class).permissions(); + } + /** * 查询当前用户的已办任务 * @@ -291,6 +320,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return TableDataInfo.build(page); } + /** * 查询待办任务 * @@ -355,6 +385,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); wrapper.in(CollUtil.isNotEmpty(flowTaskBo.getCreateByIds()), "t.create_by", flowTaskBo.getCreateByIds()); + if (ObjectUtil.isNotEmpty(flowTaskBo.getBusinessId())){ + wrapper.eq("i.business_id", flowTaskBo.getBusinessId()); + } if (StringUtils.isNotBlank(flowTaskBo.getCategory())) { List categoryIds = flwCategoryMapper.selectCategoryIdsByParentId(Convert.toLong(flowTaskBo.getCategory())); wrapper.in("t.category", StreamUtils.toList(categoryIds, Convert::toStr)); @@ -397,7 +430,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Instance instance = insService.getById(inst.getId()); this.setHandler(instance, task, null); // 消息通知 -// WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); + WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -687,4 +720,17 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } return remoteUserService.selectListByIds(StreamUtils.toList(userList, e -> Long.valueOf(e.getProcessedBy()))); } + + /** + * 初始化流程任务 + * @param taskId + */ + public boolean executeTask(Long taskId) { + CompleteTaskBo completeTaskBo = new CompleteTaskBo(); + completeTaskBo.setTaskId(taskId); + completeTaskBo.setMessageType(List.of(MessageTypeEnum.SYSTEM_MESSAGE.getCode())); + IFlwTaskService service = applicationContext.getBean(IFlwTaskService.class); + return service.completeTask(completeTaskBo); + } + } diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 727921c..3835e95 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -521,3 +521,16 @@ services: environment: - JVM_OPTS="-Djava.awt.headless=true" network_mode: "host" + + postgres: + image: postgres:15 # 使用 PostgreSQL 15 镜像 + container_name: postgres # 容器名称 + environment: + POSTGRES_USER: "root" # 设置用户名为 'root' + POSTGRES_PASSWORD: 123456 # 设置密码为 '123456' + POSTGRES_DB: dk-cloud # 设置数据库名为 'dk-cloud' + ports: + - "5432:5432" # 将容器的 5432 端口映射到主机的 5432 端口 + volumes: + - /docker/postgresql/data:/var/lib/postgresql/data # 数据映射到主机指定路径 + network_mode: "host" diff --git a/pom.xml b/pom.xml index 4f31bb1..63a9d40 100644 --- a/pom.xml +++ b/pom.xml @@ -75,6 +75,9 @@ 1.6.6 + 23.2 + + 42.6.2 @@ -403,7 +406,12 @@ warm-flow-plugin-ui-sb-web ${warm-flow.version} - + + + org.postgresql + postgresql + ${postgresql.version} + @@ -536,6 +544,46 @@ true + + + e-iceblue + e-iceblue + https://repo.e-iceblue.cn/repository/maven-public/ + + always + true + + + always + true + + + + osgeo + OSGeo Release Repository + https://repo.osgeo.org/repository/release/ + + false + + + true + + + + osgeo-snapshot + OSGeo Snapshot Repository + https://repo.osgeo.org/repository/snapshot/ + + true + + + false + + + + jitpack.io + https://jitpack.io +