Commit 9f4cd557 by 程裕兵

feat:pay

parent cf8251a2
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
</dependency> </dependency>
<!-- ======================= spring cloud end ======================= --> <!-- ======================= spring cloud end ======================= -->
<!-- ======================= jiejing api end ======================= --> <!-- ======================= jiejing api start ======================= -->
<dependency> <dependency>
<groupId>com.jiejing.base</groupId> <groupId>com.jiejing.base</groupId>
<artifactId>filecenter-api</artifactId> <artifactId>filecenter-api</artifactId>
...@@ -81,6 +81,11 @@ ...@@ -81,6 +81,11 @@
<artifactId>message-api</artifactId> <artifactId>message-api</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>com.jiejing.base</groupId>
<artifactId>permcenter-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- ======================= jiejing api end ======================= --> <!-- ======================= jiejing api end ======================= -->
......
...@@ -32,6 +32,10 @@ ...@@ -32,6 +32,10 @@
<artifactId>message-api</artifactId> <artifactId>message-api</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.jiejing.base</groupId>
<artifactId>permcenter-api</artifactId>
</dependency>
<dependency>
<groupId>com.jiejing.event</groupId> <groupId>com.jiejing.event</groupId>
<artifactId>scs-event</artifactId> <artifactId>scs-event</artifactId>
</dependency> </dependency>
......
...@@ -167,7 +167,7 @@ public class PayConvert { ...@@ -167,7 +167,7 @@ public class PayConvert {
.build(); .build();
} }
private static BrandCashierTransStateEnum convertTransState(PayStateEnums state) { public static BrandCashierTransStateEnum convertTransState(PayStateEnums state) {
switch (state) { switch (state) {
case SUCCESS: case SUCCESS:
return BrandCashierTransStateEnum.PAY_SUCCESS; return BrandCashierTransStateEnum.PAY_SUCCESS;
...@@ -179,6 +179,10 @@ public class PayConvert { ...@@ -179,6 +179,10 @@ public class PayConvert {
} }
} }
public static BrandCashierTransStateEnum convertTransState(String state) {
return convertTransState(PayStateEnums.getByCode(state));
}
public static StudioCashierRecord convertRefundInit(BrandMerchantRefundParams params, public static StudioCashierRecord convertRefundInit(BrandMerchantRefundParams params,
StudioCashierRecord pay, BigDecimal historyRefundActualAmount) { StudioCashierRecord pay, BigDecimal historyRefundActualAmount) {
StudioCashierRecord record = BeanUtil.map(pay, StudioCashierRecord.class); StudioCashierRecord record = BeanUtil.map(pay, StudioCashierRecord.class);
...@@ -293,6 +297,7 @@ public class PayConvert { ...@@ -293,6 +297,7 @@ public class PayConvert {
.thirdTransNo(vo.getThirdTransNo()) .thirdTransNo(vo.getThirdTransNo())
.failMsg(vo.getFailMsg()) .failMsg(vo.getFailMsg())
.finishTime(vo.getFinishTime()) .finishTime(vo.getFinishTime())
.extra(request.getExtra())
.build(); .build();
} }
} }
...@@ -13,7 +13,9 @@ import com.google.common.collect.Lists; ...@@ -13,7 +13,9 @@ 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.common.utils.collection.CollectionUtil;
import com.jiejing.common.utils.time.TimeUtil; import com.jiejing.common.utils.time.TimeUtil;
import com.jiejing.fitness.enums.auth.AuthDomainEnum;
import com.jiejing.fitness.enums.finance.BrandCashierTransStateEnum; import com.jiejing.fitness.enums.finance.BrandCashierTransStateEnum;
import com.jiejing.fitness.enums.tenant.TenantTypeEnum;
import com.jiejing.fitness.finance.repository.entity.GlobalConfig; import com.jiejing.fitness.finance.repository.entity.GlobalConfig;
import com.jiejing.fitness.finance.repository.entity.StudioCashierRecord; import com.jiejing.fitness.finance.repository.entity.StudioCashierRecord;
import com.jiejing.fitness.finance.repository.entity.PartyToMerchant; import com.jiejing.fitness.finance.repository.entity.PartyToMerchant;
...@@ -35,10 +37,12 @@ import com.jiejing.fitness.finance.service.pay.params.NativePayParams; ...@@ -35,10 +37,12 @@ import com.jiejing.fitness.finance.service.pay.params.NativePayParams;
import com.jiejing.fitness.finance.service.pay.params.StudioMerchantPayParams; import com.jiejing.fitness.finance.service.pay.params.StudioMerchantPayParams;
import com.jiejing.fitness.finance.service.rpc.MerchantRpcService; import com.jiejing.fitness.finance.service.rpc.MerchantRpcService;
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.fitness.finance.service.rpc.StudioRpcService;
import com.jiejing.fitness.finance.service.utils.DingUtil; import com.jiejing.fitness.finance.service.utils.DingUtil;
import com.jiejing.fitness.finance.service.utils.FeeUtil; import com.jiejing.fitness.finance.service.utils.FeeUtil;
import com.jiejing.fitness.finance.service.utils.MoneyUtil; import com.jiejing.fitness.finance.service.utils.MoneyUtil;
import com.jiejing.message.enums.MsgChannelEnum;
import com.jiejing.message.event.SendCommonMsgEvent; import com.jiejing.message.event.SendCommonMsgEvent;
import com.jiejing.paycenter.common.enums.common.PayChannelEnums; import com.jiejing.paycenter.common.enums.common.PayChannelEnums;
import com.jiejing.paycenter.common.enums.common.TransStateEnums; import com.jiejing.paycenter.common.enums.common.TransStateEnums;
...@@ -58,19 +62,24 @@ import com.jiejing.wechat.vo.weChat.BaseAuthInfoVO; ...@@ -58,19 +62,24 @@ import com.jiejing.wechat.vo.weChat.BaseAuthInfoVO;
import com.xiaomai.event.EventAgent; import com.xiaomai.event.EventAgent;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.Resource; import javax.annotation.Resource;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
/** /**
* @author chengyubing * @author chengyubing
...@@ -113,6 +122,15 @@ public class PayServiceImpl implements PayService { ...@@ -113,6 +122,15 @@ public class PayServiceImpl implements PayService {
@Resource @Resource
private GlobalConfigRpService globalConfigRpService; private GlobalConfigRpService globalConfigRpService;
@Resource
private TransactionTemplate transactionTemplate;
@Resource
private PermissionRpcService permissionRpcService;
@Resource(name = "financeThreadPool")
private Executor executor;
private final Map<String, DefaultAlipayClient> aliClientMap = new HashMap<>(); private final Map<String, DefaultAlipayClient> aliClientMap = new HashMap<>();
@PostConstruct @PostConstruct
...@@ -182,20 +200,37 @@ public class PayServiceImpl implements PayService { ...@@ -182,20 +200,37 @@ public class PayServiceImpl implements PayService {
if (!event.getChannelNo().equals(config.getCashier())) { if (!event.getChannelNo().equals(config.getCashier())) {
return; return;
} }
StudioCashierRecord record = studioCashierRecordRpService.getById(Long.parseLong(event.getTransNo()))
.orElse(null); Boolean result = transactionTemplate.execute(action -> {
Long id = Long.parseLong(event.getTransNo());
StudioCashierRecord record = studioCashierRecordRpService.getByIdForUpdate(id).orElse(null);
if (null == record) { if (null == record) {
return; return false;
}
BrandCashierTransStateEnum originalState = BrandCashierTransStateEnum.valueOf(record.getTransState());
BrandCashierTransStateEnum targetState = PayConvert.convertTransState(event.getPayState());
if (targetState == originalState) {
return false;
}
if (isPaying(targetState) && isPayFinished(originalState)) {
return false;
} }
StudioCashierRecord toModify = PayConvert.convertPay(record, event); StudioCashierRecord toModify = PayConvert.convertPay(record, event);
studioCashierRecordRpService.updateById(toModify); studioCashierRecordRpService.updateById(toModify);
return true;
});
if (null != result && result) {
if (PayStateEnums.SUCCESS.getCode().equals(event.getPayState())) { if (PayStateEnums.SUCCESS.getCode().equals(event.getPayState())) {
this.sendPaySuccessMessage(event); executor.execute(() -> this.sendPaySuccessMessage(event));
} }
} }
}
@Override @Override
public RefundVO merchantRefund(BrandMerchantRefundParams params) { public RefundVO merchantRefund(BrandMerchantRefundParams params) {
StudioCashierRecord pay = studioCashierRecordRpService.getById(Long.parseLong(params.getPayTransNo())) StudioCashierRecord pay = studioCashierRecordRpService.getById(Long.parseLong(params.getPayTransNo()))
...@@ -366,8 +401,49 @@ public class PayServiceImpl implements PayService { ...@@ -366,8 +401,49 @@ public class PayServiceImpl implements PayService {
return req; return req;
} }
private void sendPaySuccessMessage(PayEvent event) { private void sendPaySuccessMessage(PayEvent e) {
// EventAgent.of(SendCommonMsgEvent.class).triggerEvent(); Long studioId = e.getExtra().getLong("studioId");
String buyerName = e.getExtra().getString("buyerName");
// 有乐动收银权限的账户
Set<Long> targetIds = permissionRpcService.getUserIdByCode(AuthDomainEnum.FITNESS_ADMIN.getCode(),
TenantTypeEnum.STUDIO.buildKey(studioId), "FitXmPay", false);
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("buyerName", buyerName);
paramMap.put("amount", e.getAmount());
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(studioId);
event.setBizType("CASHIER_PAY_SUCCESS");
event.setParams(paramList);
EventAgent.of(SendCommonMsgEvent.class).triggerEvent(event);
}
private boolean isPaying(BrandCashierTransStateEnum state) {
return BrandCashierTransStateEnum.PAYING == state || BrandCashierTransStateEnum.PAY_INIT == state;
}
private boolean isPayFinished(BrandCashierTransStateEnum state) {
return isPaySuccess(state) || isPayFail(state);
}
private boolean isPayFail(BrandCashierTransStateEnum state) {
return BrandCashierTransStateEnum.PAY_FAIL == state;
}
private boolean isPaySuccess(BrandCashierTransStateEnum state) {
return BrandCashierTransStateEnum.PAY_SUCCESS == state || BrandCashierTransStateEnum.PAY_IN == state;
} }
@Data @Data
......
package com.jiejing.fitness.finance.service.rpc;
import com.jiejing.common.model.JsonResult;
import com.jiejing.permcenter.api.config.request.QueryUserIdByCodeRequest;
import com.jiejing.permcenter.api.perm.AuthorityPermApi;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author chengyubing
* @since 2024/4/17 17:20
*/
@Slf4j
@Service
public class PermissionRpcService {
@Resource
private AuthorityPermApi authorityPermApi;
/**
* 查询改作用域下具有改权限的人
*
* @param domain 作用域
* @param tenantKey key
* @param permissionCode 权限code
* @param includeSubTree 是否包含下属子权限点
*/
public Set<Long> getUserIdByCode(String domain, String tenantKey, String permissionCode,
boolean includeSubTree) {
QueryUserIdByCodeRequest request = QueryUserIdByCodeRequest.builder()
.domain(domain).tenantKey(tenantKey)
.permissionCode(permissionCode).includeSubTree(includeSubTree).build();
JsonResult<Set<Long>> result = authorityPermApi.queryUserIdByCode(request);
return Optional.ofNullable(result.getResult()).orElse(new HashSet<>(1));
}
}
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