记得上下班打卡 | git大法好,push需谨慎

Commit ffa8849e authored by 张国柄's avatar 张国柄

+会员退款;

parent 8214bcc6
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> <html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head> <head>
<th:block th:include="include :: header('【请填写功能名称】列表')" /> <th:block th:include="include :: header('会员订单列表')" />
</head> </head>
<body class="gray-bg"> <body class="gray-bg">
<div class="container-div"> <div class="container-div">
...@@ -90,17 +90,19 @@ ...@@ -90,17 +90,19 @@
var options = { var options = {
url: prefix + "/list", url: prefix + "/list",
createUrl: prefix + "/add", createUrl: prefix + "/add",
updateUrl: prefix + "/edit/{id}",
removeUrl: prefix + "/remove",
exportUrl: prefix + "/export",
detailUrl: prefix + "/detail/{id}", detailUrl: prefix + "/detail/{id}",
modalName: "【请填写功能名称】", modalName: "会员订单",
columns: [{ columns: [{
checkbox: true checkbox: true,
}, },
{ {
field: 'orderNo', field: 'orderNo',
title: '订单号' title: '订单号',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-xs" href="javascript:void(0)" onclick="$.operate.detailTab(\'' + row.orderNo + '\')">' + value + '</a>');
return actions.join('');
}
}, },
{ {
field: 'state', field: 'state',
...@@ -111,10 +113,13 @@ ...@@ -111,10 +113,13 @@
}, },
{ {
field: 'payType', field: 'payType',
title: '支付方式' title: '支付方式',
formatter: function (value) {
return '<span class="nav-label">' + value.toLocaleUpperCase() + '</span>';
}
}, },
{ {
field: 'price', field: 'pricePaid',
title: '价格(元)' title: '价格(元)'
}, },
{ {
...@@ -149,7 +154,7 @@ ...@@ -149,7 +154,7 @@
align: 'center', align: 'center',
formatter: function(value, row, index) { formatter: function(value, row, index) {
var actions = []; var actions = [];
actions.push('<a class="btn btn-warning btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="$.operate.detail(\'' + row.orderNo + '\')"><i class="fa fa-search"></i>详细</a>'); actions.push('<a class="btn btn-warning btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="$.operate.detailTab(\'' + row.orderNo + '\')"><i class="fa fa-search"></i>查看详情</a>');
return actions.join(''); return actions.join('');
} }
}] }]
......
...@@ -69,7 +69,7 @@ public class AdamMemberOrderAdminServiceImpl extends ServiceImpl<AdamMemberOrder ...@@ -69,7 +69,7 @@ public class AdamMemberOrderAdminServiceImpl extends ServiceImpl<AdamMemberOrder
@Value("${liquidnet.url-refund.apply}") @Value("${liquidnet.url-refund.apply}")
private String applyUrl; private String applyUrl;
@Value("${liquidnet.url-refund.notify}") @Value("${liquidnet.url-refund.notify-member}")
private String notifyUrl; private String notifyUrl;
@Override @Override
...@@ -118,6 +118,7 @@ public class AdamMemberOrderAdminServiceImpl extends ServiceImpl<AdamMemberOrder ...@@ -118,6 +118,7 @@ public class AdamMemberOrderAdminServiceImpl extends ServiceImpl<AdamMemberOrder
// 查取快递信息 // 查取快递信息
AdamMemberOrderExt adamMemberOrderExt = adamMemberOrderExtMapper.selectOne(Wrappers.lambdaQuery(AdamMemberOrderExt.class).eq(AdamMemberOrderExt::getOrderNo, orderNo)); AdamMemberOrderExt adamMemberOrderExt = adamMemberOrderExtMapper.selectOne(Wrappers.lambdaQuery(AdamMemberOrderExt.class).eq(AdamMemberOrderExt::getOrderNo, orderNo));
adamUserMemberVo.setState(adamUserMemberVo.isActive() ? 1 : 2);
detailAdminVo.setAdamMemberOrderVo(adamMemberOrderVo); detailAdminVo.setAdamMemberOrderVo(adamMemberOrderVo);
detailAdminVo.setAdamUserMemberVo(adamUserMemberVo); detailAdminVo.setAdamUserMemberVo(adamUserMemberVo);
detailAdminVo.setAdamUserInfoVo(adamUserInfoVo); detailAdminVo.setAdamUserInfoVo(adamUserInfoVo);
...@@ -131,10 +132,12 @@ public class AdamMemberOrderAdminServiceImpl extends ServiceImpl<AdamMemberOrder ...@@ -131,10 +132,12 @@ public class AdamMemberOrderAdminServiceImpl extends ServiceImpl<AdamMemberOrder
public AjaxResult refundProcessing(AdamMemberOrderRefundParam param, AdamMemberOrder memberOrder) { public AjaxResult refundProcessing(AdamMemberOrderRefundParam param, AdamMemberOrder memberOrder) {
LinkedMultiValueMap<String, String> linkedMultiValueMap = new LinkedMultiValueMap<>(); LinkedMultiValueMap<String, String> linkedMultiValueMap = new LinkedMultiValueMap<>();
String refundNo = IDGenerator.nextTimeId2().concat("VR");
linkedMultiValueMap.add("code", memberOrder.getPayNo()); linkedMultiValueMap.add("code", memberOrder.getPayNo());
linkedMultiValueMap.add("notifyUrl", notifyUrl); linkedMultiValueMap.add("notifyUrl", notifyUrl);
linkedMultiValueMap.add("orderCode", memberOrder.getOrderNo()); linkedMultiValueMap.add("orderCode", memberOrder.getOrderNo());
linkedMultiValueMap.add("orderRefundCode", IDGenerator.nextTimeId2()); linkedMultiValueMap.add("orderRefundCode", refundNo);
linkedMultiValueMap.add("paymentId", null); linkedMultiValueMap.add("paymentId", null);
linkedMultiValueMap.add("paymentType", (memberOrder.getDeviceFrom() + memberOrder.getPayType()).toUpperCase()); linkedMultiValueMap.add("paymentType", (memberOrder.getDeviceFrom() + memberOrder.getPayType()).toUpperCase());
linkedMultiValueMap.add("price", String.valueOf(param.getRefundAmt())); linkedMultiValueMap.add("price", String.valueOf(param.getRefundAmt()));
...@@ -153,12 +156,12 @@ public class AdamMemberOrderAdminServiceImpl extends ServiceImpl<AdamMemberOrder ...@@ -153,12 +156,12 @@ public class AdamMemberOrderAdminServiceImpl extends ServiceImpl<AdamMemberOrder
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
AdamMemberRefund memberRefund = new AdamMemberRefund(); AdamMemberRefund memberRefund = new AdamMemberRefund();
memberRefund.setRefundNo(IDGenerator.nextTimeId2().concat("VR")); memberRefund.setRefundNo(refundNo);
memberRefund.setOrderNo(memberOrder.getOrderNo()); memberRefund.setOrderNo(memberOrder.getOrderNo());
memberRefund.setRefundPrice(param.getRefundAmt()); memberRefund.setRefundPrice(param.getRefundAmt());
memberRefund.setRefundReason(param.getReason()); memberRefund.setRefundReason(param.getReason());
memberRefund.setRenewable(param.getRenewable()); memberRefund.setRenewable(param.getRenewable());
memberRefund.setRefundState(0); memberRefund.setRefundState(9);
memberRefund.setRefundNo(postResultJNode.get("refundCode").asText()); memberRefund.setRefundNo(postResultJNode.get("refundCode").asText());
memberRefund.setOperator(ShiroUtils.getLoginName()); memberRefund.setOperator(ShiroUtils.getLoginName());
memberRefund.setCreatedAt(now); memberRefund.setCreatedAt(now);
......
...@@ -75,9 +75,9 @@ public class AdamMemberRefund implements Serializable { ...@@ -75,9 +75,9 @@ public class AdamMemberRefund implements Serializable {
private LocalDateTime updatedAt; private LocalDateTime updatedAt;
/** /**
* 完成时间 * 退款时间
*/ */
private LocalDateTime completeAt; private LocalDateTime refundAt;
private String comment; private String comment;
......
...@@ -383,11 +383,11 @@ create table adam_member_refund ...@@ -383,11 +383,11 @@ create table adam_member_refund
repay_no varchar(64) comment '支付中心退款编号', repay_no varchar(64) comment '支付中心退款编号',
repay_reason varchar(200) comment '支付中心退款描述', repay_reason varchar(200) comment '支付中心退款描述',
refund_at datetime(3) comment '退款时间',
operator varchar(64) comment '操作人', operator varchar(64) comment '操作人',
created_at datetime(3) not null, created_at datetime(3) not null,
updated_at datetime(3), updated_at datetime(3),
complete_at datetime(3) comment '完成时间',
comment varchar(255) comment varchar(255)
) engine = InnoDB comment '会员退款'; ) engine = InnoDB comment '会员退款';
......
package com.liquidnet.service.platform.controller.adam;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.platform.service.impl.adam.PlatformMemberRefundService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@Api(tags = "会员退款回调处理")
@Slf4j
@RestController
@RequestMapping("amorder/callack")
public class PlatformAdamMemberOrderCallbackController {
@Autowired
private PlatformMemberRefundService platformMemberRefundService;
@ApiOperationSupport(order = 1)
@ApiOperation(value = "退款回调")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "status", value = "1-成功|0-失败", example = "1"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "orderCode", value = "会员订单号", example = "77062761607274496V"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "code", value = "支付订单号", example = "20210616153954199964032352974P"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "type", value = "购买类型", example = "VIP"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "price", value = "支付金额", example = "0.01"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "paymentType", value = "支付类型", example = "APPALIPAY"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "paymentAt", value = "支付时间", example = "2021-06-16 15:40:02"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "paymentId", value = "支付ID", example = "2021061622001468121421203878"),
})
@PostMapping("refund")
public String refund(HttpServletRequest request) {
log.debug("/amorder/callack/refund:[mapParameter:{},token:{}]", JsonUtils.toJson(request.getParameterMap()), request.getHeader("token"));
// TODO: 2021/6/13 验签
if (!platformMemberRefundService.refundProcessing(request)) {
log.warn("###会员退款回调处理失败:param:{}", JsonUtils.toJson(request.getParameterMap()));
return "fail";
}
return "success";
}
}
package com.liquidnet.service.platform.service.impl.adam;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.vo.AdamMemberOrderVo;
import com.liquidnet.service.adam.dto.vo.AdamUserMemberVo;
import com.liquidnet.service.adam.entity.AdamMemberOrder;
import com.liquidnet.service.adam.entity.AdamMemberRefund;
import com.liquidnet.service.adam.entity.AdamUserMember;
import com.liquidnet.service.adam.mapper.AdamMemberOrderMapper;
import com.liquidnet.service.adam.mapper.AdamMemberRefundMapper;
import com.liquidnet.service.adam.mapper.AdamUserMemberMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.stream.IntStream;
@Slf4j
@Service
public class PlatformMemberRefundService extends ServiceImpl<AdamMemberRefundMapper, AdamMemberRefund> {
@Autowired
private AdamMemberOrderMapper adamMemberOrderMapper;
@Autowired
private AdamUserMemberMapper adamUserMemberMapper;
@Autowired
private RedisUtil redisUtil;
public boolean refundProcessing(HttpServletRequest request) {
String refundNo = request.getParameter("orderRefundCode");
String refundAt = request.getParameter("refundAt");
String orderNo = request.getParameter("refundCode");
String refundError = request.getParameter("refundError");
String refundAmt = request.getParameter("refundPrice");
int status = Integer.parseInt(request.getParameter("status"));
AdamMemberRefund memberRefund = this.getOne(Wrappers.lambdaQuery(AdamMemberRefund.class)
.eq(AdamMemberRefund::getRefundNo, refundNo).eq(AdamMemberRefund::getOrderNo, orderNo));
if (null == memberRefund) {
log.warn("会员退款回调处理失败:订单不存在[orderNo:{},refundNo:{}]", orderNo, refundNo);
return false;
}
if (memberRefund.getRefundState() != 9) {
log.warn("会员退款回调处理失败:订单已处理[orderNo:{},refundNo:{}]", orderNo, refundNo);
return true;
}
LocalDateTime now = LocalDateTime.now();
LambdaUpdateWrapper<AdamMemberRefund> memberRefundLambdaUpdateWrapper = Wrappers.lambdaUpdate(AdamMemberRefund.class)
.eq(AdamMemberRefund::getRefundNo, refundNo).eq(AdamMemberRefund::getOrderNo, orderNo);
memberRefundLambdaUpdateWrapper.set(AdamMemberRefund::getRefundAt, refundAt);
memberRefundLambdaUpdateWrapper.set(AdamMemberRefund::getRefundReason, refundError);
memberRefundLambdaUpdateWrapper.set(AdamMemberRefund::getUpdatedAt, now);
switch (status) {
case 0:// 失败
memberRefundLambdaUpdateWrapper.set(AdamMemberRefund::getRefundState, 3);
return this.update(memberRefundLambdaUpdateWrapper);
case 1:// 成功
memberRefundLambdaUpdateWrapper.set(AdamMemberRefund::getRefundState, 1);
if (this.update(memberRefundLambdaUpdateWrapper)) {
this.refundSuccProcessing(orderNo, now);
return true;
} else {
return false;
}
default:
log.warn("会员退款回调处理失败:未知的状态[orderNo:{},refundNo:{},status:{}]", orderNo, refundNo, status);
return false;
}
}
/* -------------------------------------------------------------------------- */
private void refundSuccProcessing(String orderNo, LocalDateTime now) {
AdamMemberOrder memberOrder = adamMemberOrderMapper.selectOne(Wrappers.lambdaUpdate(AdamMemberOrder.class).eq(AdamMemberOrder::getOrderNo, orderNo));
{// 同步用户端信息
String moKey = AdamRedisConst.INFO_MEMBER_ORDER + memberOrder.getUid();
ArrayList<AdamMemberOrderVo> vos = (ArrayList<AdamMemberOrderVo>) redisUtil.get(moKey);
int idx = IntStream.range(0, vos.size()).filter(i -> vos.get(i).getOrderNo().equals(memberOrder.getOrderNo())).findFirst().orElse(-1);
AdamMemberOrderVo vo = vos.get(idx);
vo.setState(5);
vo.setUpdatedAt(now);
vos.set(idx, vo);
boolean syncVo = redisUtil.set(moKey, vos);
log.warn("###会员退款回调处理成功:更新REDIS会员订单状态{}[orderNo:{},uid:{}]", syncVo ? "成功" : "失败", orderNo, memberOrder.getUid());
String umKey = AdamRedisConst.INFO_USER_MEMBER.concat(memberOrder.getUid());
AdamUserMemberVo userMemberVo = (AdamUserMemberVo) redisUtil.get(umKey);
userMemberVo.setState(2);
userMemberVo.setUpdatedAt(now);
syncVo = redisUtil.set(umKey, userMemberVo);
log.warn("###会员退款回调处理成功:更新REDIS会员状态{}[orderNo:{},uid:{}]", syncVo ? "成功" : "失败", orderNo, memberOrder.getUid());
}
AdamUserMember updateInfoUserMember = new AdamUserMember();
updateInfoUserMember.setState(2);
updateInfoUserMember.setUpdatedAt(now);
updateInfoUserMember.setComment("R");
int updateRst = adamUserMemberMapper.update(updateInfoUserMember, Wrappers.lambdaUpdate(AdamUserMember.class).eq(AdamUserMember::getUid, memberOrder.getUid()));
log.warn("###会员退款回调处理成功:更新用户会员状态{}[orderNo:{},uid:{}]", updateRst <= 0 ? "失败" : "成功", orderNo, memberOrder.getUid());
AdamMemberOrder updateInfoMemberOrder = new AdamMemberOrder();
updateInfoMemberOrder.setMid(memberOrder.getMid());
updateInfoMemberOrder.setState(5);
updateInfoMemberOrder.setUpdatedAt(now);
updateRst = adamMemberOrderMapper.updateById(updateInfoMemberOrder);
log.warn("###会员退款回调处理成功:更新会员订单状态{}[orderNo:{}]", updateRst <= 0 ? "失败" : "成功", orderNo);
}
}
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