Commit e7fd618f by xieshixiang

Merge remote-tracking branch 'origin/dev' into dev

parents 472d4187 07384b3e
......@@ -49,6 +49,21 @@
<artifactId>orika</artifactId>
<version>${parent.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.9.1</version>
</dependency>
</dependencies>
<build>
......
......@@ -3,6 +3,8 @@ package com.hikcreate.edl.pub.web.mobile.api.controller;
import com.hikcreate.common.orika.DefaultConverter;
import com.hikcreate.common.sdk.response.apiparam.Response;
import com.hikcreate.common.sdk.response.apiparam.ResponseGenerator;
import com.hikcreate.common.sdk.response.statuscode.StatusCode;
import com.hikcreate.edl.common.distributed.lock.exception.DistributedLockException;
import com.hikcreate.edl.pub.web.mobile.domain.IBindService;
import com.hikcreate.edl.pub.web.mobile.infra.core.annotatiion.BodyDecryptAnnotation;
import com.hikcreate.edl.pub.web.mobile.infra.core.annotatiion.ResponseEncryptAnnotation;
......@@ -53,7 +55,14 @@ public class BindInfoControlller extends BaseController {
public Response<BindInfoRes> bindInfo(@RequestBody @Validated BindInfoReq req) {
ParkBindInfo bindInfo = new ParkBindInfo();
defaultConverter.getMapperFacade().map(req, bindInfo);
return service.bind(bindInfo);
Response response = null;
try {
response = service.bind(bindInfo);
} catch ( DistributedLockException e ) {
log.error("分布式锁超时");
return ResponseGenerator.fail(StatusCode.REPEAT_SUBMIT);
}
return response;
}
......
......@@ -26,6 +26,12 @@
<artifactId>sdk</artifactId>
<version>${parent.version}</version>
</dependency>
<dependency>
<groupId>com.hikcreate.edl.common</groupId>
<artifactId>distributed-lock-starter</artifactId>
<version>${parent.version}</version>
</dependency>
</dependencies>
</project>
......@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hikcreate.common.sdk.response.apiparam.Response;
import com.hikcreate.common.sdk.response.apiparam.ResponseGenerator;
import com.hikcreate.common.sdk.response.statuscode.StatusCode;
import com.hikcreate.edl.common.distributed.lock.annotation.DistributedLock;
import com.hikcreate.edl.pub.web.mobile.domain.IBindService;
import com.hikcreate.edl.pub.web.mobile.infra.core.util.UnqIdUtil;
import com.hikcreate.edl.pub.web.mobile.infra.data.cache.BindCache;
......@@ -79,9 +80,16 @@ public class BindServiceImpl extends ServiceImpl<BindInfoMapper, ParkBindInfo> i
*/
@Value("${biz.unbind.time:720}")
Integer unBindTime;
/**
* 解绑限制次数
*/
@Value("${biz.unbind.limit.count:10}")
Integer unBindCount;
@Override
@Transactional(rollbackFor = Exception.class)
@DistributedLock(key = "'park:extend:bind:lock:userId:'+#info.userId+':timestamp:'+#info.timestamp", expireTime = 3000, waitTime = 2000, retryTimes = 50)
public Response bind(ParkBindInfo info) {
//判断规则1:用户已绑定的车辆不超过3辆,包括已解绑但未过一个月的车辆
QueryWrapper<ParkBindInfo> boundQuery = new QueryWrapper();
......@@ -91,6 +99,17 @@ public class BindServiceImpl extends ServiceImpl<BindInfoMapper, ParkBindInfo> i
if (list != null && list.size() >= 3) {
return ResponseGenerator.fail(StatusCode.BUSINESS_ERROR, "同一用户下,最多绑定3辆车");
}
/**
* 规则:30天内,同一客户解绑超过10次不能再进行绑定
*/
QueryWrapper<ParkBindInfo> unbindQuery = new QueryWrapper<>();
unbindQuery.eq("user_id", info.getUserId());
unbindQuery.ge("unbind_time", DateUtil.offsetHour(new Date(), -unBindTime));
unbindQuery.eq("status", "0");
Integer integer = mapper.selectCount(unbindQuery);
if (integer >= unBindCount) {
return ResponseGenerator.fail(StatusCode.BUSINESS_ERROR, StrUtil.format("{}天内,同一用户解绑超过{}次不能再进行绑定", unBindTime/24, unBindCount));
}
//规则:一个客户只能绑定一个电话号码
if (list != null && !list.isEmpty()) {
......@@ -160,17 +179,7 @@ public class BindServiceImpl extends ServiceImpl<BindInfoMapper, ParkBindInfo> i
if (bindInfo == null || "0".equals(bindInfo.getStatus())) {
return ResponseGenerator.fail(StatusCode.DATA_ERROR, "绑定信息不存在");
}
/**
* 解绑规则:30天内,同一客户解绑次数总计不能超过10次
*/
QueryWrapper<ParkBindInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", req.getUserId());
queryWrapper.ge("unbind_time", DateUtil.offsetHour(new Date(), -unBindTime));
queryWrapper.eq("status", "0");
Integer integer = mapper.selectCount(queryWrapper);
if (integer >= 10) {
return ResponseGenerator.fail(StatusCode.BUSINESS_ERROR, "同一用户" + unBindTime + "小时内只能解绑10次");
}
if (!bindCache.unBind(req.getUnqId(), req.getUserId())) {
//手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
......@@ -329,7 +338,7 @@ public class BindServiceImpl extends ServiceImpl<BindInfoMapper, ParkBindInfo> i
vechicleInfoReq.setPlateNum(bindInfo.getPlateNum());
VehicleRes byPlateNumAndType = vechicleCache.getByPlateNumAndType(vechicleInfoReq);
if (byPlateNumAndType.getSfzmhm() == null) {
return ResponseGenerator.fail(StatusCode.ALERT_ERROR, "车主身份证信息不存在");
return ResponseGenerator.fail(StatusCode.ALERT_ERROR,"车主身份证信息不存在");
}
/**
......@@ -339,7 +348,7 @@ public class BindServiceImpl extends ServiceImpl<BindInfoMapper, ParkBindInfo> i
idCardQueryReq.setIdCard(byPlateNumAndType.getSfzmhm());
DrivingLicenseRes drivingLicenseRes = drivingLicenseCache.getByIdCard(idCardQueryReq);
if (drivingLicenseRes == null) {
return ResponseGenerator.fail(StatusCode.ALERT_ERROR, "车主驾照信息不存在");
return ResponseGenerator.fail(StatusCode.ALERT_ERROR,"车主驾照信息不存在");
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment