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}
+