提交 e75a6d22 作者: 张小凤

NotRepeatSubmit(update)

上级 343e0199
......@@ -20,6 +20,11 @@
</properties>
<dependencies>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.15.6</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
......
......@@ -5,6 +5,7 @@ import com.mmc.oms.common.publicinterface.Insert;
import com.mmc.oms.common.publicinterface.Update;
import com.mmc.oms.common.result.ResultBody;
import com.mmc.oms.controller.BaseController;
import com.mmc.oms.controller.demand.commit.NotRepeatSubmit;
import com.mmc.oms.model.vo.demand.CommonPaymentVO;
import com.mmc.oms.model.vo.demand.DemandReleaseOrderVO;
import com.mmc.oms.service.demand.DemandReleaseOrderService;
......@@ -55,6 +56,7 @@ public class DemandReleaseOrderController extends BaseController {
@ApiOperation(value = "订单支付")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("/orderPayment")
@NotRepeatSubmit(value = 3000L)
public ResultBody orderPayment(@RequestBody @Validated CommonPaymentVO commonPaymentVO, HttpServletRequest request) {
return releaseOrderService.orderPayment(commonPaymentVO, request,this.getCurrentAccount(request).getUserAccountId());
}
......
package com.mmc.oms.controller.demand.commit;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author small
* @Date 2023/8/26 16:34
* @Version 1.0
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotRepeatSubmit {
long value();
}
package com.mmc.oms.controller.demand.commit;
import com.mmc.oms.controller.BaseController;
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.annotation.Pointcut;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.TimeUnit;
/**
* @Author small
* @Date 2023/8/26 16:13
* @Version 1.0
*/
@Slf4j
@Component
@Aspect
public class NotRepeatSubmitConfig extends BaseController {
@Autowired
private RedissonClient redissonClient;
@Pointcut("@within(notRepeatSubmit)||@annotation(notRepeatSubmit)")
public void pointcut(NotRepeatSubmit notRepeatSubmit) {
}
@Around(value = "pointcut(notRepeatSubmit)")
public Object around(ProceedingJoinPoint proceedingJoinPoint, NotRepeatSubmit notRepeatSubmit) throws Throwable {
log.info("提交之前---");
Object result = null;
long leaseTime = notRepeatSubmit.value();
log.info("leaseTime:" + leaseTime);
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
Integer userAccountId = this.getCurrentAccount(request).getUserAccountId();
String accountUriLockKey = userAccountId + "-" + request.getServletPath();
// 设置锁定资源名称,accountUriLock改为userid+uri作为标识,作为测试写死
// String accountUriLockKey = "accountUriLock";
RLock accountUriLock = redissonClient.getLock(accountUriLockKey);
boolean tryLock;
//尝试获取分布式锁
//-1为永久 leaseTime 最多等待几秒 上锁以后leaseTime秒自动解锁
tryLock = accountUriLock.tryLock(-1, leaseTime, TimeUnit.MILLISECONDS);
log.info("tryLock:" + tryLock);
if (tryLock) {
try {
// 查询订单库存判断是否大于0
// 大于0表示还有库存可以更新订单库存将库存数字减一更新到数据库中
// 不大于0表示没有库存了本次请求就终止
log.info("正常提交:");
result = proceedingJoinPoint.proceed();
} catch (Exception e) {
log.info("主程序异常:" + e);
throw new Exception(e);
}
} else {
log.info("重复提交:" + accountUriLockKey);
}
log.info("提交之后---");
return result;
}
}
......@@ -23,4 +23,6 @@ public interface DemandReleaseOrderDao {
DemandReleaseOrderDO selectPhone(String orderNumber);
void insertService(GetOrderNumberDO getOrderNumberDO);
int selectOrderNumberDO(Integer requirementsInfoId);
}
......@@ -32,10 +32,14 @@ public class GetOrderNumberDO {
@ApiModelProperty(value = "用户id", example = "100", hidden = true)
private Integer userAccountId;
@ApiModelProperty(value = "服务id")
private Integer requirementsInfoId;
public GetOrderNumberDO(GetOrderNumberDTO getOrderNumberDTO){
this.paymentOrderNumber=getOrderNumberDTO.getPaymentOrderNumber();
this.weChatPay=getOrderNumberDTO.getWeChatPay();
this.userAccountId=getOrderNumberDTO.getUserAccountId();
this.requirementsInfoId= getOrderNumberDTO.getRequirementsInfoId();
}
public OrderRequestParamsVO orderRequestParamsVO() {
......
......@@ -30,5 +30,8 @@ public class GetOrderNumberDTO implements Serializable {
@ApiModelProperty(value = "用户id", example = "100", hidden = true)
private Integer userAccountId;
@ApiModelProperty(value = "服务id")
private Integer requirementsInfoId;
}
......@@ -124,13 +124,19 @@ public class DemandReleaseOrderServiceImpl implements DemandReleaseOrderService
* @param userAccountId
* @return
*/
private ResultBody publishServicePay(CommonPaymentVO commonPaymentVO, String token, Integer userAccountId) {
private ResultBody publishServicePay(CommonPaymentVO commonPaymentVO, String token,Integer userAccountId) {
if ("4".equals(commonPaymentVO.getOrderPort().toString())) {
if ("4".equals(commonPaymentVO.getOrderPort().toString())){
String orderNumber = commonPaymentVO.getOrderNumber();
String json = stringRedisTemplate.opsForValue().get(orderNumber);
GetOrderNumberDTO getOrderNumberDTO = JSONObject.parseObject(json, GetOrderNumberDTO.class);
GetOrderNumberDO getOrderNumberDO = new GetOrderNumberDO(getOrderNumberDTO);
if (getOrderNumberDTO.getRequirementsInfoId()!=null){
int i = releaseOrderDao.selectOrderNumberDO(getOrderNumberDO.getRequirementsInfoId());
if (i!=0){
return ResultBody.error("当前需求已有人支付");
}
}
releaseOrderDao.insertService(getOrderNumberDO);
BigDecimal paramMoney = getOrderNumberDO.getWeChatPay();
BigDecimal multiply = paramMoney.multiply(new BigDecimal(100));
......@@ -138,7 +144,7 @@ public class DemandReleaseOrderServiceImpl implements DemandReleaseOrderService
OrderRequestParamsVO orderRequestParamsVO = getOrderNumberDO.orderRequestParamsVO();
orderRequestParamsVO.setAmount(i);
ResultBody resultBody = releaseOrder(orderRequestParamsVO, token);
stringRedisTemplate.opsForValue().set(getOrderNumberDO.getPaymentOrderNumber() + getOrderNumberDO.getUserAccountId(), JsonUtil.parseObjToJson(getOrderNumberDO));
stringRedisTemplate.opsForValue().set(getOrderNumberDO.getPaymentOrderNumber()+getOrderNumberDO.getUserAccountId(), JsonUtil.parseObjToJson(getOrderNumberDO));
return resultBody;
}
return ResultBody.success();
......
......@@ -43,4 +43,13 @@
INSERT INTO service_demand_order(payment_order_number, we_chat_pay, user_account_id, create_time,update_time)
VALUES (#{paymentOrderNumber}, #{weChatPay},#{userAccountId},NOW(),NOW());
</insert>
<select id="selectOrderNumberDO" resultType="java.lang.Integer">
SELECT
count(*)
FROM
service_demand_order
WHERE
requirements_info_id =#{requirementsInfoId}
</select>
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论