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