diff --git a/casic-metering-api/pom.xml b/casic-metering-api/pom.xml index 4985570..a74cb17 100644 --- a/casic-metering-api/pom.xml +++ b/casic-metering-api/pom.xml @@ -158,6 +158,10 @@ spring-boot-devtools true + + com.alibaba.csp + sentinel-core + diff --git a/casic-metering-api/pom.xml b/casic-metering-api/pom.xml index 4985570..a74cb17 100644 --- a/casic-metering-api/pom.xml +++ b/casic-metering-api/pom.xml @@ -158,6 +158,10 @@ spring-boot-devtools true + + com.alibaba.csp + sentinel-core + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java index 8d41a35..6775197 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -1,6 +1,7 @@ package com.casic.missiles.controller; import cn.hutool.core.util.StrUtil; +import com.casic.missiles.annotation.SentinelLimitAnnotation; import com.casic.missiles.core.application.enums.LoginType; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.model.auth.AuthUser; @@ -47,6 +48,7 @@ /** * 获取mockToken */ + @SentinelLimitAnnotation(limitCount = 1, resourceName = "mockToken") @GetMapping("/mockToken") @ResponseBody public Object mockToken(String username, String password) { diff --git a/casic-metering-api/pom.xml b/casic-metering-api/pom.xml index 4985570..a74cb17 100644 --- a/casic-metering-api/pom.xml +++ b/casic-metering-api/pom.xml @@ -158,6 +158,10 @@ spring-boot-devtools true + + com.alibaba.csp + sentinel-core + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java index 8d41a35..6775197 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -1,6 +1,7 @@ package com.casic.missiles.controller; import cn.hutool.core.util.StrUtil; +import com.casic.missiles.annotation.SentinelLimitAnnotation; import com.casic.missiles.core.application.enums.LoginType; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.model.auth.AuthUser; @@ -47,6 +48,7 @@ /** * 获取mockToken */ + @SentinelLimitAnnotation(limitCount = 1, resourceName = "mockToken") @GetMapping("/mockToken") @ResponseBody public Object mockToken(String username, String password) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java index 8f2ca35..7b8c622 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -50,7 +50,7 @@ public static String getSourceByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getSource().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getSource(); } } @@ -59,7 +59,7 @@ public static String getValueByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getValue().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getValue(); } } diff --git a/casic-metering-api/pom.xml b/casic-metering-api/pom.xml index 4985570..a74cb17 100644 --- a/casic-metering-api/pom.xml +++ b/casic-metering-api/pom.xml @@ -158,6 +158,10 @@ spring-boot-devtools true + + com.alibaba.csp + sentinel-core + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java index 8d41a35..6775197 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -1,6 +1,7 @@ package com.casic.missiles.controller; import cn.hutool.core.util.StrUtil; +import com.casic.missiles.annotation.SentinelLimitAnnotation; import com.casic.missiles.core.application.enums.LoginType; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.model.auth.AuthUser; @@ -47,6 +48,7 @@ /** * 获取mockToken */ + @SentinelLimitAnnotation(limitCount = 1, resourceName = "mockToken") @GetMapping("/mockToken") @ResponseBody public Object mockToken(String username, String password) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java index 8f2ca35..7b8c622 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -50,7 +50,7 @@ public static String getSourceByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getSource().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getSource(); } } @@ -59,7 +59,7 @@ public static String getValueByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getValue().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getValue(); } } diff --git a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml index a40e75a..93901d9 100644 --- a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml @@ -13,13 +13,15 @@ + + - id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, create_time, update_time + id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, business_id, process_id, create_time, update_time diff --git a/casic-metering-api/pom.xml b/casic-metering-api/pom.xml index 4985570..a74cb17 100644 --- a/casic-metering-api/pom.xml +++ b/casic-metering-api/pom.xml @@ -158,6 +158,10 @@ spring-boot-devtools true + + com.alibaba.csp + sentinel-core + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java index 8d41a35..6775197 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -1,6 +1,7 @@ package com.casic.missiles.controller; import cn.hutool.core.util.StrUtil; +import com.casic.missiles.annotation.SentinelLimitAnnotation; import com.casic.missiles.core.application.enums.LoginType; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.model.auth.AuthUser; @@ -47,6 +48,7 @@ /** * 获取mockToken */ + @SentinelLimitAnnotation(limitCount = 1, resourceName = "mockToken") @GetMapping("/mockToken") @ResponseBody public Object mockToken(String username, String password) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java index 8f2ca35..7b8c622 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -50,7 +50,7 @@ public static String getSourceByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getSource().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getSource(); } } @@ -59,7 +59,7 @@ public static String getValueByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getValue().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getValue(); } } diff --git a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml index a40e75a..93901d9 100644 --- a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml @@ -13,13 +13,15 @@ + + - id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, create_time, update_time + id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, business_id, process_id, create_time, update_time diff --git a/casic-metering-model/pom.xml b/casic-metering-model/pom.xml index 7c5b136..4d90f45 100644 --- a/casic-metering-model/pom.xml +++ b/casic-metering-model/pom.xml @@ -54,5 +54,9 @@ casic-file ${admin.version} + + com.alibaba.csp + sentinel-core + \ No newline at end of file diff --git a/casic-metering-api/pom.xml b/casic-metering-api/pom.xml index 4985570..a74cb17 100644 --- a/casic-metering-api/pom.xml +++ b/casic-metering-api/pom.xml @@ -158,6 +158,10 @@ spring-boot-devtools true + + com.alibaba.csp + sentinel-core + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java index 8d41a35..6775197 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -1,6 +1,7 @@ package com.casic.missiles.controller; import cn.hutool.core.util.StrUtil; +import com.casic.missiles.annotation.SentinelLimitAnnotation; import com.casic.missiles.core.application.enums.LoginType; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.model.auth.AuthUser; @@ -47,6 +48,7 @@ /** * 获取mockToken */ + @SentinelLimitAnnotation(limitCount = 1, resourceName = "mockToken") @GetMapping("/mockToken") @ResponseBody public Object mockToken(String username, String password) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java index 8f2ca35..7b8c622 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -50,7 +50,7 @@ public static String getSourceByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getSource().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getSource(); } } @@ -59,7 +59,7 @@ public static String getValueByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getValue().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getValue(); } } diff --git a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml index a40e75a..93901d9 100644 --- a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml @@ -13,13 +13,15 @@ + + - id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, create_time, update_time + id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, business_id, process_id, create_time, update_time diff --git a/casic-metering-model/pom.xml b/casic-metering-model/pom.xml index 7c5b136..4d90f45 100644 --- a/casic-metering-model/pom.xml +++ b/casic-metering-model/pom.xml @@ -54,5 +54,9 @@ casic-file ${admin.version} + + com.alibaba.csp + sentinel-core + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java new file mode 100644 index 0000000..52af1cf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java @@ -0,0 +1,18 @@ +package com.casic.missiles.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:14 + */ +@Target(value = ElementType.METHOD) +@Retention(value = RetentionPolicy.RUNTIME) +public @interface SentinelLimitAnnotation { + String resourceName(); + int limitCount() default 5; +} diff --git a/casic-metering-api/pom.xml b/casic-metering-api/pom.xml index 4985570..a74cb17 100644 --- a/casic-metering-api/pom.xml +++ b/casic-metering-api/pom.xml @@ -158,6 +158,10 @@ spring-boot-devtools true + + com.alibaba.csp + sentinel-core + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java index 8d41a35..6775197 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -1,6 +1,7 @@ package com.casic.missiles.controller; import cn.hutool.core.util.StrUtil; +import com.casic.missiles.annotation.SentinelLimitAnnotation; import com.casic.missiles.core.application.enums.LoginType; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.model.auth.AuthUser; @@ -47,6 +48,7 @@ /** * 获取mockToken */ + @SentinelLimitAnnotation(limitCount = 1, resourceName = "mockToken") @GetMapping("/mockToken") @ResponseBody public Object mockToken(String username, String password) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java index 8f2ca35..7b8c622 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -50,7 +50,7 @@ public static String getSourceByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getSource().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getSource(); } } @@ -59,7 +59,7 @@ public static String getValueByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getValue().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getValue(); } } diff --git a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml index a40e75a..93901d9 100644 --- a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml @@ -13,13 +13,15 @@ + + - id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, create_time, update_time + id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, business_id, process_id, create_time, update_time diff --git a/casic-metering-model/pom.xml b/casic-metering-model/pom.xml index 7c5b136..4d90f45 100644 --- a/casic-metering-model/pom.xml +++ b/casic-metering-model/pom.xml @@ -54,5 +54,9 @@ casic-file ${admin.version} + + com.alibaba.csp + sentinel-core + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java new file mode 100644 index 0000000..52af1cf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java @@ -0,0 +1,18 @@ +package com.casic.missiles.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:14 + */ +@Target(value = ElementType.METHOD) +@Retention(value = RetentionPolicy.RUNTIME) +public @interface SentinelLimitAnnotation { + String resourceName(); + int limitCount() default 5; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java b/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java new file mode 100644 index 0000000..015a4f2 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java @@ -0,0 +1,102 @@ +package com.casic.missiles.aspect; + +import com.alibaba.csp.sentinel.Entry; +import com.alibaba.csp.sentinel.SphU; +import com.alibaba.csp.sentinel.Tracer; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import com.alibaba.csp.sentinel.slots.block.RuleConstant; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; +import com.casic.missiles.annotation.SentinelLimitAnnotation; +import com.casic.missiles.dto.ReturnUtil; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:35 + */ +@Aspect +@Component +public class SentinelMethodLimitAop { + + private static void initFlowRule(String resourceName, int limitCount) { + List rules = new ArrayList<>(); + FlowRule rule = new FlowRule(); + //设置受保护的资源 + rule.setResource(resourceName); + //设置流控规则 QPS + rule.setGrade(RuleConstant.FLOW_GRADE_QPS); + //设置受保护的资源阈值 + rule.setCount(limitCount); + rules.add(rule); + //加载配置好的规则 + FlowRuleManager.loadRules(rules); + } + + @Pointcut(value = "@annotation(com.casic.missiles.annotation.SentinelLimitAnnotation)") + public void rateLimit() { + + } + + @Around("rateLimit()") + public Object around(ProceedingJoinPoint joinPoint) { + //1、获取当前的调用方法 + Method currentMethod = getCurrentMethod(joinPoint); + if (Objects.isNull(currentMethod)) { + return null; + } + //2、从方法注解定义上获取限流的类型 + String resourceName = currentMethod.getAnnotation(SentinelLimitAnnotation.class).resourceName(); + if(StringUtils.isEmpty(resourceName)){ + throw new RuntimeException("资源名称为空"); + } + int limitCount = currentMethod.getAnnotation(SentinelLimitAnnotation.class).limitCount(); + initFlowRule(resourceName, limitCount); + + Entry entry = null; + Object result = null; + try { + entry = SphU.entry(resourceName); + try { + result = joinPoint.proceed(); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } catch (BlockException ex) { + // 资源访问阻止,被限流或被降级 + // 在此处进行相应的处理操作 + System.out.println("blocked"); + return ReturnUtil.failed("当前服务请求过于频繁,请稍后访问"); + } catch (Exception e) { + Tracer.traceEntry(e, entry); + } finally { + if (entry != null) { + entry.exit(); + } + } + return result; + } + + private Method getCurrentMethod(JoinPoint joinPoint) { + Method[] methods = joinPoint.getTarget().getClass().getMethods(); + Method target = null; + for (Method method : methods) { + if (method.getName().equals(joinPoint.getSignature().getName())) { + target = method; + break; + } + } + return target; + } +} diff --git a/casic-metering-api/pom.xml b/casic-metering-api/pom.xml index 4985570..a74cb17 100644 --- a/casic-metering-api/pom.xml +++ b/casic-metering-api/pom.xml @@ -158,6 +158,10 @@ spring-boot-devtools true + + com.alibaba.csp + sentinel-core + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java index 8d41a35..6775197 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -1,6 +1,7 @@ package com.casic.missiles.controller; import cn.hutool.core.util.StrUtil; +import com.casic.missiles.annotation.SentinelLimitAnnotation; import com.casic.missiles.core.application.enums.LoginType; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.model.auth.AuthUser; @@ -47,6 +48,7 @@ /** * 获取mockToken */ + @SentinelLimitAnnotation(limitCount = 1, resourceName = "mockToken") @GetMapping("/mockToken") @ResponseBody public Object mockToken(String username, String password) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java index 8f2ca35..7b8c622 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -50,7 +50,7 @@ public static String getSourceByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getSource().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getSource(); } } @@ -59,7 +59,7 @@ public static String getValueByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getValue().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getValue(); } } diff --git a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml index a40e75a..93901d9 100644 --- a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml @@ -13,13 +13,15 @@ + + - id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, create_time, update_time + id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, business_id, process_id, create_time, update_time diff --git a/casic-metering-model/pom.xml b/casic-metering-model/pom.xml index 7c5b136..4d90f45 100644 --- a/casic-metering-model/pom.xml +++ b/casic-metering-model/pom.xml @@ -54,5 +54,9 @@ casic-file ${admin.version} + + com.alibaba.csp + sentinel-core + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java new file mode 100644 index 0000000..52af1cf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java @@ -0,0 +1,18 @@ +package com.casic.missiles.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:14 + */ +@Target(value = ElementType.METHOD) +@Retention(value = RetentionPolicy.RUNTIME) +public @interface SentinelLimitAnnotation { + String resourceName(); + int limitCount() default 5; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java b/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java new file mode 100644 index 0000000..015a4f2 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java @@ -0,0 +1,102 @@ +package com.casic.missiles.aspect; + +import com.alibaba.csp.sentinel.Entry; +import com.alibaba.csp.sentinel.SphU; +import com.alibaba.csp.sentinel.Tracer; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import com.alibaba.csp.sentinel.slots.block.RuleConstant; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; +import com.casic.missiles.annotation.SentinelLimitAnnotation; +import com.casic.missiles.dto.ReturnUtil; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:35 + */ +@Aspect +@Component +public class SentinelMethodLimitAop { + + private static void initFlowRule(String resourceName, int limitCount) { + List rules = new ArrayList<>(); + FlowRule rule = new FlowRule(); + //设置受保护的资源 + rule.setResource(resourceName); + //设置流控规则 QPS + rule.setGrade(RuleConstant.FLOW_GRADE_QPS); + //设置受保护的资源阈值 + rule.setCount(limitCount); + rules.add(rule); + //加载配置好的规则 + FlowRuleManager.loadRules(rules); + } + + @Pointcut(value = "@annotation(com.casic.missiles.annotation.SentinelLimitAnnotation)") + public void rateLimit() { + + } + + @Around("rateLimit()") + public Object around(ProceedingJoinPoint joinPoint) { + //1、获取当前的调用方法 + Method currentMethod = getCurrentMethod(joinPoint); + if (Objects.isNull(currentMethod)) { + return null; + } + //2、从方法注解定义上获取限流的类型 + String resourceName = currentMethod.getAnnotation(SentinelLimitAnnotation.class).resourceName(); + if(StringUtils.isEmpty(resourceName)){ + throw new RuntimeException("资源名称为空"); + } + int limitCount = currentMethod.getAnnotation(SentinelLimitAnnotation.class).limitCount(); + initFlowRule(resourceName, limitCount); + + Entry entry = null; + Object result = null; + try { + entry = SphU.entry(resourceName); + try { + result = joinPoint.proceed(); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } catch (BlockException ex) { + // 资源访问阻止,被限流或被降级 + // 在此处进行相应的处理操作 + System.out.println("blocked"); + return ReturnUtil.failed("当前服务请求过于频繁,请稍后访问"); + } catch (Exception e) { + Tracer.traceEntry(e, entry); + } finally { + if (entry != null) { + entry.exit(); + } + } + return result; + } + + private Method getCurrentMethod(JoinPoint joinPoint) { + Method[] methods = joinPoint.getTarget().getClass().getMethods(); + Method target = null; + for (Method method : methods) { + if (method.getName().equals(joinPoint.getSignature().getName())) { + target = method; + break; + } + } + return target; + } +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java index 832e87a..fc87bef 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java @@ -96,14 +96,15 @@ /** * 业务表主键,前端跳转审批详情使用 */ - @TableField(exist = false) + @TableField("business_id") private String businessId; /** * 流程实例id,前端跳转审批详情使用 */ - @TableField(exist = false) + @TableField("process_id") private String processId; + /** * 前端跳转审批详情使用 */ diff --git a/casic-metering-api/pom.xml b/casic-metering-api/pom.xml index 4985570..a74cb17 100644 --- a/casic-metering-api/pom.xml +++ b/casic-metering-api/pom.xml @@ -158,6 +158,10 @@ spring-boot-devtools true + + com.alibaba.csp + sentinel-core + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java index 8d41a35..6775197 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -1,6 +1,7 @@ package com.casic.missiles.controller; import cn.hutool.core.util.StrUtil; +import com.casic.missiles.annotation.SentinelLimitAnnotation; import com.casic.missiles.core.application.enums.LoginType; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.model.auth.AuthUser; @@ -47,6 +48,7 @@ /** * 获取mockToken */ + @SentinelLimitAnnotation(limitCount = 1, resourceName = "mockToken") @GetMapping("/mockToken") @ResponseBody public Object mockToken(String username, String password) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java index 8f2ca35..7b8c622 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -50,7 +50,7 @@ public static String getSourceByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getSource().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getSource(); } } @@ -59,7 +59,7 @@ public static String getValueByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getValue().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getValue(); } } diff --git a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml index a40e75a..93901d9 100644 --- a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml @@ -13,13 +13,15 @@ + + - id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, create_time, update_time + id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, business_id, process_id, create_time, update_time diff --git a/casic-metering-model/pom.xml b/casic-metering-model/pom.xml index 7c5b136..4d90f45 100644 --- a/casic-metering-model/pom.xml +++ b/casic-metering-model/pom.xml @@ -54,5 +54,9 @@ casic-file ${admin.version} + + com.alibaba.csp + sentinel-core + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java new file mode 100644 index 0000000..52af1cf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java @@ -0,0 +1,18 @@ +package com.casic.missiles.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:14 + */ +@Target(value = ElementType.METHOD) +@Retention(value = RetentionPolicy.RUNTIME) +public @interface SentinelLimitAnnotation { + String resourceName(); + int limitCount() default 5; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java b/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java new file mode 100644 index 0000000..015a4f2 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java @@ -0,0 +1,102 @@ +package com.casic.missiles.aspect; + +import com.alibaba.csp.sentinel.Entry; +import com.alibaba.csp.sentinel.SphU; +import com.alibaba.csp.sentinel.Tracer; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import com.alibaba.csp.sentinel.slots.block.RuleConstant; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; +import com.casic.missiles.annotation.SentinelLimitAnnotation; +import com.casic.missiles.dto.ReturnUtil; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:35 + */ +@Aspect +@Component +public class SentinelMethodLimitAop { + + private static void initFlowRule(String resourceName, int limitCount) { + List rules = new ArrayList<>(); + FlowRule rule = new FlowRule(); + //设置受保护的资源 + rule.setResource(resourceName); + //设置流控规则 QPS + rule.setGrade(RuleConstant.FLOW_GRADE_QPS); + //设置受保护的资源阈值 + rule.setCount(limitCount); + rules.add(rule); + //加载配置好的规则 + FlowRuleManager.loadRules(rules); + } + + @Pointcut(value = "@annotation(com.casic.missiles.annotation.SentinelLimitAnnotation)") + public void rateLimit() { + + } + + @Around("rateLimit()") + public Object around(ProceedingJoinPoint joinPoint) { + //1、获取当前的调用方法 + Method currentMethod = getCurrentMethod(joinPoint); + if (Objects.isNull(currentMethod)) { + return null; + } + //2、从方法注解定义上获取限流的类型 + String resourceName = currentMethod.getAnnotation(SentinelLimitAnnotation.class).resourceName(); + if(StringUtils.isEmpty(resourceName)){ + throw new RuntimeException("资源名称为空"); + } + int limitCount = currentMethod.getAnnotation(SentinelLimitAnnotation.class).limitCount(); + initFlowRule(resourceName, limitCount); + + Entry entry = null; + Object result = null; + try { + entry = SphU.entry(resourceName); + try { + result = joinPoint.proceed(); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } catch (BlockException ex) { + // 资源访问阻止,被限流或被降级 + // 在此处进行相应的处理操作 + System.out.println("blocked"); + return ReturnUtil.failed("当前服务请求过于频繁,请稍后访问"); + } catch (Exception e) { + Tracer.traceEntry(e, entry); + } finally { + if (entry != null) { + entry.exit(); + } + } + return result; + } + + private Method getCurrentMethod(JoinPoint joinPoint) { + Method[] methods = joinPoint.getTarget().getClass().getMethods(); + Method target = null; + for (Method method : methods) { + if (method.getName().equals(joinPoint.getSignature().getName())) { + target = method; + break; + } + } + return target; + } +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java index 832e87a..fc87bef 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java @@ -96,14 +96,15 @@ /** * 业务表主键,前端跳转审批详情使用 */ - @TableField(exist = false) + @TableField("business_id") private String businessId; /** * 流程实例id,前端跳转审批详情使用 */ - @TableField(exist = false) + @TableField("process_id") private String processId; + /** * 前端跳转审批详情使用 */ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java index 1edbc1b..963d150 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java @@ -80,7 +80,7 @@ List resultList = new ArrayList<>(); //审批消息 if(Objects.nonNull(request.getStatus()) && 0 == request.getStatus()){ - Arrays.stream(ApplyFromIdEnum.values()).parallel().forEach(applyFromIdEnum -> { + Arrays.stream(ApplyFromIdEnum.values()).forEach(applyFromIdEnum -> { if(StringUtils.isNotEmpty(request.getMessageSourceModule()) && !applyFromIdEnum.getSource().equals(request.getMessageSourceModule())){ return; @@ -166,6 +166,7 @@ WorkbenchApprovalMessage message = new WorkbenchApprovalMessage(); if(Objects.isNull(updateRequest.getId())){ String formId = updateRequest.getFormId(); + message.setNoticeId(ShiroKit.getUser().getId()); message.setFormId(formId); message.setMessageSourceModule(ApplyFromIdEnum.getSourceByCode(formId)); message.setMessageTitle("待审批通知"); diff --git a/casic-metering-api/pom.xml b/casic-metering-api/pom.xml index 4985570..a74cb17 100644 --- a/casic-metering-api/pom.xml +++ b/casic-metering-api/pom.xml @@ -158,6 +158,10 @@ spring-boot-devtools true + + com.alibaba.csp + sentinel-core + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java index 8d41a35..6775197 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -1,6 +1,7 @@ package com.casic.missiles.controller; import cn.hutool.core.util.StrUtil; +import com.casic.missiles.annotation.SentinelLimitAnnotation; import com.casic.missiles.core.application.enums.LoginType; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.model.auth.AuthUser; @@ -47,6 +48,7 @@ /** * 获取mockToken */ + @SentinelLimitAnnotation(limitCount = 1, resourceName = "mockToken") @GetMapping("/mockToken") @ResponseBody public Object mockToken(String username, String password) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java index 8f2ca35..7b8c622 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -50,7 +50,7 @@ public static String getSourceByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getSource().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getSource(); } } @@ -59,7 +59,7 @@ public static String getValueByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getValue().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getValue(); } } diff --git a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml index a40e75a..93901d9 100644 --- a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml @@ -13,13 +13,15 @@ + + - id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, create_time, update_time + id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, business_id, process_id, create_time, update_time diff --git a/casic-metering-model/pom.xml b/casic-metering-model/pom.xml index 7c5b136..4d90f45 100644 --- a/casic-metering-model/pom.xml +++ b/casic-metering-model/pom.xml @@ -54,5 +54,9 @@ casic-file ${admin.version} + + com.alibaba.csp + sentinel-core + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java new file mode 100644 index 0000000..52af1cf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java @@ -0,0 +1,18 @@ +package com.casic.missiles.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:14 + */ +@Target(value = ElementType.METHOD) +@Retention(value = RetentionPolicy.RUNTIME) +public @interface SentinelLimitAnnotation { + String resourceName(); + int limitCount() default 5; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java b/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java new file mode 100644 index 0000000..015a4f2 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java @@ -0,0 +1,102 @@ +package com.casic.missiles.aspect; + +import com.alibaba.csp.sentinel.Entry; +import com.alibaba.csp.sentinel.SphU; +import com.alibaba.csp.sentinel.Tracer; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import com.alibaba.csp.sentinel.slots.block.RuleConstant; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; +import com.casic.missiles.annotation.SentinelLimitAnnotation; +import com.casic.missiles.dto.ReturnUtil; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:35 + */ +@Aspect +@Component +public class SentinelMethodLimitAop { + + private static void initFlowRule(String resourceName, int limitCount) { + List rules = new ArrayList<>(); + FlowRule rule = new FlowRule(); + //设置受保护的资源 + rule.setResource(resourceName); + //设置流控规则 QPS + rule.setGrade(RuleConstant.FLOW_GRADE_QPS); + //设置受保护的资源阈值 + rule.setCount(limitCount); + rules.add(rule); + //加载配置好的规则 + FlowRuleManager.loadRules(rules); + } + + @Pointcut(value = "@annotation(com.casic.missiles.annotation.SentinelLimitAnnotation)") + public void rateLimit() { + + } + + @Around("rateLimit()") + public Object around(ProceedingJoinPoint joinPoint) { + //1、获取当前的调用方法 + Method currentMethod = getCurrentMethod(joinPoint); + if (Objects.isNull(currentMethod)) { + return null; + } + //2、从方法注解定义上获取限流的类型 + String resourceName = currentMethod.getAnnotation(SentinelLimitAnnotation.class).resourceName(); + if(StringUtils.isEmpty(resourceName)){ + throw new RuntimeException("资源名称为空"); + } + int limitCount = currentMethod.getAnnotation(SentinelLimitAnnotation.class).limitCount(); + initFlowRule(resourceName, limitCount); + + Entry entry = null; + Object result = null; + try { + entry = SphU.entry(resourceName); + try { + result = joinPoint.proceed(); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } catch (BlockException ex) { + // 资源访问阻止,被限流或被降级 + // 在此处进行相应的处理操作 + System.out.println("blocked"); + return ReturnUtil.failed("当前服务请求过于频繁,请稍后访问"); + } catch (Exception e) { + Tracer.traceEntry(e, entry); + } finally { + if (entry != null) { + entry.exit(); + } + } + return result; + } + + private Method getCurrentMethod(JoinPoint joinPoint) { + Method[] methods = joinPoint.getTarget().getClass().getMethods(); + Method target = null; + for (Method method : methods) { + if (method.getName().equals(joinPoint.getSignature().getName())) { + target = method; + break; + } + } + return target; + } +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java index 832e87a..fc87bef 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java @@ -96,14 +96,15 @@ /** * 业务表主键,前端跳转审批详情使用 */ - @TableField(exist = false) + @TableField("business_id") private String businessId; /** * 流程实例id,前端跳转审批详情使用 */ - @TableField(exist = false) + @TableField("process_id") private String processId; + /** * 前端跳转审批详情使用 */ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java index 1edbc1b..963d150 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java @@ -80,7 +80,7 @@ List resultList = new ArrayList<>(); //审批消息 if(Objects.nonNull(request.getStatus()) && 0 == request.getStatus()){ - Arrays.stream(ApplyFromIdEnum.values()).parallel().forEach(applyFromIdEnum -> { + Arrays.stream(ApplyFromIdEnum.values()).forEach(applyFromIdEnum -> { if(StringUtils.isNotEmpty(request.getMessageSourceModule()) && !applyFromIdEnum.getSource().equals(request.getMessageSourceModule())){ return; @@ -166,6 +166,7 @@ WorkbenchApprovalMessage message = new WorkbenchApprovalMessage(); if(Objects.isNull(updateRequest.getId())){ String formId = updateRequest.getFormId(); + message.setNoticeId(ShiroKit.getUser().getId()); message.setFormId(formId); message.setMessageSourceModule(ApplyFromIdEnum.getSourceByCode(formId)); message.setMessageTitle("待审批通知"); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/flowable/ProcessUpdateStateListener.java index afb74e8..89b1887 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/flowable/ProcessUpdateStateListener.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/flowable/ProcessUpdateStateListener.java @@ -37,7 +37,7 @@ RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); - System.err.println("审批通过触发监听器:" + execution); + System.out.println("审批通过触发监听器:" + execution); ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("pro_def_id", processDefinition.getKey()); @@ -77,6 +77,8 @@ WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); approvalMessage.setNoticeId(rootId); approvalMessage.setNoticeDeptId(user.getDeptId()); + approvalMessage.setBusinessId(execution.getProcessInstanceBusinessKey()); + approvalMessage.setProcessId(execution.getProcessInstanceId()); approvalMessage.setMessageTitle("结果通知"); approvalMessage.setMessageSourceModule(ApplyFromIdEnum.getSourceByCode(formId)); approvalMessage.setMessageContent(formName); @@ -85,6 +87,7 @@ if (approvalMessageMapper.insert(approvalMessage) < 0) { log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); }else { + log.info("审批通过,插入数据库成功,approvalMessage:{}", approvalMessage.toString()); //websocket消息推送 WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); diff --git a/casic-metering-api/pom.xml b/casic-metering-api/pom.xml index 4985570..a74cb17 100644 --- a/casic-metering-api/pom.xml +++ b/casic-metering-api/pom.xml @@ -158,6 +158,10 @@ spring-boot-devtools true + + com.alibaba.csp + sentinel-core + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java index 8d41a35..6775197 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -1,6 +1,7 @@ package com.casic.missiles.controller; import cn.hutool.core.util.StrUtil; +import com.casic.missiles.annotation.SentinelLimitAnnotation; import com.casic.missiles.core.application.enums.LoginType; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.model.auth.AuthUser; @@ -47,6 +48,7 @@ /** * 获取mockToken */ + @SentinelLimitAnnotation(limitCount = 1, resourceName = "mockToken") @GetMapping("/mockToken") @ResponseBody public Object mockToken(String username, String password) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java index 8f2ca35..7b8c622 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -50,7 +50,7 @@ public static String getSourceByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getSource().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getSource(); } } @@ -59,7 +59,7 @@ public static String getValueByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getValue().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getValue(); } } diff --git a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml index a40e75a..93901d9 100644 --- a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml @@ -13,13 +13,15 @@ + + - id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, create_time, update_time + id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, business_id, process_id, create_time, update_time diff --git a/casic-metering-model/pom.xml b/casic-metering-model/pom.xml index 7c5b136..4d90f45 100644 --- a/casic-metering-model/pom.xml +++ b/casic-metering-model/pom.xml @@ -54,5 +54,9 @@ casic-file ${admin.version} + + com.alibaba.csp + sentinel-core + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java new file mode 100644 index 0000000..52af1cf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java @@ -0,0 +1,18 @@ +package com.casic.missiles.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:14 + */ +@Target(value = ElementType.METHOD) +@Retention(value = RetentionPolicy.RUNTIME) +public @interface SentinelLimitAnnotation { + String resourceName(); + int limitCount() default 5; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java b/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java new file mode 100644 index 0000000..015a4f2 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java @@ -0,0 +1,102 @@ +package com.casic.missiles.aspect; + +import com.alibaba.csp.sentinel.Entry; +import com.alibaba.csp.sentinel.SphU; +import com.alibaba.csp.sentinel.Tracer; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import com.alibaba.csp.sentinel.slots.block.RuleConstant; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; +import com.casic.missiles.annotation.SentinelLimitAnnotation; +import com.casic.missiles.dto.ReturnUtil; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:35 + */ +@Aspect +@Component +public class SentinelMethodLimitAop { + + private static void initFlowRule(String resourceName, int limitCount) { + List rules = new ArrayList<>(); + FlowRule rule = new FlowRule(); + //设置受保护的资源 + rule.setResource(resourceName); + //设置流控规则 QPS + rule.setGrade(RuleConstant.FLOW_GRADE_QPS); + //设置受保护的资源阈值 + rule.setCount(limitCount); + rules.add(rule); + //加载配置好的规则 + FlowRuleManager.loadRules(rules); + } + + @Pointcut(value = "@annotation(com.casic.missiles.annotation.SentinelLimitAnnotation)") + public void rateLimit() { + + } + + @Around("rateLimit()") + public Object around(ProceedingJoinPoint joinPoint) { + //1、获取当前的调用方法 + Method currentMethod = getCurrentMethod(joinPoint); + if (Objects.isNull(currentMethod)) { + return null; + } + //2、从方法注解定义上获取限流的类型 + String resourceName = currentMethod.getAnnotation(SentinelLimitAnnotation.class).resourceName(); + if(StringUtils.isEmpty(resourceName)){ + throw new RuntimeException("资源名称为空"); + } + int limitCount = currentMethod.getAnnotation(SentinelLimitAnnotation.class).limitCount(); + initFlowRule(resourceName, limitCount); + + Entry entry = null; + Object result = null; + try { + entry = SphU.entry(resourceName); + try { + result = joinPoint.proceed(); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } catch (BlockException ex) { + // 资源访问阻止,被限流或被降级 + // 在此处进行相应的处理操作 + System.out.println("blocked"); + return ReturnUtil.failed("当前服务请求过于频繁,请稍后访问"); + } catch (Exception e) { + Tracer.traceEntry(e, entry); + } finally { + if (entry != null) { + entry.exit(); + } + } + return result; + } + + private Method getCurrentMethod(JoinPoint joinPoint) { + Method[] methods = joinPoint.getTarget().getClass().getMethods(); + Method target = null; + for (Method method : methods) { + if (method.getName().equals(joinPoint.getSignature().getName())) { + target = method; + break; + } + } + return target; + } +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java index 832e87a..fc87bef 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java @@ -96,14 +96,15 @@ /** * 业务表主键,前端跳转审批详情使用 */ - @TableField(exist = false) + @TableField("business_id") private String businessId; /** * 流程实例id,前端跳转审批详情使用 */ - @TableField(exist = false) + @TableField("process_id") private String processId; + /** * 前端跳转审批详情使用 */ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java index 1edbc1b..963d150 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java @@ -80,7 +80,7 @@ List resultList = new ArrayList<>(); //审批消息 if(Objects.nonNull(request.getStatus()) && 0 == request.getStatus()){ - Arrays.stream(ApplyFromIdEnum.values()).parallel().forEach(applyFromIdEnum -> { + Arrays.stream(ApplyFromIdEnum.values()).forEach(applyFromIdEnum -> { if(StringUtils.isNotEmpty(request.getMessageSourceModule()) && !applyFromIdEnum.getSource().equals(request.getMessageSourceModule())){ return; @@ -166,6 +166,7 @@ WorkbenchApprovalMessage message = new WorkbenchApprovalMessage(); if(Objects.isNull(updateRequest.getId())){ String formId = updateRequest.getFormId(); + message.setNoticeId(ShiroKit.getUser().getId()); message.setFormId(formId); message.setMessageSourceModule(ApplyFromIdEnum.getSourceByCode(formId)); message.setMessageTitle("待审批通知"); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/flowable/ProcessUpdateStateListener.java index afb74e8..89b1887 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/flowable/ProcessUpdateStateListener.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/flowable/ProcessUpdateStateListener.java @@ -37,7 +37,7 @@ RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); - System.err.println("审批通过触发监听器:" + execution); + System.out.println("审批通过触发监听器:" + execution); ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("pro_def_id", processDefinition.getKey()); @@ -77,6 +77,8 @@ WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); approvalMessage.setNoticeId(rootId); approvalMessage.setNoticeDeptId(user.getDeptId()); + approvalMessage.setBusinessId(execution.getProcessInstanceBusinessKey()); + approvalMessage.setProcessId(execution.getProcessInstanceId()); approvalMessage.setMessageTitle("结果通知"); approvalMessage.setMessageSourceModule(ApplyFromIdEnum.getSourceByCode(formId)); approvalMessage.setMessageContent(formName); @@ -85,6 +87,7 @@ if (approvalMessageMapper.insert(approvalMessage) < 0) { log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); }else { + log.info("审批通过,插入数据库成功,approvalMessage:{}", approvalMessage.toString()); //websocket消息推送 WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/EquipmentApplyEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/EquipmentApplyEventPostProcessor.java index b17dbc5..35ce12d 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/EquipmentApplyEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/EquipmentApplyEventPostProcessor.java @@ -6,12 +6,17 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.notifyevent.ActionStatusBeanEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.service.listeners.NotifyEventPostProcessor; import com.casic.missiles.mapper.MeterFixedAssetsMapper; import com.casic.missiles.mapper.equipment.EquipmentStandardApplyEquipmentMapper; +import com.casic.missiles.mapper.equipment.EquipmentStandardApplyMapper; +import com.casic.missiles.mapper.equipment.EquipmentStandardEquipmentMapper; import com.casic.missiles.model.equipment.EquipmentFixedAssets; +import com.casic.missiles.model.equipment.EquipmentStandardApply; import com.casic.missiles.model.equipment.EquipmentStandardApplyEquipment; +import com.casic.missiles.model.equipment.EquipmentStandardEquipment; +import com.casic.missiles.service.listeners.NotifyEventPostProcessor; import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; @@ -22,6 +27,7 @@ * * 审批通过后修改标准装置业务状态 */ +@Slf4j @Service(ActionStatusBeanEnum.APPLY_BEAN_NAME) public class EquipmentApplyEventPostProcessor implements NotifyEventPostProcessor { @@ -29,15 +35,23 @@ public void doHandleNotifyEvent( NotifyEventStatusDTO notifyEventStatusDTO) { MeterFixedAssetsMapper meterFixedAssetsMapper = SpringContextUtil.getBean(MeterFixedAssetsMapper.class); EquipmentStandardApplyEquipmentMapper applyEquipmentMapper = SpringContextUtil.getBean(EquipmentStandardApplyEquipmentMapper.class); - // 通过申请id查询出申请设备列表 + EquipmentStandardApplyMapper applyMapper = SpringContextUtil.getBean(EquipmentStandardApplyMapper.class); + EquipmentStandardEquipmentMapper equipmentMapper = SpringContextUtil.getBean(EquipmentStandardEquipmentMapper.class); + //通过申请id查询出标准装置id + EquipmentStandardApply equipmentStandardApply = applyMapper.selectById(notifyEventStatusDTO.getId()); + //通过申请id查询出申请设备列表 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("standard_apply_id", notifyEventStatusDTO.getId()); List equipmentStandardApplyEquipments = applyEquipmentMapper.selectList(queryWrapper); List equipmentIds = equipmentStandardApplyEquipments.stream().map(EquipmentStandardApplyEquipment::getEquipmentId).collect(Collectors.toList()); - // 修改对应设备状态 + //修改对应关联设备状态 UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.in("id", equipmentIds).set("manager_state", notifyEventStatusDTO.getStatus()); - if (meterFixedAssetsMapper.update(null, updateWrapper) <= 0) { + //修改标准装置状态 + EquipmentStandardEquipment equipmentStandardEquipment = new EquipmentStandardEquipment(); + equipmentStandardEquipment.setId(Long.valueOf(equipmentStandardApply.getStandardEquipmentId())); + equipmentStandardEquipment.setManagerState(notifyEventStatusDTO.getStatus()); + if (meterFixedAssetsMapper.update(null, updateWrapper) <= 0 || equipmentMapper.updateById(equipmentStandardEquipment) <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } diff --git a/casic-metering-api/pom.xml b/casic-metering-api/pom.xml index 4985570..a74cb17 100644 --- a/casic-metering-api/pom.xml +++ b/casic-metering-api/pom.xml @@ -158,6 +158,10 @@ spring-boot-devtools true + + com.alibaba.csp + sentinel-core + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java index 8d41a35..6775197 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/MockController.java @@ -1,6 +1,7 @@ package com.casic.missiles.controller; import cn.hutool.core.util.StrUtil; +import com.casic.missiles.annotation.SentinelLimitAnnotation; import com.casic.missiles.core.application.enums.LoginType; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.model.auth.AuthUser; @@ -47,6 +48,7 @@ /** * 获取mockToken */ + @SentinelLimitAnnotation(limitCount = 1, resourceName = "mockToken") @GetMapping("/mockToken") @ResponseBody public Object mockToken(String username, String password) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java index 8f2ca35..7b8c622 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/system/ApplyFromIdEnum.java @@ -50,7 +50,7 @@ public static String getSourceByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getSource().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getSource(); } } @@ -59,7 +59,7 @@ public static String getValueByCode(String code){ for (ApplyFromIdEnum applyFromIdEnum : ApplyFromIdEnum.values()) { - if(applyFromIdEnum.getValue().equals(code)){ + if(applyFromIdEnum.getCode().equals(code)){ return applyFromIdEnum.getValue(); } } diff --git a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml index a40e75a..93901d9 100644 --- a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchApprovalMessageMapper.xml @@ -13,13 +13,15 @@ + + - id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, create_time, update_time + id, notice_id, notice_dept_id, message_title, message_content, message_type, message_source_module, form_id, status, business_id, process_id, create_time, update_time diff --git a/casic-metering-model/pom.xml b/casic-metering-model/pom.xml index 7c5b136..4d90f45 100644 --- a/casic-metering-model/pom.xml +++ b/casic-metering-model/pom.xml @@ -54,5 +54,9 @@ casic-file ${admin.version} + + com.alibaba.csp + sentinel-core + \ No newline at end of file diff --git a/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java new file mode 100644 index 0000000..52af1cf --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/annotation/SentinelLimitAnnotation.java @@ -0,0 +1,18 @@ +package com.casic.missiles.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:14 + */ +@Target(value = ElementType.METHOD) +@Retention(value = RetentionPolicy.RUNTIME) +public @interface SentinelLimitAnnotation { + String resourceName(); + int limitCount() default 5; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java b/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java new file mode 100644 index 0000000..015a4f2 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/aspect/SentinelMethodLimitAop.java @@ -0,0 +1,102 @@ +package com.casic.missiles.aspect; + +import com.alibaba.csp.sentinel.Entry; +import com.alibaba.csp.sentinel.SphU; +import com.alibaba.csp.sentinel.Tracer; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import com.alibaba.csp.sentinel.slots.block.RuleConstant; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; +import com.casic.missiles.annotation.SentinelLimitAnnotation; +import com.casic.missiles.dto.ReturnUtil; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/7/5 15:35 + */ +@Aspect +@Component +public class SentinelMethodLimitAop { + + private static void initFlowRule(String resourceName, int limitCount) { + List rules = new ArrayList<>(); + FlowRule rule = new FlowRule(); + //设置受保护的资源 + rule.setResource(resourceName); + //设置流控规则 QPS + rule.setGrade(RuleConstant.FLOW_GRADE_QPS); + //设置受保护的资源阈值 + rule.setCount(limitCount); + rules.add(rule); + //加载配置好的规则 + FlowRuleManager.loadRules(rules); + } + + @Pointcut(value = "@annotation(com.casic.missiles.annotation.SentinelLimitAnnotation)") + public void rateLimit() { + + } + + @Around("rateLimit()") + public Object around(ProceedingJoinPoint joinPoint) { + //1、获取当前的调用方法 + Method currentMethod = getCurrentMethod(joinPoint); + if (Objects.isNull(currentMethod)) { + return null; + } + //2、从方法注解定义上获取限流的类型 + String resourceName = currentMethod.getAnnotation(SentinelLimitAnnotation.class).resourceName(); + if(StringUtils.isEmpty(resourceName)){ + throw new RuntimeException("资源名称为空"); + } + int limitCount = currentMethod.getAnnotation(SentinelLimitAnnotation.class).limitCount(); + initFlowRule(resourceName, limitCount); + + Entry entry = null; + Object result = null; + try { + entry = SphU.entry(resourceName); + try { + result = joinPoint.proceed(); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } catch (BlockException ex) { + // 资源访问阻止,被限流或被降级 + // 在此处进行相应的处理操作 + System.out.println("blocked"); + return ReturnUtil.failed("当前服务请求过于频繁,请稍后访问"); + } catch (Exception e) { + Tracer.traceEntry(e, entry); + } finally { + if (entry != null) { + entry.exit(); + } + } + return result; + } + + private Method getCurrentMethod(JoinPoint joinPoint) { + Method[] methods = joinPoint.getTarget().getClass().getMethods(); + Method target = null; + for (Method method : methods) { + if (method.getName().equals(joinPoint.getSignature().getName())) { + target = method; + break; + } + } + return target; + } +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java index 832e87a..fc87bef 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchApprovalMessage.java @@ -96,14 +96,15 @@ /** * 业务表主键,前端跳转审批详情使用 */ - @TableField(exist = false) + @TableField("business_id") private String businessId; /** * 流程实例id,前端跳转审批详情使用 */ - @TableField(exist = false) + @TableField("process_id") private String processId; + /** * 前端跳转审批详情使用 */ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java index 1edbc1b..963d150 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/workbench/WorkbenchApprovalMessageServiceImpl.java @@ -80,7 +80,7 @@ List resultList = new ArrayList<>(); //审批消息 if(Objects.nonNull(request.getStatus()) && 0 == request.getStatus()){ - Arrays.stream(ApplyFromIdEnum.values()).parallel().forEach(applyFromIdEnum -> { + Arrays.stream(ApplyFromIdEnum.values()).forEach(applyFromIdEnum -> { if(StringUtils.isNotEmpty(request.getMessageSourceModule()) && !applyFromIdEnum.getSource().equals(request.getMessageSourceModule())){ return; @@ -166,6 +166,7 @@ WorkbenchApprovalMessage message = new WorkbenchApprovalMessage(); if(Objects.isNull(updateRequest.getId())){ String formId = updateRequest.getFormId(); + message.setNoticeId(ShiroKit.getUser().getId()); message.setFormId(formId); message.setMessageSourceModule(ApplyFromIdEnum.getSourceByCode(formId)); message.setMessageTitle("待审批通知"); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/flowable/ProcessUpdateStateListener.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/flowable/ProcessUpdateStateListener.java index afb74e8..89b1887 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/flowable/ProcessUpdateStateListener.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/flowable/ProcessUpdateStateListener.java @@ -37,7 +37,7 @@ RepositoryService repositoryService = SpringContextUtil.getBean(RepositoryService.class); RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); SystemFlowFormMapper flowFormMapper = SpringContextUtil.getBean(SystemFlowFormMapper.class); - System.err.println("审批通过触发监听器:" + execution); + System.out.println("审批通过触发监听器:" + execution); ProcessDefinition processDefinition = repositoryService.getProcessDefinition(execution.getProcessDefinitionId()); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("pro_def_id", processDefinition.getKey()); @@ -77,6 +77,8 @@ WorkbenchApprovalMessage approvalMessage = new WorkbenchApprovalMessage(); approvalMessage.setNoticeId(rootId); approvalMessage.setNoticeDeptId(user.getDeptId()); + approvalMessage.setBusinessId(execution.getProcessInstanceBusinessKey()); + approvalMessage.setProcessId(execution.getProcessInstanceId()); approvalMessage.setMessageTitle("结果通知"); approvalMessage.setMessageSourceModule(ApplyFromIdEnum.getSourceByCode(formId)); approvalMessage.setMessageContent(formName); @@ -85,6 +87,7 @@ if (approvalMessageMapper.insert(approvalMessage) < 0) { log.error("审批通过,通知发起人失败,approvalMessage:{}", approvalMessage.toString()); }else { + log.info("审批通过,插入数据库成功,approvalMessage:{}", approvalMessage.toString()); //websocket消息推送 WebSocket webSocket = SpringContextUtil.getBean(WebSocket.class); webSocket.sendOneMessage(String.valueOf(rootId), JSONObject.toJSONString(approvalMessage)); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/EquipmentApplyEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/EquipmentApplyEventPostProcessor.java index b17dbc5..35ce12d 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/EquipmentApplyEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/EquipmentApplyEventPostProcessor.java @@ -6,12 +6,17 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.notifyevent.ActionStatusBeanEnum; import com.casic.missiles.exception.BusinessException; -import com.casic.missiles.service.listeners.NotifyEventPostProcessor; import com.casic.missiles.mapper.MeterFixedAssetsMapper; import com.casic.missiles.mapper.equipment.EquipmentStandardApplyEquipmentMapper; +import com.casic.missiles.mapper.equipment.EquipmentStandardApplyMapper; +import com.casic.missiles.mapper.equipment.EquipmentStandardEquipmentMapper; import com.casic.missiles.model.equipment.EquipmentFixedAssets; +import com.casic.missiles.model.equipment.EquipmentStandardApply; import com.casic.missiles.model.equipment.EquipmentStandardApplyEquipment; +import com.casic.missiles.model.equipment.EquipmentStandardEquipment; +import com.casic.missiles.service.listeners.NotifyEventPostProcessor; import com.casic.missiles.utils.SpringContextUtil; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; @@ -22,6 +27,7 @@ * * 审批通过后修改标准装置业务状态 */ +@Slf4j @Service(ActionStatusBeanEnum.APPLY_BEAN_NAME) public class EquipmentApplyEventPostProcessor implements NotifyEventPostProcessor { @@ -29,15 +35,23 @@ public void doHandleNotifyEvent( NotifyEventStatusDTO notifyEventStatusDTO) { MeterFixedAssetsMapper meterFixedAssetsMapper = SpringContextUtil.getBean(MeterFixedAssetsMapper.class); EquipmentStandardApplyEquipmentMapper applyEquipmentMapper = SpringContextUtil.getBean(EquipmentStandardApplyEquipmentMapper.class); - // 通过申请id查询出申请设备列表 + EquipmentStandardApplyMapper applyMapper = SpringContextUtil.getBean(EquipmentStandardApplyMapper.class); + EquipmentStandardEquipmentMapper equipmentMapper = SpringContextUtil.getBean(EquipmentStandardEquipmentMapper.class); + //通过申请id查询出标准装置id + EquipmentStandardApply equipmentStandardApply = applyMapper.selectById(notifyEventStatusDTO.getId()); + //通过申请id查询出申请设备列表 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("standard_apply_id", notifyEventStatusDTO.getId()); List equipmentStandardApplyEquipments = applyEquipmentMapper.selectList(queryWrapper); List equipmentIds = equipmentStandardApplyEquipments.stream().map(EquipmentStandardApplyEquipment::getEquipmentId).collect(Collectors.toList()); - // 修改对应设备状态 + //修改对应关联设备状态 UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.in("id", equipmentIds).set("manager_state", notifyEventStatusDTO.getStatus()); - if (meterFixedAssetsMapper.update(null, updateWrapper) <= 0) { + //修改标准装置状态 + EquipmentStandardEquipment equipmentStandardEquipment = new EquipmentStandardEquipment(); + equipmentStandardEquipment.setId(Long.valueOf(equipmentStandardApply.getStandardEquipmentId())); + equipmentStandardEquipment.setManagerState(notifyEventStatusDTO.getStatus()); + if (meterFixedAssetsMapper.update(null, updateWrapper) <= 0 || equipmentMapper.updateById(equipmentStandardEquipment) <= 0) { throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } } diff --git a/pom.xml b/pom.xml index 9ab0f69..bee8ce1 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,7 @@ 2.3.0 1.0 1.3.3 + 1.8.0 @@ -195,6 +196,12 @@ commons-fileupload ${fileupload.version} + + + com.alibaba.csp + sentinel-core + ${sentinel.version} +