/**
* 设备缴费
*
* @param dto
*/
@Override
public boolean payForDevice(TPayCostFlowDTO dto) {
boolean result = false;
//加锁
String key = Constant.PAY_COST_REDIS_LOCK + dto.getDeviceId();
boolean flag = redisTemplate.opsForValue().setIfAbsent(key, "1", Duration.ofSeconds(30));
if (flag) {
try {
Map<String, Object> deviceMap = tPayCostFlowMapper.getDeviceAmountAndUserInfo(dto.getDeviceId());
String baseAmount = "0.00";
String userAccount = "";
if (null != deviceMap && !deviceMap.isEmpty()) {
Object obj = deviceMap.get("account");
if (null != obj) {
baseAmount = String.valueOf(obj);
}
userAccount = deviceMap.get("userAccount") + "";
}
BigDecimal amount = new BigDecimal(baseAmount);
BigDecimal payAmount = new BigDecimal(dto.getPayAmount());
TPayCostFlow costFlow = new TPayCostFlow();
BigDecimal balanceAmount = payAmount.add(amount);
costFlow.setDeviceId(dto.getDeviceId())
.setPayType(dto.getPayType())
.setPayStatus("1")
.setTradeNo(RedisSerialNoUtil.generateTradeNo(Constant.REDIS_TRADE_NO_KEY))
.setPaySource(dto.getPaySource())
.setPayWay(dto.getPayWay())
.setPayAmount(payAmount)
.setUnit(dto.getUnit())
.setRemark(dto.getRemark())
.setPayTime(LocalDateTime.now())
.setDealUser(getUserName(SecurityUtils.getCurrentUserLogin().get()))
.setPayUser(userAccount)
.setPayBeforeAmount(amount)
.setPayAfterAmount(balanceAmount);
//添加缴费流水信息
tPayCostFlowMapper.insert(costFlow);
//更新设备余额信息
Map<String, Object> map = new HashMap<>();
map.put("id", dto.getDeviceId());
map.put("amount", balanceAmount);
tPayCostFlowMapper.updateDeviceAmount(map);
//添加缴费流水 审核信息 默认未审核状态
TPayCostApproval approval = new TPayCostApproval();
approval.setFlowId(costFlow.getId()).setApprovalStatus("01").setVersion(0);
tPayCostApprovalMapper.insert(approval);
//操作完成 解锁
redisTemplate.opsForValue().getOperations().delete(key);
//添加操作日志
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
SysOperationLogUtils.info(i18nMessage.getMessage("pay.cost.add") + ": " + dto.getDeviceId(), LogEnum.ADD.getKey(), null, this.getClass(), "payForDevice", request);
//缴费成功 且设备余额大于0 result = true;
if (balanceAmount.compareTo(BigDecimal.ZERO) == 1) {
result = true;
}
} catch (Exception e) {
e.printStackTrace();
//操作失败 解锁
redisTemplate.opsForValue().getOperations().delete(key);
throw new BusinessException(i18nMessage.getMessage("error.pay.cost"));
}
} else {
throw new BusinessException(i18nMessage.getMessage("error.pay.lock"));
}
return result;
}
redisTemplate加锁Demo
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- iPad给照片上锁教程?告诉你iPad相册照片加锁技巧 iPad的相册跟我们初中时候用的诺基亚不一样...它没有自...
- 一、表级锁、行级锁、页级锁 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问时...
- 第一个例子是同一实例方法加锁和不加锁在多线程情况下的访问情况,代码如下: package test.caipiao...