From 022afd01c191ef9b37f5f4d3d0d298198072f4e0 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期一, 22 六月 2026 15:09:49 +0800
Subject: [PATCH] Merge branch '2.0.1' of http://139.186.142.91:10010/r/productDev/parkBike into 2.0.1

---
 server/web/src/main/java/com/doumee/api/web/ApiController.java                            |    1 
 server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmitAspect.java                    |   74 ++++++++++++++++++++++++
 server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java                 |   24 +++++--
 server/services/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java         |   26 ++++----
 server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java |    3 
 server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmit.java                          |   28 +++++++++
 6 files changed, 135 insertions(+), 21 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java b/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
index c6090e0..c9fa542 100644
--- a/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
+++ b/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
@@ -443,19 +443,19 @@
         cell.setCellStyle(style);
     }
 
-    /**
-     * 閰嶇疆鍗曞厓鏍艰竟妗�
-     */
-    private  static void configCellBorder (CellStyle style) {
-        style.setBorderTop(BorderStyle.THIN);
-        style.setBorderRight(BorderStyle.THIN);
-        style.setBorderBottom(BorderStyle.THIN);
-        style.setBorderLeft(BorderStyle.THIN);
-        style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
-        style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
-        style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
-        style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
-    }
+        /**
+         * 閰嶇疆鍗曞厓鏍艰竟妗�
+         */
+        private  static void configCellBorder (CellStyle style) {
+            style.setBorderTop(BorderStyle.THIN);
+            style.setBorderRight(BorderStyle.THIN);
+            style.setBorderBottom(BorderStyle.THIN);
+            style.setBorderLeft(BorderStyle.THIN);
+            style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+            style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+            style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+            style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+        }
 
     /**
      * 澶勭悊鍗曞厓鏍兼暟鎹�
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
index 74ead5c..07b08e1 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -811,7 +811,8 @@
         if(type == 0|| type ==1 || type==2){
             //濡傛灉鏄樁娈甸��娆�
             Goodsorder goodsorder = goodsorderMapper.selectById(refund.getObjId());
-            closeGoodsorderDoneNoRefund(goodsorder,type,refund.getMoney(),refund.getId(),null);
+            List<MemberRides> memberRides = getMemberRidesForClose(goodsorder.getId());//鎵撹溅楠戣璁板綍
+            closeGoodsorderDoneNoRefund(goodsorder,type,refund.getMoney(),refund.getId(),memberRides);
         }
      }
 
diff --git a/server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmit.java b/server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmit.java
new file mode 100644
index 0000000..5f8a2cc
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmit.java
@@ -0,0 +1,28 @@
+package com.doumee.api.Repeat;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+// @Target 琛ㄧず璇ユ敞瑙g敤浜庝粈涔堝湴鏂�
+// ElementType.CONSTRUCTOR 鐢ㄥ湪鏋勯�犲櫒
+// ElementType.FIELD 鐢ㄤ簬鎻忚堪鍩�-灞炴�т笂
+// ElementType.METHOD 鐢ㄥ湪鏂规硶涓�
+// ElementType.TYPE 鐢ㄥ湪绫绘垨鎺ュ彛涓�
+// ElementType.PACKAGE 鐢ㄤ簬鎻忚堪鍖�
+@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE})
+
+//@Retention 琛ㄧず鍦ㄤ粈涔堢骇鍒繚瀛樿娉ㄨВ淇℃伅
+// RetentionPolicy.SOURCE 淇濈暀鍒版簮鐮佷笂
+// RetentionPolicy.CLASS 淇濈暀鍒板瓧鑺傜爜涓�
+// RetentionPolicy.RUNTIME 淇濈暀鍒拌櫄鎷熸満杩愯鏃讹紙鏈�澶氾紝鍙�氳繃鍙嶅皠鑾峰彇锛�
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RepeatSubmit {
+
+    /**
+     * 榛樿鐨勯棿闅旀椂闂�(ms)锛屽皬浜庢鏃堕棿瑙嗕负閲嶅鎻愪氦
+     */
+    int timeout() default 2000;
+
+}
\ No newline at end of file
diff --git a/server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmitAspect.java b/server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmitAspect.java
new file mode 100644
index 0000000..591aef4
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmitAspect.java
@@ -0,0 +1,74 @@
+package com.doumee.api.Repeat;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.util.concurrent.TimeUnit;
+
+// 寮�鍚棩蹇楋紝闇�瑕佷緷璧杔ombok
+@Slf4j
+// 鎶婁竴涓被瀹氫箟涓哄垏闈緵瀹瑰櫒璇诲彇
+@Aspect
+@Component
+public class RepeatSubmitAspect {
+
+    @Resource
+    private RedisTemplate<String, String> redisTemplate;
+
+    // 杩欐槸涓�涓幆缁曢�氱煡锛屽畠浼氬洿缁曡 @RepeatSubmit 娉ㄨВ鏍囪鐨勬柟娉曟墽琛�,杩欓噷鐨� repeatSubmit 涓庝笅闈㈢殑鍙傛暟瀵瑰簲
+    @Around("@annotation(repeatSubmit)")
+    public Object around(ProceedingJoinPoint point, RepeatSubmit repeatSubmit) throws Throwable {
+
+        // 鑾峰彇鐢ㄦ埛鐨則oken楠岃瘉,杩欓噷椤圭洰鐢ㄧ殑鏄� header 閲岀殑 Authorization 鍙傛暟
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        String requestToken = request.getHeader("token");
+
+        // 鑾峰彇娉ㄨВ
+        MethodSignature signature = (MethodSignature) point.getSignature();
+        Method method = signature.getMethod();
+
+        // 鑾峰彇绫伙紝鏂规硶
+        String className = method.getDeclaringClass().getName();
+        String methodName = method.getName();
+
+        // 缁勮key锛氱敤鎴峰敮涓�鏍囪瘑+鎿嶄綔绫�+鏂规硶
+        String key = requestToken + "#" + className + "#" + methodName;
+        String keyHashCode = String.valueOf(Math.abs(key.hashCode()));
+        log.info("key:{},keyHashcode:{}", key, keyHashCode);
+
+        //鑾峰彇瓒呮椂鏃堕棿
+        int timeOut = repeatSubmit.timeout();
+        log.info("瓒呮椂鏃堕棿{}", timeOut);
+
+        // 浠庣紦瀛樼粰涓牴鎹甼ey鑾峰彇鏁版嵁
+        String value = redisTemplate.opsForValue().get(keyHashCode);
+
+        if (value != null) {
+            log.info("閲嶅鎻愪氦");
+            // 濡傛灉value涓嶄负绌�; return "璇峰嬁閲嶅鎻愪氦";
+            throw new BusinessException(ResponseStatus.MASSIVE_REQUEST);
+
+        } else {
+            log.info("棣栨鎻愪氦");
+            // value涓虹┖锛屽垯鍔犲叆缂撳瓨锛屽苟璁剧疆杩囨湡杩囨湡鏃堕棿
+            redisTemplate.opsForValue().set(keyHashCode, "1", timeOut, TimeUnit.MILLISECONDS);
+        }
+
+        //鎵цObject
+        Object object = point.proceed();
+
+        return object;
+    }
+}
\ No newline at end of file
diff --git a/server/web/src/main/java/com/doumee/api/web/ApiController.java b/server/web/src/main/java/com/doumee/api/web/ApiController.java
index 7e33c11..5ab86ef 100644
--- a/server/web/src/main/java/com/doumee/api/web/ApiController.java
+++ b/server/web/src/main/java/com/doumee/api/web/ApiController.java
@@ -33,6 +33,7 @@
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
         return request;
     }
+
     /**
      * 鑾峰彇鐢ㄦ埛ID
      *
diff --git a/server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java b/server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java
index 273a168..f4643c6 100644
--- a/server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java
+++ b/server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java
@@ -35,6 +35,7 @@
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.xpath.operations.Bool;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -120,22 +121,27 @@
         gparam.setStatus(Constants.goodsorderStatus.pay);
         gparam.setType(Constants.ZERO);
         Goodsorder goodsorder =  goodsorderService.findOne(gparam);
-        this.backBike(goodsorder);
+        this.backBike(goodsorder,false);
     }
 
     /**
-     * 鑷姩杩樿溅
+     * 寮哄埗杩樿溅
      * @param id
      */
     @Transactional
     public void forceBack(String id){
         Goodsorder goodsorder =  goodsorderService.findById(id);
-        this.backBike(goodsorder);
+        this.backBike(goodsorder,true);
     }
 
 
+    /**
+     * 杩樿溅涓氬姟
+     * @param goodsorder
+     * @param isForce 寮哄埗杩樿溅 涓嶉獙璇佽溅杈嗗湴鐐�
+     */
     @Transactional(rollbackFor = {BusinessException.class})
-    public void backBike(Goodsorder goodsorder){
+    public void backBike(Goodsorder goodsorder, Boolean isForce){
         if(Objects.isNull(goodsorder)){
             throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"鏃犻獞琛岃鍗曡褰�");
         }
@@ -151,10 +157,14 @@
                         &&Constants.equalsInteger(rides.getType(),Constants.ONE)){
                     //濡傛灉鏄數杞﹀苟涓旀槸楠戣涓� 杩涜鍏抽攣澶勭悊
                     Bikes  bike = getElecBikeByCode(rides.getBikeCode());
-                    //鏌ヨ鍋滆溅绔欑偣淇℃伅
-                    if(bike.getSiteId() ==null){
-                        throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝璇锋寜瑕佹眰鍓嶅線鍋滆溅鐐瑰仠杞︼紒");
+                    //闈炲己鍒惰繕杞� 闇�瑕侀檺鍒跺湴鐐�
+                    if(!isForce){
+                        //鏌ヨ鍋滆溅绔欑偣淇℃伅
+                        if(bike.getSiteId() ==null){
+                            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝璇锋寜瑕佹眰鍓嶅線鍋滆溅鐐瑰仠杞︼紒");
+                        }
                     }
+
                     lockBikes(bike.getDeviceSn(),Constants.ONE);//鍙戣捣鍏抽攣鎸囦护璇锋眰
                     backIds.add(rides.getId());
                     rides.setStatus(Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey());//宸茶繕杞�

--
Gitblit v1.9.3