diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/app/controller/AppAccController.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/app/controller/AppAccController.java index 5e139c45..60c484ba 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/app/controller/AppAccController.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/app/controller/AppAccController.java @@ -4,6 +4,7 @@ package com.bonus.core.account.v3.app.controller; import com.bonus.common.core.web.controller.BaseController; import com.bonus.common.core.web.domain.AjaxResult; import com.bonus.core.account.v3.app.dto.AccRechargeForAppDTO; +import com.bonus.core.account.v3.app.dto.AppRechargeResultDTO; import com.bonus.core.account.v3.app.dto.AppTradeDetailListDTO; import com.bonus.core.account.v3.app.service.AppAccService; import com.bonus.core.account.v3.app.vo.AppAccTradePageVO; @@ -54,9 +55,9 @@ public class AppAccController extends BaseController { return AjaxResult.success(mobilePayVO); } -// @ApiOperation("充值超时重新查询充值结果") -// @PostMapping({"/recharge/overtime/query-result"}) -// public AjaxResult queryAppRechargePayOvertimeResult(@RequestBody @Valid AppRechargeResultDTO dto) { -// return AjaxResult.success(this.appAccService.queryAppRechargePayOvertimeResult(dto)); -// } + @ApiOperation("充值超时重新查询充值结果") + @PostMapping({"/recharge/overtime/query-result"}) + public AjaxResult queryAppRechargePayOvertimeResult(@RequestBody @Valid AppRechargeResultDTO dto) { + return AjaxResult.success(this.appAccService.queryAppRechargePayOvertimeResult(dto)); + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/app/service/AppAccService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/app/service/AppAccService.java index 654ba8e6..74cd1cdc 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/app/service/AppAccService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/app/service/AppAccService.java @@ -15,5 +15,5 @@ public interface AppAccService { MobilePayVO accRechargeForApp(AccRechargeForAppDTO dto); -// AppAccTradePageVO queryAppRechargePayOvertimeResult(AppRechargeResultDTO content); + AppAccTradePageVO queryAppRechargePayOvertimeResult(AppRechargeResultDTO content); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/app/service/impl/AppAccServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/app/service/impl/AppAccServiceImpl.java index dbba04a1..a9239846 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/app/service/impl/AppAccServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/app/service/impl/AppAccServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.json.JSONUtil; import com.bonus.common.core.exception.ServiceException; import com.bonus.constant.LeConstants; import com.bonus.core.account.v3.app.dto.AccRechargeForAppDTO; +import com.bonus.core.account.v3.app.dto.AppRechargeResultDTO; import com.bonus.core.account.v3.app.dto.AppTradeDetailListDTO; import com.bonus.core.account.v3.app.service.AppAccService; import com.bonus.core.account.v3.app.vo.AppAccTradePageVO; @@ -16,6 +17,8 @@ import com.bonus.core.account.v3.model.AccTrade; import com.bonus.core.account.v3.po.AccTradeAddPO; import com.bonus.core.account.v3.service.AccInfoService; import com.bonus.core.account.v3.service.AccTradeService; +import com.bonus.core.account.v3.service.AccWalletService; +import com.bonus.core.account.v3.web.dto.AccRechargeBackDTO; import com.bonus.core.account.v3.web.vo.AccInfoVO; import com.bonus.core.allocation.api.AllocMetadataApi; import com.bonus.core.common.enums.MetadataModelTypeEnum; @@ -27,6 +30,8 @@ import com.bonus.core.marketing.v2.api.MarketApi; import com.bonus.core.marketing.v2.rule.recharge.dto.RuleRechargeComputeDTO; import com.bonus.core.pay.api.PayApi; import com.bonus.core.pay.api.dto.UnifyPayDTO; +import com.bonus.core.pay.api.dto.UnifyPaySelectDTO; +import com.bonus.core.pay.api.vo.UnifyPaySelectVO; import com.bonus.core.pay.common.constants.PayChannelSelectEnum; import com.bonus.core.pay.common.constants.PayStateEnum; import com.bonus.core.pay.common.constants.TradeTypeEnum; @@ -55,6 +60,9 @@ public class AppAccServiceImpl implements AppAccService { private AccTradeService accTradeService; @Resource @Lazy + private AccWalletService accWalletService; + @Resource + @Lazy private CustInfoApi custInfoApi; @Resource @Lazy @@ -165,4 +173,14 @@ public class AppAccServiceImpl implements AppAccService { return mobilePayDTO; } + @Override + public AppAccTradePageVO queryAppRechargePayOvertimeResult(AppRechargeResultDTO content) { + UnifyPaySelectDTO paySelectDTO = new UnifyPaySelectDTO(); + paySelectDTO.setOrderRechargeId(content.getAccTradeId()); + log.info("移动端查询充值结果,调用支付查询入参_{}", JSONUtil.toJsonStr(paySelectDTO)); + UnifyPaySelectVO paySelectVO = this.payApi.paySelect(paySelectDTO); + log.info("移动端查询充值结果,调用支付查询结果_{}", JSONUtil.toJsonStr(paySelectVO)); + this.accWalletService.accRechargeResultHandlerV2(AccRechargeBackDTO.convert(content.getAccTradeId(), paySelectVO)); + return this.accTradeService.getOneTradeApp(content.getAccTradeId()); + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccTradeMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccTradeMapper.java index 134dd2df..53c86885 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccTradeMapper.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mapper/AccTradeMapper.java @@ -22,4 +22,6 @@ public interface AccTradeMapper extends BaseMapper { AccRechargeSumApiVO getAccRechargeSum(@Param("param") AccRechargeSumApiDTO accRechargeSumApiDTO); + AppAccTradePageVO getOneTradeApp(@Param("tradeId") Long tradeId); + } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mq/listener/po/AccRechargeBackPO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mq/listener/po/AccRechargeBackPO.java new file mode 100644 index 00000000..62406bbe --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/mq/listener/po/AccRechargeBackPO.java @@ -0,0 +1,53 @@ +package com.bonus.core.account.v3.mq.listener.po; + +import java.io.Serializable; + +public class AccRechargeBackPO implements Serializable { + private static final long serialVersionUID = 1L; + private Long merchantId; + private Long accTradeId; + private Long ordId; + private Integer payState; + private String tradeResult; + + public Long getMerchantId() { + return this.merchantId; + } + + public Long getAccTradeId() { + return this.accTradeId; + } + + public Long getOrdId() { + return this.ordId; + } + + public Integer getPayState() { + return this.payState; + } + + public String getTradeResult() { + return this.tradeResult; + } + + public void setMerchantId(final Long merchantId) { + this.merchantId = merchantId; + } + + public void setAccTradeId(final Long accTradeId) { + this.accTradeId = accTradeId; + } + + public void setOrdId(final Long ordId) { + this.ordId = ordId; + } + + public void setPayState(final Integer payState) { + this.payState = payState; + } + + public void setTradeResult(final String tradeResult) { + this.tradeResult = tradeResult; + } + +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccBusinessService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccBusinessService.java index 3970f233..bd027aa0 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccBusinessService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccBusinessService.java @@ -2,6 +2,7 @@ package com.bonus.core.account.v3.service; import com.bonus.core.account.v3.po.AccConsumeUpdateWalletPO; +import com.bonus.core.account.v3.web.dto.AccRechargeBackDTO; import com.bonus.core.account.v3.web.vo.AccConsumeWalletVO; @@ -9,4 +10,5 @@ public interface AccBusinessService { AccConsumeWalletVO doConsumeUpdateWalletAndAddTradeV2(AccConsumeUpdateWalletPO updateWalletPO); + void accRechargeModifyAndUpdate(AccRechargeBackDTO accRechargeBackDTO); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccTradeService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccTradeService.java index abf129c9..62e3205d 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccTradeService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccTradeService.java @@ -31,4 +31,6 @@ public interface AccTradeService extends IService { void insertAccTradeForTradeId(AccTradeAddPO addPo); AccRechargeSumApiVO getAccRechargeSum(AccRechargeSumApiDTO accRechargeSumApiDTO); + + AppAccTradePageVO getOneTradeApp(Long accTradeId); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccWalletService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccWalletService.java new file mode 100644 index 00000000..4c5aebf3 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/AccWalletService.java @@ -0,0 +1,8 @@ +package com.bonus.core.account.v3.service; + +import com.bonus.core.account.v3.web.dto.AccRechargeBackDTO; + +public interface AccWalletService { + + void accRechargeResultHandlerV2(AccRechargeBackDTO accRechargeBackDTO); +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccBusinessServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccBusinessServiceImpl.java index 30f60c05..0d461e31 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccBusinessServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccBusinessServiceImpl.java @@ -6,26 +6,42 @@ import cn.hutool.json.JSONUtil; import com.bonus.core.account.v3.constants.AccTradeStateEnum; import com.bonus.core.account.v3.constants.AccUpdateWalletOperateEnum; import com.bonus.core.account.v3.metadata.enums.AccWalletIdEnum; +import com.bonus.core.account.v3.model.AccTrade; +import com.bonus.core.account.v3.mq.send.dto.RepAccMqDTO; import com.bonus.core.account.v3.po.*; import com.bonus.core.account.v3.service.AccBusinessService; import com.bonus.core.account.v3.service.AccTradeService; import com.bonus.core.account.v3.service.AccTradeWalletDetailService; import com.bonus.core.account.v3.service.AccWalletInfoService; import com.bonus.core.account.v3.utils.AccUtils; +import com.bonus.core.account.v3.web.dto.AccRechargeBackDTO; import com.bonus.core.account.v3.web.vo.AccConsumeWalletVO; import com.bonus.core.account.v3.web.vo.AccUpdateWalletBalanceVO; +import com.bonus.core.common.utils.TenantContextHolder; +import com.bonus.core.marketing.v2.api.MarketApi; +import com.bonus.core.marketing.v2.rule.recharge.dto.RuleRechargeComputeDTO; +import com.bonus.core.marketing.v2.rule.recharge.dto.RuleRechargeResultDTO; +import com.bonus.core.marketing.v2.rule.recharge.dto.RuleRechargeWalletDTO; import com.bonus.core.pay.common.constants.PayChannelEnum; +import com.bonus.core.pay.common.constants.PayStateEnum; import com.bonus.core.pay.common.constants.PayTypeEnum; import com.bonus.utils.id.Id; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.Collections; import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; @Service public class AccBusinessServiceImpl implements AccBusinessService { @@ -39,6 +55,10 @@ public class AccBusinessServiceImpl implements AccBusinessService { @Resource @Lazy private AccTradeWalletDetailService accTradeWalletDetailService; + @Resource + @Lazy + private MarketApi marketApi; + @Override public AccConsumeWalletVO doConsumeUpdateWalletAndAddTradeV2(AccConsumeUpdateWalletPO updateWalletPo) { @@ -82,4 +102,88 @@ public class AccBusinessServiceImpl implements AccBusinessService { log.info("[账户消费]0元消费,新增记录结束"); return (new AccConsumeWalletVO()).setAccTradeId(tradeId).setAccAllBal(accWalletBalance.getAccAllBal()).setAccBalTotal(accWalletBalance.getAccBalTotal()).setWalletInfoList(accWalletBalance.getWalletInfoList()); } + + @Override + @Transactional( + rollbackFor = {Exception.class}, + propagation = Propagation.REQUIRES_NEW + ) + public void accRechargeModifyAndUpdate(AccRechargeBackDTO accRechargeBackDTO) { + log.info("[账户]支付结果->开始处理入参:{}", JSONUtil.toJsonStr(accRechargeBackDTO)); + AccTrade accTrade = (AccTrade)this.accTradeService.getById(accRechargeBackDTO.getAccTradeId()); + if (ObjectUtil.isNull(accTrade)) { + log.error("[账户]支付结果->交易记录不存在"); + } else if (PayStateEnum.isPaidState(accTrade.getPayState())) { + log.error("[账户]支付结果->记录已经被处理:{}", JSONUtil.toJsonStr(accTrade)); + } else { + AccTrade updateTrade = new AccTrade(); + updateTrade.setId(accTrade.getId()); + updateTrade.setPayState(accRechargeBackDTO.getPayState()); + if (PayStateEnum.isPaidState(accRechargeBackDTO.getPayState())) { + RuleRechargeComputeDTO ruleRechargeComputeDTO = this.packageRuleRechargeComputeDTO(accTrade); + log.info("[账户]支付结果->支付成功,调用充值计算规则入参:{}", JSONUtil.toJsonStr(ruleRechargeComputeDTO)); + RuleRechargeResultDTO ruleRechargeResultDTO = this.marketApi.ruleRechargeCompute(ruleRechargeComputeDTO); + log.info("[账户]支付结果->支付成功,调用充值计算规则结果={}", JSONUtil.toJsonStr(ruleRechargeResultDTO)); + LocalDateTime now = LocalDateTime.now(); + this.addAccTradeWalletDeatil(accTrade.getId(), accTrade.getCustId(), ruleRechargeResultDTO.getWalletDetails(), now); + AccUpdateWalletBalanceVO accWalletBalance = this.accWalletInfoService.getAccWalletBalanceByCustId(accTrade.getCustId()); + updateTrade.setTradeTime(now); + updateTrade.setTradeState(AccTradeStateEnum.TAKE_EFFECT.getKey()); + updateTrade.setActualAmount(ruleRechargeResultDTO.getActualAmount()); + updateTrade.setManageCost(ruleRechargeResultDTO.getManageCost()); + updateTrade.setWalletBalTotal(accWalletBalance.getAccBalTotal()); + updateTrade.setAccAllBal(accWalletBalance.getAccAllBal()); + updateTrade.setLeOrdNo(accRechargeBackDTO.getPayTradeId()); + updateTrade.setThirdTradeNo(accRechargeBackDTO.getThirdTradeNo()); + updateTrade.setRemark(accRechargeBackDTO.getTradeResult()); + log.info("[账户]支付结果->支付成功,更新充值记录对象开始,{}", JSONUtil.toJsonStr(updateTrade)); + this.accTradeService.updateTradeById(updateTrade); + log.info("[账户]支付结果->支付成功,更新充值记录结束"); + this.sendAccSendMq(Collections.singletonList(accTrade.getId())); + } else { + Integer tradeSate = AccTradeStateEnum.CREATE.getKey(); + if (PayStateEnum.isFailedState(accRechargeBackDTO.getPayState())) { + updateTrade.setFailReason(accRechargeBackDTO.getTradeResult()); + tradeSate = AccTradeStateEnum.CLOSE.getKey(); + } + + updateTrade.setTradeState(tradeSate); + log.info("[账户]支付结果->未成功,更新充值记录对象开始,{}", JSONUtil.toJsonStr(updateTrade)); + this.accTradeService.updateTradeById(updateTrade); + } + + } + } + + protected RuleRechargeComputeDTO packageRuleRechargeComputeDTO(AccTrade accTrade) { + return (new RuleRechargeComputeDTO()).setCustId(accTrade.getCustId()).setAmount(accTrade.getAmount()).setPayChannel(accTrade.getPayChannel()).setPayType(accTrade.getPayType()).setTradeId(accTrade.getId()).setTradeDate(LocalDate.now()); + } + + protected void addAccTradeWalletDeatil(Long tradeId, Long custId, List walletDetails, LocalDateTime tradeTime) { + log.info("[账户]支付结果->新增账户交易详情开始,{}", JSONUtil.toJsonStr(walletDetails)); + Iterator var5 = walletDetails.iterator(); + + while(var5.hasNext()) { + RuleRechargeWalletDTO walletDetail = (RuleRechargeWalletDTO)var5.next(); + AccWalletBalanceUpdatePO rechargePo = (new AccWalletBalanceUpdatePO()).setOperationType(AccUpdateWalletOperateEnum.AUGMENT_BAL).setCustId(custId).setWalletId(walletDetail.getWalletId()).setAmount(walletDetail.getAmount()); + AccUpdateWalletBalanceVO accUpdateWalletBalanceVO = this.updateAccWalletBalance(rechargePo); + AccTradeWalletPO accTradeWalletPo = AccTradeWalletPO.builder().tradeId(tradeId).custId(custId).walletId(walletDetail.getWalletId()).tradeType(walletDetail.getTradeType()).amount(walletDetail.getAmount()).walletBal(AccUtils.getWalletBal(accUpdateWalletBalanceVO.getWalletInfoList(), walletDetail.getWalletId())).frozenBalance(AccUtils.getWalletFrozenBal(accUpdateWalletBalanceVO.getWalletInfoList(), walletDetail.getWalletId())).tradeTime(tradeTime).build(); + this.accTradeWalletDetailService.insertAccTradeWalletDetail(accTradeWalletPo); + } + + log.info("[账户]支付结果->新增账户交易详情结束"); + } + public AccUpdateWalletBalanceVO updateAccWalletBalance(AccWalletBalanceUpdatePO updatePo) { + return this.accWalletInfoService.updateAccWalletBalance(updatePo); + } + + public void sendAccSendMq(List tradeIdList) { + if (CollUtil.isNotEmpty(tradeIdList)) { + List sendList = (List)tradeIdList.stream().map((item) -> { + return RepAccMqDTO.builder().tradeId(item).build(); + }).collect(Collectors.toList()); +// this.accSendMq.accTradeSendHandle(TenantContextHolder.getTenantId(), sendList); + } + + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccTradeServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccTradeServiceImpl.java index fcc9195a..b5005ad3 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccTradeServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccTradeServiceImpl.java @@ -149,4 +149,9 @@ public class AccTradeServiceImpl extends ServiceImpl i public AccRechargeSumApiVO getAccRechargeSum(AccRechargeSumApiDTO accRechargeSumApiDTO) { return ((AccTradeMapper)this.baseMapper).getAccRechargeSum(accRechargeSumApiDTO); } + + @Override + public AppAccTradePageVO getOneTradeApp(Long accTradeId) { + return ((AccTradeMapper)this.baseMapper).getOneTradeApp(accTradeId); + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccWalletServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccWalletServiceImpl.java new file mode 100644 index 00000000..dc5e4fbc --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccWalletServiceImpl.java @@ -0,0 +1,99 @@ +package com.bonus.core.account.v3.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bonus.constant.LeConstants; +import com.bonus.core.account.v3.constants.*; +import com.bonus.core.account.v3.custom.AccRechargeCustomBusiness; +import com.bonus.core.account.v3.dto.AccWalletUpdateDTO; +import com.bonus.core.account.v3.metadata.enums.AccWalletIdEnum; +import com.bonus.core.account.v3.model.AccTrade; +import com.bonus.core.account.v3.model.AccTradeWalletDetail; +import com.bonus.core.account.v3.mq.send.AccSendMq; +import com.bonus.core.account.v3.mq.send.dto.RepAccMqDTO; +import com.bonus.core.account.v3.po.AccTradeAddPO; +import com.bonus.core.account.v3.po.AccTradeWalletPO; +import com.bonus.core.account.v3.po.AccWalletBalanceUpdatePO; +import com.bonus.core.account.v3.service.*; +import com.bonus.core.account.v3.utils.AccUtils; +import com.bonus.core.account.v3.web.dto.AccRechargeBackDTO; +import com.bonus.core.account.v3.web.vo.AccInfoVO; +import com.bonus.core.account.v3.web.vo.AccUpdateWalletBalanceVO; +import com.bonus.core.account.v3.web.vo.AccWalletInfoVO; +import com.bonus.core.common.page.PageVO; +import com.bonus.core.common.redis.RedisUtil; +import com.bonus.core.common.utils.JacksonUtil; +import com.bonus.core.common.utils.LogUtil; +import com.bonus.core.common.utils.TenantContextHolder; +import com.bonus.core.customer.api.CustInfoApi; +import com.bonus.core.marketing.v2.api.MarketApi; +import com.bonus.core.marketing.v2.rule.recharge.dto.RuleRechargeComputeDTO; +import com.bonus.core.marketing.v2.rule.recharge.dto.RuleRechargeResultDTO; +import com.bonus.core.marketing.v2.rule.recharge.dto.RuleRechargeWalletDTO; +import com.bonus.core.pay.api.PayApi; +import com.bonus.core.pay.api.TradeRecordApi; +import com.bonus.core.pay.api.dto.UnifyPaySelectDTO; +import com.bonus.core.pay.api.dto.UnifyRefundDTO; +import com.bonus.core.pay.api.vo.UnifyPaySelectVO; +import com.bonus.core.pay.common.constants.PayChannelEnum; +import com.bonus.core.pay.common.constants.PayStateEnum; +import com.bonus.core.pay.common.constants.PayTypeEnum; +import com.bonus.core.pay.common.constants.TradeTypeEnum; +import com.bonus.core.pay.common.model.TradeOrderRecharge; +import com.bonus.i18n.I18n; +import com.bonus.utils.LeBeanUtil; +import com.bonus.utils.id.Id; +import com.github.pagehelper.page.PageMethod; +import com.google.common.collect.Lists; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.lang.invoke.SerializedLambda; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +@Service +public class AccWalletServiceImpl implements AccWalletService { + private static final Logger log = LoggerFactory.getLogger(AccWalletServiceImpl.class); + @Autowired + @Lazy + private AccBusinessService accBusinessService; + + + @Override + public void accRechargeResultHandlerV2(AccRechargeBackDTO accRechargeBackDTO) { + log.info("账户收到支付结果>入参:{}", JSONUtil.toJsonStr(accRechargeBackDTO)); + if (!AccUtils.getAccTradeLockByTradeId(accRechargeBackDTO.getAccTradeId())) { + log.info("账户收到支付结果,已经有任务在执行{}", JSONUtil.toJsonStr(accRechargeBackDTO)); + } else { + try { + this.accBusinessService.accRechargeModifyAndUpdate(accRechargeBackDTO); + } catch (Exception var6) { + log.error("[账户收到支付结果]系统错误", var6); + } finally { + AccUtils.accTradeUnLockByTradeId(accRechargeBackDTO.getAccTradeId()); + } + + } + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/utils/AccUtils.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/utils/AccUtils.java index 20451ce1..493d311c 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/utils/AccUtils.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/utils/AccUtils.java @@ -104,6 +104,19 @@ public class AccUtils { } } + public static boolean getAccTradeLockByTradeId(Long tradeId) { + Long tenantId = TenantContextHolder.getTenantId(); + if (ObjectUtil.isNull(tenantId)) { + return false; + } else { + String lockKey = + "yst:merchant-id:user-id:acc:upgrade:lock".replace("merchant-id", tenantId.toString()).replace("user-id", tradeId.toString()); + return RedisUtil.tryLock(lockKey, 0, 600); + } +// String lockKey = "yst:merchant-id:user-id:acc:upgrade:lock".replace("merchant-id", TenantContextHolder.getTenantId().toString()).replace("user-id", tradeId.toString()); +// return RedisUtil.tryLock(lockKey, 0, 600); + } + public static void unlockAccWalletBalanceUpdate(Long custId) { String lockKey = "yst:merchant-id:user-id:acc:wallet:upgrade:lock".replace("merchant-id", TenantContextHolder.getTenantId().toString()).replace("user-id", String.valueOf(custId)); accSafeUnLock(lockKey); @@ -244,4 +257,9 @@ public class AccUtils { return accOrdBasicsVO; } + public static void accTradeUnLockByTradeId(Long tradeId) { + String lockKey = "yst:merchant-id:user-id:acc:upgrade:lock".replace("merchant-id", TenantContextHolder.getTenantId().toString()).replace("user-id", tradeId.toString()); + accSafeUnLock(lockKey); + } + } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/web/dto/AccRechargeBackDTO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/web/dto/AccRechargeBackDTO.java new file mode 100644 index 00000000..ce9de1ca --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/web/dto/AccRechargeBackDTO.java @@ -0,0 +1,73 @@ +package com.bonus.core.account.v3.web.dto; + + +import com.bonus.core.account.v3.mq.listener.po.AccRechargeBackPO; +import com.bonus.core.pay.api.vo.UnifyPaySelectVO; +import com.bonus.core.pay.common.vo.AndroidPayVO; + +public class AccRechargeBackDTO { + private Long accTradeId; + private Long payTradeId; + private Integer payState; + private String tradeResult; + private String thirdTradeNo; + + public static AccRechargeBackDTO convert(AccRechargeBackPO accRechargeBack) { + return (new AccRechargeBackDTO()).setAccTradeId(accRechargeBack.getAccTradeId()).setPayTradeId(accRechargeBack.getOrdId()).setPayState(accRechargeBack.getPayState()).setTradeResult(accRechargeBack.getTradeResult()); + } + + public static AccRechargeBackDTO convert(Long accTradeId, AndroidPayVO androidPayVO) { + return (new AccRechargeBackDTO()).setAccTradeId(accTradeId).setPayTradeId(androidPayVO.getTradeId()).setPayState(androidPayVO.getCode()).setTradeResult(androidPayVO.getMsg()).setThirdTradeNo(androidPayVO.getOutTradeNo()); + } + + public static AccRechargeBackDTO convert(Long accTradeId, UnifyPaySelectVO paySelectVO) { + return (new AccRechargeBackDTO()).setAccTradeId(accTradeId).setPayTradeId(paySelectVO.getTradeId()) + .setPayState(paySelectVO.getCode()).setTradeResult(paySelectVO.getMsg()).setThirdTradeNo(paySelectVO.getOutTradeNo()); + } + + public Long getAccTradeId() { + return this.accTradeId; + } + + public Long getPayTradeId() { + return this.payTradeId; + } + + public Integer getPayState() { + return this.payState; + } + + public String getTradeResult() { + return this.tradeResult; + } + + public String getThirdTradeNo() { + return this.thirdTradeNo; + } + + public AccRechargeBackDTO setAccTradeId(final Long accTradeId) { + this.accTradeId = accTradeId; + return this; + } + + public AccRechargeBackDTO setPayTradeId(final Long payTradeId) { + this.payTradeId = payTradeId; + return this; + } + + public AccRechargeBackDTO setPayState(final Integer payState) { + this.payState = payState; + return this; + } + + public AccRechargeBackDTO setTradeResult(final String tradeResult) { + this.tradeResult = tradeResult; + return this; + } + + public AccRechargeBackDTO setThirdTradeNo(final String thirdTradeNo) { + this.thirdTradeNo = thirdTradeNo; + return this; + } + +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/api/GlobalMetadataApi.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/api/GlobalMetadataApi.java index b17718e0..b344f779 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/api/GlobalMetadataApi.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/api/GlobalMetadataApi.java @@ -120,11 +120,6 @@ public class GlobalMetadataApi { return MetadataUtil.transferToPayModel(metadataList, t); } - public T getAvailableModel(MetadataModelTypeEnum modelTypeEnum, T t, Long canteenId, Long stallId) { - List metadataList = this.getAvailableList(modelTypeEnum, canteenId, stallId); - return MetadataUtil.transferToPayModel(metadataList, t); - } - public void saveValue(MetadataModelTypeEnum modelTypeEnum, String modelKey, String modelValue, Long canteenId, Long stallId) { AllocMetadata allocMetadata = new AllocMetadata(); allocMetadata.setModelType(modelTypeEnum.getKey()); diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/holiday/service/MktHolidayService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/holiday/service/MktHolidayService.java index bc334257..e285ecf4 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/holiday/service/MktHolidayService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/holiday/service/MktHolidayService.java @@ -1,6 +1,8 @@ package com.bonus.core.allocation.holiday.service; +import com.bonus.core.allocation.holiday.model.MktHoliday; + import java.time.LocalDate; import java.util.Date; import java.util.List; @@ -11,4 +13,6 @@ public interface MktHolidayService { List getHolidayList(Integer year); Integer getHolidayType(LocalDate searchDate); + + List listHolidayByDate(LocalDate searchDate); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/holiday/service/impl/MktHolidayServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/holiday/service/impl/MktHolidayServiceImpl.java index 1f3a550e..3e2f4fcf 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/holiday/service/impl/MktHolidayServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/allocation/holiday/service/impl/MktHolidayServiceImpl.java @@ -76,4 +76,10 @@ public class MktHolidayServiceImpl extends ServiceImpl listHolidayByDate(LocalDate searchDate) { + return this.list(Wrappers.lambdaQuery().eq(MktHoliday::getIfDel, + LeConstants.COMMON_NO).eq(MktHoliday::getHolDate, searchDate.atStartOfDay())); + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/api/PayApi.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/api/PayApi.java index 2f0859c3..03023a16 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/api/PayApi.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/api/PayApi.java @@ -1,5 +1,7 @@ package com.bonus.core.pay.api; import com.bonus.core.pay.api.dto.UnifyPayDTO; +import com.bonus.core.pay.api.dto.UnifyPaySelectDTO; +import com.bonus.core.pay.api.vo.UnifyPaySelectVO; import com.bonus.core.pay.api.vo.UnifyPayVO; import com.bonus.core.pay.common.business.ChannelBusiness; import com.bonus.core.pay.common.business.PayBusiness; @@ -31,4 +33,8 @@ public class PayApi { public UnifyPayVO pay(UnifyPayDTO payDTO) { return this.payBusiness.unifyPay(payDTO); } + + public UnifyPaySelectVO paySelect(UnifyPaySelectDTO paySelectDTO) { + return this.payBusiness.unifyPaySelect(paySelectDTO); + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/api/vo/UnifyPaySelectVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/api/vo/UnifyPaySelectVO.java new file mode 100644 index 00000000..a34c4cba --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/api/vo/UnifyPaySelectVO.java @@ -0,0 +1,118 @@ +package com.bonus.core.pay.api.vo; + +import cn.hutool.core.bean.BeanUtil; +import com.bonus.core.pay.common.constants.PayStateEnum; +import com.bonus.core.pay.common.model.TradeRecord; + +import java.math.BigDecimal; + +public class UnifyPaySelectVO { + private Integer code; + private String msg; + private Long tradeId; + private String outTradeNo; + private BigDecimal amount; + private BigDecimal realAmount; + private Integer payType; + private Integer payChannel; + private Long custId; + + public static UnifyPaySelectVO of(TradeRecord tradeRecord) { + UnifyPaySelectVO androidPayVO = (UnifyPaySelectVO)BeanUtil.copyProperties(tradeRecord, UnifyPaySelectVO.class, new String[0]); + androidPayVO.setTradeId(tradeRecord.getId()); + androidPayVO.setCode(tradeRecord.getTradeState()); + androidPayVO.setMsg(tradeRecord.getTradeResult()); + androidPayVO.setTradeId(tradeRecord.getId()); + androidPayVO.setRealAmount(PayStateEnum.isPaidState(tradeRecord.getTradeState()) ? tradeRecord.getAmount() : BigDecimal.ZERO); + return androidPayVO; + } + + public static UnifyPaySelectVO of(UnifyPayVO unifyPayVO) { + return (UnifyPaySelectVO)BeanUtil.copyProperties(unifyPayVO, UnifyPaySelectVO.class, new String[0]); + } + + public static UnifyPaySelectVO of(Integer code, String msg) { + return (new UnifyPaySelectVO()).setCode(code).setMsg(msg); + } + + public Integer getCode() { + return this.code; + } + + public String getMsg() { + return this.msg; + } + + public Long getTradeId() { + return this.tradeId; + } + + public String getOutTradeNo() { + return this.outTradeNo; + } + + public BigDecimal getAmount() { + return this.amount; + } + + public BigDecimal getRealAmount() { + return this.realAmount; + } + + public Integer getPayType() { + return this.payType; + } + + public Integer getPayChannel() { + return this.payChannel; + } + + public Long getCustId() { + return this.custId; + } + + public UnifyPaySelectVO setCode(final Integer code) { + this.code = code; + return this; + } + + public UnifyPaySelectVO setMsg(final String msg) { + this.msg = msg; + return this; + } + + public UnifyPaySelectVO setTradeId(final Long tradeId) { + this.tradeId = tradeId; + return this; + } + + public UnifyPaySelectVO setOutTradeNo(final String outTradeNo) { + this.outTradeNo = outTradeNo; + return this; + } + + public UnifyPaySelectVO setAmount(final BigDecimal amount) { + this.amount = amount; + return this; + } + + public UnifyPaySelectVO setRealAmount(final BigDecimal realAmount) { + this.realAmount = realAmount; + return this; + } + + public UnifyPaySelectVO setPayType(final Integer payType) { + this.payType = payType; + return this; + } + + public UnifyPaySelectVO setPayChannel(final Integer payChannel) { + this.payChannel = payChannel; + return this; + } + + public UnifyPaySelectVO setCustId(final Long custId) { + this.custId = custId; + return this; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/business/PayBusiness.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/business/PayBusiness.java index ed4836fc..6a47b241 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/business/PayBusiness.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/business/PayBusiness.java @@ -2,27 +2,33 @@ package com.bonus.core.pay.common.business; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ObjectUtil; import com.bonus.constant.LeConstants; import com.bonus.core.account.v3.api.AccBusinessApi; import com.bonus.core.account.v3.constants.AccExceptionRecordStatusEnum; import com.bonus.core.account.v3.web.dto.AccAddExceptionRecordDTO; import com.bonus.core.account.v3.web.dto.AccUpdateExceptionRecordDTO; +import com.bonus.core.common.utils.JacksonUtil; import com.bonus.core.common.utils.LogUtil; import com.bonus.core.customer.api.CustInfoApi; +import com.bonus.core.order.mq.constants.OrderMQConstants; import com.bonus.core.order.utils.LeNumUtil; import com.bonus.core.pay.api.dto.UnifyPayDTO; import com.bonus.core.pay.api.dto.UnifyPaySelectDTO; +import com.bonus.core.pay.api.vo.UnifyPaySelectVO; import com.bonus.core.pay.api.vo.UnifyPayVO; import com.bonus.core.pay.common.constants.PayCacheConstants; import com.bonus.core.pay.common.constants.PayStateEnum; import com.bonus.core.pay.common.dto.ChannelPayDTO; import com.bonus.core.pay.common.dto.MixPayResultDTO; import com.bonus.core.pay.common.dto.PayChannelSplitDTO; +import com.bonus.core.pay.common.dto.PaySelectDTO; import com.bonus.core.pay.common.model.TradeChannel; import com.bonus.core.pay.common.model.TradeRecord; import com.bonus.core.pay.common.service.*; import com.bonus.core.pay.common.vo.*; import com.bonus.core.pay.custom.PayCustomBusiness; +import com.bonus.i18n.I18n; import com.bonus.utils.id.Id; import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; @@ -62,6 +68,11 @@ public class PayBusiness { @Lazy @Resource protected TradeChannelService tradeChannelService; + @Resource + @Lazy + protected CustInfoApi custInfoApi; + + @Transactional( propagation = Propagation.NOT_SUPPORTED ) @@ -493,4 +504,140 @@ public class PayBusiness { } } } + + @Transactional( + propagation = Propagation.NOT_SUPPORTED + ) + public UnifyPaySelectVO unifyPaySelect(UnifyPaySelectDTO unifyPaySelectDTO) { + LogUtil.info("[支付查询]入参", unifyPaySelectDTO); + this.payCustomBusiness.willPaySelectV2(unifyPaySelectDTO); + TradeRecord tradeRecord = unifyPaySelectDTO.getTradeId() != null ? this.tradeRecordService + .getTradeRecordById(unifyPaySelectDTO.getTradeId()) : this.tradeRecordService.getTradeRecordByOrderRechargeId(unifyPaySelectDTO.getOrderRechargeId()); + if (ObjectUtil.isNull(tradeRecord)) { + log.info("[查询支付结果]交易记录不存在,orderRechargeId:{}", unifyPaySelectDTO.getOrderRechargeId()); + return UnifyPaySelectVO.of(PayStateEnum.PAY_FAIL.getKey(), I18n.getMessage("pay.trade-not-exist", new Object[0])); + } else { + UnifyPaySelectVO unifyPaySelectVO; + if (!PayCacheConstants.lockTrade(tradeRecord.getId())) { + log.warn("[支付查询]交易锁定失败"); + unifyPaySelectVO = UnifyPaySelectVO.of(PayStateEnum.PAY_INPROCESS.getKey(), PayStateEnum.PAY_INPROCESS.getDesc()); + unifyPaySelectVO.setTradeId(tradeRecord.getId()); + return unifyPaySelectVO; + } else { + try { + if (!PayStateEnum.isPaidState(tradeRecord.getTradeState()) && (unifyPaySelectDTO.isFromAutoQuery() || !tradeRecord.getCreateTime().plusSeconds((long) OrderMQConstants.PAY_QUERY_MAX_SECOND).isAfter(LocalDateTime.now()))) { + UnifyPayVO payVO = this.selectAndStartPayFlow(tradeRecord); + LogUtil.info("[支付查询]支付结果", payVO); + UnifyPaySelectVO var4; + if (PayStateEnum.isPayingState(payVO.getCode())) { + var4 = UnifyPaySelectVO.of(payVO); + return var4; + } + + this.tradeRecordService.updateTradeRecordState(tradeRecord.getId(), payVO); + if (unifyPaySelectDTO.isSendNoticeMQ()) { + this.payTradeService.sendResultMq(tradeRecord.getId()); + } + + var4 = this.payCustomBusiness.didPaySelectV2(unifyPaySelectDTO, UnifyPaySelectVO.of(payVO)); + return var4; + } + + if (unifyPaySelectDTO.isSendNoticeMQ()) { + this.payTradeService.sendResultMq(tradeRecord.getId()); + } + + unifyPaySelectVO = this.payCustomBusiness.didPaySelectV2(unifyPaySelectDTO, UnifyPaySelectVO.of(tradeRecord)); + } finally { + PayCacheConstants.unlockTrade(tradeRecord.getId()); + } + + return unifyPaySelectVO; + } + } + } + + protected UnifyPayVO selectAndStartPayFlow(TradeRecord tradeRecord) { + List tradeChannels = this.tradeChannelService.listChannelDetailByTradeId(tradeRecord.getId()); + UnifyPayDTO unifyPayDTO = UnifyPayDTO.of(tradeRecord); + TradeChannelVO lastTradeChannelVO = (TradeChannelVO)CollUtil.getLast(tradeChannels); + if (lastTradeChannelVO != null && PayStateEnum.isPayingState(lastTradeChannelVO.getTradeState())) { + PaySelectDTO paySelectDTO = new PaySelectDTO(); + this.fillPaySelectDTO(paySelectDTO, unifyPayDTO); + AndroidPayVO androidPayVO = this.channelPaySelect(lastTradeChannelVO, paySelectDTO); + if (PayStateEnum.isPayingState(androidPayVO.getCode())) { + return UnifyPayVO.of(tradeRecord, tradeChannels); + } + + lastTradeChannelVO.setTradeState(androidPayVO.getCode()); + lastTradeChannelVO.setTradeResult(androidPayVO.getMsg()); + if (LeNumUtil.isValidId(androidPayVO.getCustId()) && !LeNumUtil.isValidId(unifyPayDTO.getCustId())) { + unifyPayDTO.fillCustInfo(this.custInfoApi.getCustInfoByCustId(androidPayVO.getCustId())); + } + + unifyPayDTO.fillCustInfoIfNecessary(androidPayVO); + } + + tradeChannels = this.tradeChannelService.listChannelDetailByTradeId(tradeRecord.getId()); + return this.startPayFlow(unifyPayDTO, tradeChannels); + } + + protected void fillPaySelectDTO(PaySelectDTO paySelectDTO, UnifyPayDTO unifyPayDTO) { + paySelectDTO.setCanteenId(unifyPayDTO.getCanteenId()); + paySelectDTO.setMachineSn(unifyPayDTO.getMachineSn()); + paySelectDTO.setCouponId(unifyPayDTO.getCouponId()); + paySelectDTO.setPayType(unifyPayDTO.getPayType()); + paySelectDTO.setOrderRechargeId(CollUtil.isNotEmpty(unifyPayDTO.getOrderList()) ? ((UnifyPayDTO.Order)unifyPayDTO.getOrderList().get(0)).getOrderId() : null); + paySelectDTO.setMacOrderId(unifyPayDTO.getMacOrderId()); + } + + protected AndroidPayVO channelPaySelect(TradeChannelVO tradeChannel, PaySelectDTO paySelectDTO) { + paySelectDTO.setPayType(tradeChannel.getPayType()); + paySelectDTO.setTradeChannelId(tradeChannel.getTradeChannelId()); + paySelectDTO.setTradeTime(tradeChannel.getTradeTime()); + paySelectDTO.setAmount(tradeChannel.getAmount()); + paySelectDTO.setOutTradeNo(tradeChannel.getOutTradeNo()); + AndroidPayVO androidPayVO = new AndroidPayVO(); + + try { + PayService payService = this.channelBusiness.beanOfChannel(tradeChannel.getPayChannel()); + androidPayVO = payService.paySelect(paySelectDTO); + } catch (Exception var5) { + log.error("[支付查询]异常", var5); + androidPayVO.setCode(PayStateEnum.PAY_INPROCESS.getKey()); + androidPayVO.setMsg(PayStateEnum.PAY_INPROCESS.getDesc()); + } + + log.info("[支付查询]返回结果:{}", JacksonUtil.writeValueAsStringIgnoreNull(androidPayVO)); + this.fillVoFields(androidPayVO, tradeChannel); + if (PayStateEnum.PAY_INPROCESS.getKey().equals(androidPayVO.getCode())) { + return androidPayVO; + } else { + this.tradeChannelService.updateTradeRecordChannelState(androidPayVO.getTradeChannelId(), androidPayVO.getCode(), androidPayVO.getMsg(), androidPayVO.getOutTradeNo(), androidPayVO.getRealAmount(), (JsonNode)null, (LocalDateTime)null); + return androidPayVO; + } + } + + protected void fillVoFields(AndroidPayVO payVO, TradeChannelVO channelVO) { + payVO.setTradeId(channelVO.getTradeChannelId()); + payVO.setTradeChannelId(channelVO.getTradeChannelId()); + payVO.setAmount(channelVO.getAmount()); + if (payVO.getRealAmount() == null && PayStateEnum.isPaidState(payVO.getCode())) { + payVO.setRealAmount(payVO.getAmount()); + } + + if (payVO.getUnpaidBalance() == null) { + payVO.setUnpaidBalance(BigDecimal.ZERO); + } + + if (payVO.getPayChannel() == null) { + payVO.setPayChannel(channelVO.getPayChannel()); + } + + if (payVO.getPayType() == null) { + payVO.setPayType(channelVO.getPayType()); + } + + } + } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/dto/PaySelectDTO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/dto/PaySelectDTO.java new file mode 100644 index 00000000..76da5c4b --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/dto/PaySelectDTO.java @@ -0,0 +1,123 @@ +package com.bonus.core.pay.common.dto; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +public class PaySelectDTO { + /** @deprecated */ + @Deprecated + private Long tradeId; + private Long tradeChannelId; + private String outTradeNo; + private Long orderRechargeId; + private String macOrderId; + private Long canteenId; + private String machineSn; + private String couponId; + private Integer payType; + private LocalDateTime tradeTime; + private BigDecimal amount; + + /** @deprecated */ + @Deprecated + public Long getTradeId() { + return this.tradeChannelId; + } + + public Long getTradeChannelId() { + return this.tradeChannelId; + } + + public String getOutTradeNo() { + return this.outTradeNo; + } + + public Long getOrderRechargeId() { + return this.orderRechargeId; + } + + public String getMacOrderId() { + return this.macOrderId; + } + + public Long getCanteenId() { + return this.canteenId; + } + + public String getMachineSn() { + return this.machineSn; + } + + public String getCouponId() { + return this.couponId; + } + + public Integer getPayType() { + return this.payType; + } + + public LocalDateTime getTradeTime() { + return this.tradeTime; + } + + public BigDecimal getAmount() { + return this.amount; + } + + /** @deprecated */ + @Deprecated + public PaySelectDTO setTradeId(final Long tradeId) { + this.tradeId = tradeId; + return this; + } + + public PaySelectDTO setTradeChannelId(final Long tradeChannelId) { + this.tradeChannelId = tradeChannelId; + return this; + } + + public PaySelectDTO setOutTradeNo(final String outTradeNo) { + this.outTradeNo = outTradeNo; + return this; + } + + public PaySelectDTO setOrderRechargeId(final Long orderRechargeId) { + this.orderRechargeId = orderRechargeId; + return this; + } + + public PaySelectDTO setMacOrderId(final String macOrderId) { + this.macOrderId = macOrderId; + return this; + } + + public PaySelectDTO setCanteenId(final Long canteenId) { + this.canteenId = canteenId; + return this; + } + + public PaySelectDTO setMachineSn(final String machineSn) { + this.machineSn = machineSn; + return this; + } + + public PaySelectDTO setCouponId(final String couponId) { + this.couponId = couponId; + return this; + } + + public PaySelectDTO setPayType(final Integer payType) { + this.payType = payType; + return this; + } + + public PaySelectDTO setTradeTime(final LocalDateTime tradeTime) { + this.tradeTime = tradeTime; + return this; + } + + public PaySelectDTO setAmount(final BigDecimal amount) { + this.amount = amount; + return this; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/mapper/TradeRecordMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/mapper/TradeRecordMapper.java index 9160708a..95bf67cc 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/mapper/TradeRecordMapper.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/mapper/TradeRecordMapper.java @@ -4,8 +4,14 @@ import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bonus.core.pay.common.model.TradeRecord; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; +import java.util.List; @Mapper @InterceptorIgnore public interface TradeRecordMapper extends BaseMapper { + + List listTradeRecordByOrderRechargeId(@Param("orderRechargeId") Long orderRechargeId, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("tradeState") Integer... tradeState); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/po/PayResultPO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/po/PayResultPO.java new file mode 100644 index 00000000..2452d948 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/po/PayResultPO.java @@ -0,0 +1,138 @@ +package com.bonus.core.pay.common.po; + +import com.bonus.core.common.utils.LogUtil; +import com.bonus.core.common.utils.TenantContextHolder; +import com.bonus.core.pay.api.vo.UnifyPayVO; +import com.bonus.core.pay.common.constants.PayStateEnum; +import com.bonus.core.pay.common.model.TradeRecord; +import com.bonus.framework.config.deserializer.DateTimeDeserializer; +import com.bonus.framework.config.serializer.DateTimeSerializer; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.time.LocalDateTime; + +public class PayResultPO { + private Long tradeId; + private String traceId; + private Long merchantId; + private String outTradeNo; + private Integer tradeType; + private Integer tradeState; + private String tradeResult; + private Integer payChannel; + @JsonSerialize( + using = DateTimeSerializer.YYYY_MM_DD_HH_MM_SS.class + ) + @JsonDeserialize( + using = DateTimeDeserializer.class + ) + private LocalDateTime payTime; + + public static PayResultPO of(TradeRecord tradeRecord) { + PayResultPO payResultPO = new PayResultPO(); + payResultPO.setTradeId(tradeRecord.getId()); + payResultPO.setOutTradeNo(tradeRecord.getOutTradeNo()); + payResultPO.setTradeState(tradeRecord.getTradeState()); + payResultPO.setPayChannel(tradeRecord.getPayChannel()); + payResultPO.setMerchantId(TenantContextHolder.getTenantId()); + payResultPO.setTradeType(tradeRecord.getTradeType()); + payResultPO.setTradeResult(tradeRecord.getTradeResult()); + if (PayStateEnum.isPaidState(tradeRecord.getTradeState())) { + payResultPO.setPayTime(tradeRecord.getTradeTime()); + } + + payResultPO.setTraceId(LogUtil.getCurrentTraceId()); + return payResultPO; + } + + public static PayResultPO of(UnifyPayVO unifyPayVO) { + PayResultPO payResultPO = new PayResultPO(); + payResultPO.setTradeId(unifyPayVO.getTradeId()); + payResultPO.setOutTradeNo(unifyPayVO.getOutTradeNo()); + payResultPO.setTradeState(unifyPayVO.getCode()); + payResultPO.setPayChannel(unifyPayVO.getPayChannel()); + payResultPO.setMerchantId(TenantContextHolder.getTenantId()); + payResultPO.setTradeType(unifyPayVO.getTradeType()); + payResultPO.setTradeResult(unifyPayVO.getMsg()); + payResultPO.setPayTime(unifyPayVO.getPayTime()); + payResultPO.setTraceId(LogUtil.getCurrentTraceId()); + return payResultPO; + } + + public Long getTradeId() { + return this.tradeId; + } + + public String getTraceId() { + return this.traceId; + } + + public Long getMerchantId() { + return this.merchantId; + } + + public String getOutTradeNo() { + return this.outTradeNo; + } + + public Integer getTradeType() { + return this.tradeType; + } + + public Integer getTradeState() { + return this.tradeState; + } + + public String getTradeResult() { + return this.tradeResult; + } + + public Integer getPayChannel() { + return this.payChannel; + } + + public LocalDateTime getPayTime() { + return this.payTime; + } + + public void setTradeId(final Long tradeId) { + this.tradeId = tradeId; + } + + public void setTraceId(final String traceId) { + this.traceId = traceId; + } + + public void setMerchantId(final Long merchantId) { + this.merchantId = merchantId; + } + + public void setOutTradeNo(final String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public void setTradeType(final Integer tradeType) { + this.tradeType = tradeType; + } + + public void setTradeState(final Integer tradeState) { + this.tradeState = tradeState; + } + + public void setTradeResult(final String tradeResult) { + this.tradeResult = tradeResult; + } + + public void setPayChannel(final Integer payChannel) { + this.payChannel = payChannel; + } + + @JsonDeserialize( + using = DateTimeDeserializer.class + ) + public void setPayTime(final LocalDateTime payTime) { + this.payTime = payTime; + } + +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/po/RefundResultPO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/po/RefundResultPO.java new file mode 100644 index 00000000..57935ae1 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/po/RefundResultPO.java @@ -0,0 +1,142 @@ +package com.bonus.core.pay.common.po; + +import com.bonus.core.common.utils.TenantContextHolder; +import com.bonus.core.pay.common.constants.PayStateEnum; +import com.bonus.core.pay.common.model.TradeRecord; +import com.bonus.core.pay.common.vo.TradeChannelVO; +import com.bonus.framework.config.deserializer.DateTimeDeserializer; +import com.bonus.framework.config.serializer.DateTimeSerializer; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; + +public class RefundResultPO { + private Long refundTradeId; + private String traceId; + private Long merchantId; + private String outTradeNo; + private Integer payState; + private Integer payChannel; + private Integer tradeType; + private BigDecimal amount; + @JsonSerialize( + using = DateTimeSerializer.YYYY_MM_DD_HH_MM_SS.class + ) + @JsonDeserialize( + using = DateTimeDeserializer.class + ) + private LocalDateTime tradeTime; + private List detailList; + + public static RefundResultPO of(TradeRecord tradeRecord, List tradeChannels) { + RefundResultPO payResultPO = new RefundResultPO(); + if (tradeRecord == null) { + payResultPO.setPayState(PayStateEnum.PAY_FAIL.getKey()); + return payResultPO; + } else { + payResultPO.setRefundTradeId(tradeRecord.getId()); + payResultPO.setOutTradeNo(tradeRecord.getOutTradeNo()); + payResultPO.setPayState(tradeRecord.getTradeState()); + payResultPO.setPayChannel(tradeRecord.getPayChannel()); + payResultPO.setAmount(tradeRecord.getAmount()); + payResultPO.setMerchantId(TenantContextHolder.getTenantId()); + payResultPO.setTradeType(tradeRecord.getTradeType()); + payResultPO.setTradeTime(tradeRecord.getCreateTime()); + payResultPO.setDetailList(tradeChannels); + return payResultPO; + } + } + + public BigDecimal calcRealAmount() { + return PayStateEnum.isPaidState(this.payState) ? (BigDecimal)this.detailList.stream().filter((s) -> { + return PayStateEnum.isPaySuccessState(s.getTradeState()); + }).map(TradeChannelVO::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add) : BigDecimal.ZERO; + } + + public Long getRefundTradeId() { + return this.refundTradeId; + } + + public String getTraceId() { + return this.traceId; + } + + public Long getMerchantId() { + return this.merchantId; + } + + public String getOutTradeNo() { + return this.outTradeNo; + } + + public Integer getPayState() { + return this.payState; + } + + public Integer getPayChannel() { + return this.payChannel; + } + + public Integer getTradeType() { + return this.tradeType; + } + + public BigDecimal getAmount() { + return this.amount; + } + + public LocalDateTime getTradeTime() { + return this.tradeTime; + } + + public List getDetailList() { + return this.detailList; + } + + public void setRefundTradeId(final Long refundTradeId) { + this.refundTradeId = refundTradeId; + } + + public void setTraceId(final String traceId) { + this.traceId = traceId; + } + + public void setMerchantId(final Long merchantId) { + this.merchantId = merchantId; + } + + public void setOutTradeNo(final String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public void setPayState(final Integer payState) { + this.payState = payState; + } + + public void setPayChannel(final Integer payChannel) { + this.payChannel = payChannel; + } + + public void setTradeType(final Integer tradeType) { + this.tradeType = tradeType; + } + + public void setAmount(final BigDecimal amount) { + this.amount = amount; + } + + @JsonDeserialize( + using = DateTimeDeserializer.class + ) + public void setTradeTime(final LocalDateTime tradeTime) { + this.tradeTime = tradeTime; + } + + public void setDetailList(final List detailList) { + this.detailList = detailList; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/PayService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/PayService.java index 05d32876..70430e01 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/PayService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/PayService.java @@ -113,4 +113,11 @@ public interface PayService { qrCodeApplyVO.setMsg("暂不支持收款二维码"); return qrCodeApplyVO; } + + default AndroidPayVO paySelect(PaySelectDTO paySelectDTO) { + AndroidPayVO androidPayVO = new AndroidPayVO(); + androidPayVO.setCode(PayStateEnum.PAY_INPROCESS.getKey()); + androidPayVO.setMsg("当前渠道暂不支持查询支付结果"); + return androidPayVO; + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/PayTradeService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/PayTradeService.java index c1f2bca4..a59103f7 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/PayTradeService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/PayTradeService.java @@ -9,4 +9,5 @@ public interface PayTradeService { boolean sendAutoPayResultQuery(UnifyPaySelectDTO paySelectDTO, LocalDateTime startTime, boolean cancelWhenEnd); + void sendResultMq(Long tradeId, int... delayMilliSeconds); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/TradeChannelService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/TradeChannelService.java index 1e5b1ef5..b01ec14d 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/TradeChannelService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/TradeChannelService.java @@ -1,13 +1,19 @@ package com.bonus.core.pay.common.service; import com.bonus.core.pay.common.model.TradeChannel; +import com.bonus.core.pay.common.vo.TradeChannelVO; import com.fasterxml.jackson.databind.JsonNode; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; public interface TradeChannelService { void insert(TradeChannel tradeChannel); void updateTradeRecordChannelState(Long channelId, Integer tradeState, String tradeResult, String outTradeNo, BigDecimal realAmount, JsonNode param, LocalDateTime tradeTime); + + List listChannelDetailByTradeId(Long tradeId); + + List listChannelDetailByTradeIds(List tradeId); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/TradeRecordService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/TradeRecordService.java index 7da45d08..2ca36b80 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/TradeRecordService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/TradeRecordService.java @@ -18,4 +18,6 @@ public interface TradeRecordService { TradeRecord getTradeRecordById(Long tradeId); List queryOrderRechargeTrade(Long tradeId); + + TradeRecord getTradeRecordByOrderRechargeId(Long orderRechargeId, Integer... tradeState); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/PayTradeServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/PayTradeServiceImpl.java index 34486ca0..af531bbb 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/PayTradeServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/PayTradeServiceImpl.java @@ -1,5 +1,6 @@ package com.bonus.core.pay.common.service.impl; +import cn.hutool.core.util.ArrayUtil; import com.bonus.core.common.constant.LeMqConstant; import com.bonus.core.common.redis.RedisUtil; import com.bonus.core.common.utils.JacksonUtil; @@ -9,18 +10,35 @@ import com.bonus.core.order.common.constants.OrderCacheConstants; //import com.bonus.core.order.mq.MqUtil; import com.bonus.core.order.mq.constants.OrderMQConstants; import com.bonus.core.pay.api.dto.UnifyPaySelectDTO; +import com.bonus.core.pay.common.constants.PayStateEnum; +import com.bonus.core.pay.common.constants.TradeTypeEnum; +import com.bonus.core.pay.common.model.TradeRecord; +import com.bonus.core.pay.common.po.PayResultPO; import com.bonus.core.pay.common.po.PayResultQueryPO; +import com.bonus.core.pay.common.po.RefundResultPO; import com.bonus.core.pay.common.service.PayTradeService; +import com.bonus.core.pay.common.service.TradeChannelService; +import com.bonus.core.pay.common.service.TradeRecordService; +import com.bonus.core.pay.common.vo.TradeChannelVO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; @Service public class PayTradeServiceImpl implements PayTradeService { private static final Logger log = LoggerFactory.getLogger(PayTradeServiceImpl.class); + @Lazy + @Resource + private TradeRecordService tradeRecordService; + @Lazy + @Resource + private TradeChannelService tradeChannelService; @Override public boolean sendAutoPayResultQuery(UnifyPaySelectDTO paySelectDTO, LocalDateTime startTime, boolean endWithCancel) { @@ -45,4 +63,31 @@ public class PayTradeServiceImpl implements PayTradeService { return false; } } + + @Override + public void sendResultMq(Long tradeId, int... delayMilliSeconds) { + TradeRecord tradeRecord = this.tradeRecordService.getTradeRecordById(tradeId); + + try { + if (TradeTypeEnum.isPayCategory(tradeRecord.getTradeType()) && PayStateEnum.isFinishedState(tradeRecord.getTradeState())) { + PayResultPO payResultPO = PayResultPO.of(tradeRecord); + if (ArrayUtil.isNotEmpty(delayMilliSeconds)) { +// MqUtil.sendDelay(JacksonUtil.writeValueAsString(payResultPO), LeMqConstant.Topic.PAY_RESULT, delayMilliSeconds[0]); + } else { +// MqUtil.sendByTxEnd(JacksonUtil.writeValueAsString(payResultPO), LeMqConstant.Topic.PAY_RESULT); + } + } else if (TradeTypeEnum.isRefundCategory(tradeRecord.getTradeType()) && PayStateEnum.isFinishedState(tradeRecord.getTradeState())) { + List tradeChannels = this.tradeChannelService.listChannelDetailByTradeId(tradeId); + RefundResultPO payResultPO = RefundResultPO.of(tradeRecord, tradeChannels); + if (ArrayUtil.isNotEmpty(delayMilliSeconds)) { +// MqUtil.sendDelay(JacksonUtil.writeValueAsString(payResultPO), LeMqConstant.Topic.REFUND_RESULT, delayMilliSeconds[0]); + } else { +// MqUtil.sendByTxEnd(JacksonUtil.writeValueAsString(payResultPO), LeMqConstant.Topic.REFUND_RESULT); + } + } + } catch (Exception var6) { + log.error("[支付结果通知]发送失败", var6); + } + + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/TradeChannelServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/TradeChannelServiceImpl.java index 3dae831d..cf12be7b 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/TradeChannelServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/TradeChannelServiceImpl.java @@ -2,6 +2,7 @@ package com.bonus.core.pay.common.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.text.CharSequenceUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bonus.core.order.utils.LeNumUtil; @@ -10,6 +11,7 @@ import com.bonus.core.pay.common.constants.PayStateEnum; import com.bonus.core.pay.common.mapper.TradeRecordChannelMapper; import com.bonus.core.pay.common.model.TradeChannel; import com.bonus.core.pay.common.service.TradeChannelService; +import com.bonus.core.pay.common.vo.TradeChannelVO; import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,6 +20,7 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; +import java.util.stream.Collectors; @Service public class TradeChannelServiceImpl extends ServiceImpl implements TradeChannelService { @@ -50,4 +53,23 @@ public class TradeChannelServiceImpl extends ServiceImpl listChannelDetailByTradeId(Long tradeId) { + return (List)(!LeNumUtil.isValidId(tradeId) ? CollUtil.newArrayList(new TradeChannelVO[0]) : this.listChannelDetailByTradeIds(CollUtil.toList(new Long[]{tradeId}))); + } + + @Override + public List listChannelDetailByTradeIds(List tradeIds) { + if (CollUtil.isEmpty(tradeIds)) { + return CollUtil.newArrayList(new TradeChannelVO[0]); + } else { + List createTimeRange = LeOrderUtil.queryCreateTimeRange(tradeIds); + return ((TradeRecordChannelMapper)this.baseMapper).selectList(Wrappers.lambdaQuery(TradeChannel.class) + .in(TradeChannel::getTradeId, tradeIds) + .between(TradeChannel::getCreateTime, createTimeRange.get(0), createTimeRange.get(1))) + .stream().map(TradeChannelVO::of) + .collect(Collectors.toList()); + } + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/TradeRecordServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/TradeRecordServiceImpl.java index 95119fcc..32f32e52 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/TradeRecordServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/common/service/impl/TradeRecordServiceImpl.java @@ -16,6 +16,7 @@ import com.bonus.core.pay.common.mapper.TradeRecordMapper; import com.bonus.core.pay.common.model.TradeOrderRecharge; import com.bonus.core.pay.common.model.TradeRecord; import com.bonus.core.pay.common.service.TradeRecordService; +import org.apache.ibatis.annotations.Param; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -94,4 +95,14 @@ public class TradeRecordServiceImpl extends ServiceImpl timeRange = LeOrderUtil.queryCreateTimeRange(); + List tradeRecords = ((TradeRecordMapper)this.baseMapper).listTradeRecordByOrderRechargeId(orderRechargeId, (LocalDateTime)timeRange.get(0), (LocalDateTime)timeRange.get(1), tradeState); + log.info("[交易记录] getTradeRecordByOrderRechargeId 结束"); + return (TradeRecord)CollUtil.getFirst(tradeRecords); + } + } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/custom/PayCustomBusiness.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/custom/PayCustomBusiness.java index fd6e2794..0ed6eac1 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/custom/PayCustomBusiness.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/pay/custom/PayCustomBusiness.java @@ -1,6 +1,8 @@ package com.bonus.core.pay.custom; import com.bonus.core.common.custom.business.CustomBusiness; import com.bonus.core.pay.api.dto.UnifyPayDTO; +import com.bonus.core.pay.api.dto.UnifyPaySelectDTO; +import com.bonus.core.pay.api.vo.UnifyPaySelectVO; import com.bonus.core.pay.api.vo.UnifyPayVO; import com.bonus.core.pay.common.constants.PayChannelSelectEnum; import com.bonus.core.pay.common.dto.ChannelPayDTO; @@ -43,4 +45,11 @@ public class PayCustomBusiness implements CustomBusiness { } public void willChannelPay(ChannelPayDTO channelPayDTO) { } + + public void willPaySelectV2(UnifyPaySelectDTO paySelectDTO) { + } + + public UnifyPaySelectVO didPaySelectV2(UnifyPaySelectDTO paySelectDTO, UnifyPaySelectVO paySelectVO) { + return paySelectVO; + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/pay/TradeRecordMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/pay/TradeRecordMapper.xml index 7665881f..a6e10359 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/pay/TradeRecordMapper.xml +++ b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/pay/TradeRecordMapper.xml @@ -4,5 +4,39 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + diff --git a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccTradeMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccTradeMapper.xml index 4bced650..aa27461e 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccTradeMapper.xml +++ b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/v3/AccTradeMapper.xml @@ -112,5 +112,20 @@ + + +