MrShi
10 天以前 022afd01c191ef9b37f5f4d3d0d298198072f4e0
Merge branch '2.0.1' of http://139.186.142.91:10010/r/productDev/parkBike into 2.0.1
已添加2个文件
已修改4个文件
156 ■■■■ 文件已修改
server/services/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmit.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/Repeat/RepeatSubmitAspect.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/ApiController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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());
        }
    /**
     * å¤„理单元格数据
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);
        }
     }
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 è¡¨ç¤ºè¯¥æ³¨è§£ç”¨äºŽä»€ä¹ˆåœ°æ–¹
// 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;
}
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;
// å¼€å¯æ—¥å¿—,需要依赖lombok
@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 {
        // èŽ·å–ç”¨æˆ·çš„token验证,这里项目用的是 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);
        // ä»Žç¼“存给中根据key获取数据
        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;
    }
}
server/web/src/main/java/com/doumee/api/web/ApiController.java
@@ -33,6 +33,7 @@
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        return request;
    }
    /**
     * èŽ·å–ç”¨æˆ·ID
     *
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());//已还车