From 8c4f42c77afb6690fcc48ac219ae044173fd77dd Mon Sep 17 00:00:00 2001
From: luofl <1442745593@qq.com>
Date: 星期日, 23 二月 2025 16:11:45 +0800
Subject: [PATCH] 1.

---
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/aspectj/DistributedLockAspect.java   |  138 +++++++++++++++++++
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/enums/ProcessStatusEnum.java         |   34 ++++
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/pom.xml                                                                        |    7 +
 /dev/null                                                                                                                                 |   20 --
 springcloud_k8s_panzhihuazhihuishequ/common/pom.xml                                                                                       |    1 
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/vo/WorkOrderVO.java                  |    8 +
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/config/RedissonConfig.java           |   57 ++++++++
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/enums/AuditStatusEnum.java           |   36 +++++
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/ServiceSangeshenbianApplication.java |    4 
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/annotation/DistributedLock.java      |   34 ++++
 springcloud_k8s_panzhihuazhihuishequ/config_server/src/main/resources/application.yml                                                     |   38 ++--
 11 files changed, 338 insertions(+), 39 deletions(-)

diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/pom.xml b/springcloud_k8s_panzhihuazhihuishequ/common/pom.xml
index ab94340..bba29d8 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/common/pom.xml
+++ b/springcloud_k8s_panzhihuazhihuishequ/common/pom.xml
@@ -26,6 +26,7 @@
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
+            <version>1.18.24</version>
         </dependency>
         <dependency>
             <groupId>ch.qos.logback</groupId>
diff --git a/springcloud_k8s_panzhihuazhihuishequ/config_server/src/main/resources/application.yml b/springcloud_k8s_panzhihuazhihuishequ/config_server/src/main/resources/application.yml
index c648214..178c8df 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/config_server/src/main/resources/application.yml
+++ b/springcloud_k8s_panzhihuazhihuishequ/config_server/src/main/resources/application.yml
@@ -11,31 +11,31 @@
     serviceUrl:
       defaultZone: http://${EUREKA_URL:localhost}:8192/eureka
 
-spring:
-  application:
-    name: huacheng-config
-
-  cloud:
-    config:
-      server:
-        git:
-          uri: http://gitlab.nhys.cdnhxx.com:9380/huanghongfa/config-repo.git
-#          search-paths: adminConfig
-          username: huanghongfa
-          password: huanghongfa123456
-          default-label: huacheng
-#          basedir: F:\nahan\config-repo\config-repo
-
 #spring:
 #  application:
 #    name: huacheng-config
-#  profiles:
-#    active: native
+#
 #  cloud:
 #    config:
 #      server:
-#        native:
-#          search-locations: file:E:\\work\\config\\config-repo
+#        git:
+#          uri: http://gitlab.nhys.cdnhxx.com:9380/huanghongfa/config-repo.git
+##          search-paths: adminConfig
+#          username: huanghongfa
+#          password: huanghongfa123456
+#          default-label: huacheng
+##          basedir: F:\nahan\config-repo\config-repo
+
+spring:
+  application:
+    name: huacheng-config
+  profiles:
+    active: native
+  cloud:
+    config:
+      server:
+        native:
+          search-locations: file:F:\lfl\config-repo-huacheng
 
 management:
   endpoints:
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/pom.xml b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/pom.xml
index ba80903..791c0f1 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/pom.xml
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/pom.xml
@@ -63,6 +63,13 @@
         </dependency>
 
         <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+            <version>3.10.1</version>
+        </dependency>
+
+
+        <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>
         </dependency>
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/ServiceSangeshenbianApplication.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/ServiceSangeshenbianApplication.java
index bc20e2b..c59af8c 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/ServiceSangeshenbianApplication.java
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/ServiceSangeshenbianApplication.java
@@ -1,5 +1,6 @@
 package com.panzhihua.sangeshenbian;
 
+import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.cloud.client.SpringCloudApplication;
 import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
@@ -7,16 +8,19 @@
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.scheduling.annotation.EnableScheduling;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
 
 /**
  * Hello world!
  *
  */
 @SpringCloudApplication
+@EnableSwagger2
 @EnableFeignClients(basePackages = {"com.panzhihua.common.service"})
 @EnableEurekaClient
 @EnableCircuitBreaker
 @ComponentScan({"com.panzhihua.sangeshenbian", "com.panzhihua.common"})
+@MapperScan("com.panzhihua.sangeshenbian.dao")
 @EnableScheduling
 public class ServiceSangeshenbianApplication
 {
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/annotation/DistributedLock.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/annotation/DistributedLock.java
new file mode 100644
index 0000000..5eadeb0
--- /dev/null
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/annotation/DistributedLock.java
@@ -0,0 +1,34 @@
+package com.panzhihua.sangeshenbian.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @Descreption: 分布式锁注解
+ * @Author: lfl
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DistributedLock {
+
+    /**
+     * 锁名字(没有EL解析)
+     */
+    String lockName() default "";
+
+    /**
+     * 锁前缀(有EL解析)
+     */
+    String lockNamePre() default "";
+
+    /**
+     * 锁后缀(有EL解析)
+     */
+    String lockNamePost() default "";
+
+    /**
+     * 锁前后缀拼接分隔符
+     */
+    String separator() default "_";
+}
+
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/aspectj/DistributedLockAspect.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/aspectj/DistributedLockAspect.java
new file mode 100644
index 0000000..660bd89
--- /dev/null
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/aspectj/DistributedLockAspect.java
@@ -0,0 +1,138 @@
+package com.panzhihua.sangeshenbian.aspectj;
+
+import com.panzhihua.sangeshenbian.annotation.DistributedLock;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+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.aspectj.lang.reflect.MethodSignature;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.lang.reflect.Method;
+import java.util.Objects;
+
+/**
+ * @Desecription: 分布式锁切面
+ * 注意!!!分布式锁不能加在事务方法当中:因为当锁释放,事务还没有提交
+ */
+
+@Aspect
+@Component
+@Slf4j
+public class DistributedLockAspect {
+    @Resource
+    private RedissonClient redissonClient;
+
+    /**
+     * @Descreption: 定义切面:以注解为切面
+     */
+    @Pointcut("@annotation(com.panzhihua.sangeshenbian.annotation.DistributedLock)")
+    public void distributedLockAspect() {
+    }
+
+
+    @Around(value = "distributedLockAspect()")
+    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
+
+        //切点所在的类
+        MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
+        Method method = methodSignature.getMethod();
+        //
+        DistributedLock annotation = method.getAnnotation(DistributedLock.class);
+        String lockName = getLockName(annotation, pjp.getArgs(), method);
+        //log.info("lockName:"+lockName);
+        RLock lock = redissonClient.getLock(lockName);
+        lock.lock();
+        try {
+            return pjp.proceed();
+        } finally {
+            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
+                //释放锁
+                lock.unlock();
+            }
+        }
+    }
+
+    /**
+     * @Descreption: 获取锁名字,优先获取注解中锁名
+     */
+    private String getLockName(DistributedLock distributedLock, Object[] args, Method method) {
+        //优先获取注解名称
+        if (StringUtils.isNotBlank(distributedLock.lockName())) {
+            return distributedLock.lockName();
+        }
+        //根据参数匹配有参数就使用动态参数,没有就使用定义参数
+        String lockNamePre = distributedLock.lockNamePre();
+        String lockNamePost = distributedLock.lockNamePost();
+        String separator = distributedLock.separator();
+
+        String preExpression = parseExpression(lockNamePre, method, args);
+        String postExpression = parseExpression(lockNamePost, method, args);
+        StringBuilder sb = new StringBuilder();
+        if (StringUtils.isNotBlank(preExpression)) {
+            sb.append(preExpression);
+        } else {
+            sb.append(lockNamePre);
+        }
+        sb.append(separator);
+        if (StringUtils.isNotBlank(postExpression)) {
+            sb.append(postExpression);
+        } else {
+            sb.append(lockNamePost);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * el表达式解析
+     *
+     * @param expressionString 解析值
+     * @param method           方法
+     * @param args             参数
+     * @return
+     */
+    private String parseExpression(String expressionString, Method method, Object[] args) {
+        //获取被拦截方法参数名列表
+        LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
+        String[] paramNameArr = discoverer.getParameterNames(method);
+        //SPEL解析
+        ExpressionParser parser = new SpelExpressionParser();
+        StandardEvaluationContext context = new StandardEvaluationContext();
+        for (int i = 0; i < Objects.requireNonNull(paramNameArr).length; i++) {
+            context.setVariable(paramNameArr[i], args[i]);
+        }
+        return parser.parseExpression(expressionString).getValue(context, String.class);
+    }
+
+//    ==========================示例=============================
+
+    //    //固定静态参数锁:product_lock
+//    @DistributedLock(lockName = "product_lock")
+//    @GetMapping(value = "/test1")
+//    public void test1() {
+//        System.out.println("执行事务");
+//    }
+//
+//    //未匹配到参数,因此仍然是静态参数锁:#param1_#param2
+//    @DistributedLock(lockNamePre = "#param1", lockNamePost = "#param2")
+//    @GetMapping(value = "/test2")
+//    public void test2() {
+//        System.out.println("执行事务");
+//    }
+//
+    //匹配到参数,动态参数锁:hello_world
+//    @DistributedLock(lockNamePre = "#order", lockNamePost = "#param2")
+//    @GetMapping(value = "/test3")
+    public void test3(String param1, String param2) {
+        System.out.println("执行事务");
+    }
+}
\ No newline at end of file
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/config/RedissonConfig.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/config/RedissonConfig.java
new file mode 100644
index 0000000..9e5e13e
--- /dev/null
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/config/RedissonConfig.java
@@ -0,0 +1,57 @@
+package com.panzhihua.sangeshenbian.config;
+
+import org.apache.commons.lang3.StringUtils;
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.redisson.config.SingleServerConfig;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Desecription:
+ */
+@Configuration
+public class RedissonConfig {
+
+
+    @Value("${spring.redis.host}")
+    private String host;
+    @Value("${spring.redis.port}")
+    private String port;
+    @Value("${spring.redis.database}")
+    private int database;
+    @Value("${spring.redis.timeout}")
+    private String timeout;
+    @Value("${spring.redis.password}")
+    private String password;
+
+    /**
+     * @Descreption: RedissonClient, 单机模式
+     */
+    @Bean(destroyMethod = "shutdown")
+    public RedissonClient redisson() {
+        Config config = new Config();
+        SingleServerConfig singleServerConfig = config.useSingleServer();
+        singleServerConfig.setAddress("redis://" + host + ":" + port);
+        singleServerConfig.setTimeout(10000);
+        singleServerConfig.setDatabase(database);
+        singleServerConfig.setRetryInterval(1000);
+        singleServerConfig.setPingConnectionInterval(1000);
+        if (StringUtils.isNotBlank(password)) {
+            singleServerConfig.setPassword(password);
+        }
+        return Redisson.create(config);
+    }
+
+//    @Bean
+//    public RedissonLocker redissonLocker(RedissonClient redissonClient) {
+//        RedissonLocker locker = new RedissonLocker(redissonClient);
+//        redissonClient.getlo
+//        //设置LockUtil的锁处理对象
+//        LockUtils.setLocker(locker);
+//        return locker;
+//    }
+}
+
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/controller/TestController.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/controller/TestController.java
deleted file mode 100644
index 62d549a..0000000
--- a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/controller/TestController.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.panzhihua.sangeshenbian.controller;
-
-import com.panzhihua.common.model.vos.R;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@RequestMapping("/test")
-@Api(tags = "测试")
-public class TestController {
-
-    @GetMapping("/hello")
-    @ApiOperation(value = "hello")
-    public R <String> hello() {
-        return R.ok("hello");
-    }
-}
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/enums/AuditStatusEnum.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/enums/AuditStatusEnum.java
new file mode 100644
index 0000000..e2558b8
--- /dev/null
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/enums/AuditStatusEnum.java
@@ -0,0 +1,36 @@
+package com.panzhihua.sangeshenbian.enums;
+
+import lombok.Data;
+
+// 审核状态枚举类
+public enum AuditStatusEnum {
+    PENDING(0, "待审核"),
+    APPROVED(1, "审核通过"),
+    REJECTED(2, "审核驳回");
+
+    private final int code;
+    private final String description;
+
+    AuditStatusEnum(int code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public static String getDescriptionByCode(int code) {
+        for (AuditStatusEnum status : AuditStatusEnum.values()) {
+            if (status.getCode() == code) {
+                return status.getDescription();
+            }
+        }
+        return null;
+    }
+}
+
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/enums/ProcessStatusEnum.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/enums/ProcessStatusEnum.java
new file mode 100644
index 0000000..2259c4b
--- /dev/null
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/enums/ProcessStatusEnum.java
@@ -0,0 +1,34 @@
+package com.panzhihua.sangeshenbian.enums;
+
+// 流转状态枚举类(更名为 ProcessStatusEnum)
+public enum ProcessStatusEnum {
+    PROCESSING(0, "正在办理"),
+    EXTENDED(1, "延期办理"),
+    OVERDUE(2, "超时办理"),
+    COMPLETED(3, "已办结");
+
+    private final int code;
+    private final String description;
+
+    ProcessStatusEnum(int code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public static String getDescriptionByCode(int code) {
+        for (ProcessStatusEnum status : ProcessStatusEnum.values()) {
+            if (status.getCode() == code) {
+                return status.getDescription();
+            }
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/vo/WorkOrderVO.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/vo/WorkOrderVO.java
new file mode 100644
index 0000000..4b99cce
--- /dev/null
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/vo/WorkOrderVO.java
@@ -0,0 +1,8 @@
+package com.panzhihua.sangeshenbian.vo;
+
+import lombok.Data;
+
+@Data
+public class WorkOrderVO {
+    private Long id;
+}

--
Gitblit v1.7.1