Commit 331782f8 by 程裕兵

feat:refund

parent 1751aced
...@@ -68,4 +68,18 @@ public class RefundConvert { ...@@ -68,4 +68,18 @@ public class RefundConvert {
.build(); .build();
} }
public static BrandCashierTransStateEnum convertTransState(String refundState) {
TransStateEnums state = TransStateEnums.getByCode(refundState);
switch (state) {
case SUCCESS:
return BrandCashierTransStateEnum.REFUND_SUCCESS;
case FAIL:
return BrandCashierTransStateEnum.REFUND_FAIL;
case INIT:
case PROCESS:
return BrandCashierTransStateEnum.REFUNDING;
default:
return null;
}
}
} }
...@@ -217,14 +217,10 @@ public class PayServiceImpl implements PayService { ...@@ -217,14 +217,10 @@ public class PayServiceImpl implements PayService {
private List<Long> getUserIds(Long studioId) { private List<Long> getUserIds(Long studioId) {
// 有乐动收银查看和操作权限的账户 // 有乐动收银查看和操作权限的账户
Set<Long> seeUserIds = permissionRpcService.getUserIdByCode(AuthDomainEnum.FITNESS_ADMIN.getCode(), return permissionRpcService.getUserIdsByCodeList(AuthDomainEnum.FITNESS_ADMIN.getCode(), studioId,
TenantTypeEnum.STUDIO.buildKey(studioId), "FitSeeXmPay", false); Lists.newArrayList("FitSeeXmPay", "FitManageXmPay"), false);
Set<Long> operatorUserIds = permissionRpcService.getUserIdByCode(AuthDomainEnum.FITNESS_ADMIN.getCode(),
TenantTypeEnum.STUDIO.buildKey(studioId), "FitManageXmPay", false);
return seeUserIds.stream().filter(operatorUserIds::contains).collect(toList());
} }
private void sendPaySuccessMessage(PayEvent e) { private void sendPaySuccessMessage(PayEvent e) {
Long studioId = e.getExtra().getLong("studioId"); Long studioId = e.getExtra().getLong("studioId");
String buyerName = e.getExtra().getString("buyerName"); String buyerName = e.getExtra().getString("buyerName");
......
package com.jiejing.fitness.finance.service.pay.impl; package com.jiejing.fitness.finance.service.pay.impl;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.google.common.collect.Lists;
import com.jiejing.common.exception.BizException; import com.jiejing.common.exception.BizException;
import com.jiejing.common.utils.collection.CollectionUtil;
import com.jiejing.fitness.enums.auth.AuthDomainEnum;
import com.jiejing.fitness.enums.finance.BrandCashierTransStateEnum;
import com.jiejing.fitness.finance.repository.entity.StudioCashierRecord; import com.jiejing.fitness.finance.repository.entity.StudioCashierRecord;
import com.jiejing.fitness.finance.repository.service.StudioCashierRecordRpService; import com.jiejing.fitness.finance.repository.service.StudioCashierRecordRpService;
import com.jiejing.fitness.finance.service.enums.FinanceErrorEnums; import com.jiejing.fitness.finance.service.enums.FinanceErrorEnums;
...@@ -8,10 +13,21 @@ import com.jiejing.fitness.finance.service.pay.RefundService; ...@@ -8,10 +13,21 @@ import com.jiejing.fitness.finance.service.pay.RefundService;
import com.jiejing.fitness.finance.service.pay.convert.RefundConvert; import com.jiejing.fitness.finance.service.pay.convert.RefundConvert;
import com.jiejing.fitness.finance.service.pay.params.StudioMerchantRefundParams; import com.jiejing.fitness.finance.service.pay.params.StudioMerchantRefundParams;
import com.jiejing.fitness.finance.service.rpc.PayRpcService; import com.jiejing.fitness.finance.service.rpc.PayRpcService;
import com.jiejing.fitness.finance.service.rpc.PermissionRpcService;
import com.jiejing.fitness.finance.service.rpc.StudioRpcService;
import com.jiejing.message.enums.MsgChannelEnum;
import com.jiejing.message.event.SendCommonMsgEvent;
import com.jiejing.paycenter.api.pay.request.RefundPayRequest; import com.jiejing.paycenter.api.pay.request.RefundPayRequest;
import com.jiejing.paycenter.common.enums.common.TransStateEnums;
import com.jiejing.paycenter.common.event.RefundEvent; import com.jiejing.paycenter.common.event.RefundEvent;
import com.jiejing.paycenter.common.model.vo.RefundVO; import com.jiejing.paycenter.common.model.vo.RefundVO;
import com.xiaomai.event.EventAgent;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -34,6 +50,15 @@ public class RefundServiceImpl implements RefundService { ...@@ -34,6 +50,15 @@ public class RefundServiceImpl implements RefundService {
@Resource @Resource
private TransactionTemplate transactionTemplate; private TransactionTemplate transactionTemplate;
@Resource
private PermissionRpcService permissionRpcService;
@Resource
private StudioRpcService studioRpcService;
@Resource(name = "financeThreadPool")
private Executor executor;
@Override @Override
public RefundVO merchantRefund(StudioMerchantRefundParams params) { public RefundVO merchantRefund(StudioMerchantRefundParams params) {
StudioCashierRecord refund = transactionTemplate.execute(action -> { StudioCashierRecord refund = transactionTemplate.execute(action -> {
...@@ -65,8 +90,65 @@ public class RefundServiceImpl implements RefundService { ...@@ -65,8 +90,65 @@ public class RefundServiceImpl implements RefundService {
return; return;
} }
BrandCashierTransStateEnum originalState = BrandCashierTransStateEnum.valueOf(record.getTransState());
BrandCashierTransStateEnum targetState = RefundConvert.convertTransState(event.getRefundState());
if (targetState == originalState) {
return;
}
StudioCashierRecord toModify = RefundConvert.convertRefund(record, event); StudioCashierRecord toModify = RefundConvert.convertRefund(record, event);
studioCashierRecordRpService.updateById(toModify); studioCashierRecordRpService.updateById(toModify);
// 执行后续处理
this.doAfterRefund(event, record);
}
private void doAfterRefund(RefundEvent event, StudioCashierRecord record) {
if (!TransStateEnums.SUCCESS.getCode().equals(event.getRefundState())) {
return;
}
executor.execute(() -> this.sendRefundSuccessMessage(event, record));
}
private void sendRefundSuccessMessage(RefundEvent e, StudioCashierRecord record) {
// TODO
List<Long> targetIds = this.getAdminIds(record.getStudioId());
if (CollectionUtil.isEmpty(targetIds)) {
return;
}
List<Map<String, Object>> paramList = targetIds.stream().map(targetId -> {
Map<String, Object> paramMap = new HashMap<>(1);
paramMap.put("targetId", targetId);
paramMap.put("studioId", record.getStudioId());
paramMap.put("buyerName", record.getBuyerName());
paramMap.put("amount", record.getTransAmount());
// paramMap.put("appUrl", appUrlProperties.getTransDetail() + e.getTransNo());
return paramMap;
}).collect(Collectors.toList());
SendCommonMsgEvent event = new SendCommonMsgEvent();
event.setChannelEnums(Lists.newArrayList(MsgChannelEnum.APP_PUSH));
event.setCovertTarget(true);
event.setEventId(IdWorker.getId());
event.setSourceId(record.getStudioId());
event.setBizType("CASHIER_REFUND_SUCCESS");
event.setParams(paramList);
EventAgent.of(SendCommonMsgEvent.class).triggerEvent(event);
}
private List<Long> getAdminIds(Long studioId) {
List<Long> userIds = this.getUserIds(studioId);
if (CollectionUtil.isEmpty(userIds)) {
return Lists.newArrayList();
}
return studioRpcService.listAdminIdsByUserIds(studioId, Lists.newArrayList(userIds));
}
private List<Long> getUserIds(Long studioId) {
// 有乐动收银查看和操作权限的账户
return permissionRpcService.getUserIdsByCodeList(AuthDomainEnum.FITNESS_ADMIN.getCode(), studioId,
Lists.newArrayList("FitSeeXmPay", "FitManageXmPay"), false);
} }
} }
package com.jiejing.fitness.finance.service.rpc; package com.jiejing.fitness.finance.service.rpc;
import static java.util.stream.Collectors.toList;
import com.google.common.collect.Lists;
import com.jiejing.common.model.JsonResult; import com.jiejing.common.model.JsonResult;
import com.jiejing.fitness.enums.auth.AuthDomainEnum;
import com.jiejing.fitness.enums.tenant.TenantTypeEnum;
import com.jiejing.permcenter.api.config.request.QueryUserIdByCodeRequest; import com.jiejing.permcenter.api.config.request.QueryUserIdByCodeRequest;
import com.jiejing.permcenter.api.perm.AuthorityPermApi; import com.jiejing.permcenter.api.perm.AuthorityPermApi;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import javax.annotation.Resource; import javax.annotation.Resource;
...@@ -38,4 +45,18 @@ public class PermissionRpcService { ...@@ -38,4 +45,18 @@ public class PermissionRpcService {
return Optional.ofNullable(result.getResult()).orElse(new HashSet<>(1)); return Optional.ofNullable(result.getResult()).orElse(new HashSet<>(1));
} }
public List<Long> getUserIdsByCodeList(String domain, Long studioId, List<String> permissionCodeList,
boolean includeSubTree) {
List<Long> userIds = Lists.newArrayList();
for (int i = 0; i < permissionCodeList.size(); i++) {
Set<Long> seeUserIds = this.getUserIdByCode(domain, TenantTypeEnum.STUDIO.buildKey(studioId),
permissionCodeList.get(i), includeSubTree);
if (i == 0) {
userIds.addAll(seeUserIds);
} else {
userIds = userIds.stream().filter(seeUserIds::contains).collect(toList());
}
}
return userIds;
}
} }
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