相关支付
This commit is contained in:
parent
720c7cec50
commit
21bab83eea
@ -175,6 +175,7 @@ gateway:
|
|||||||
- /product/apple/config
|
- /product/apple/config
|
||||||
- /game/sud/**
|
- /game/sud/**
|
||||||
- /web/pay/**
|
- /web/pay/**
|
||||||
|
- /order/web/pay/**
|
||||||
- /external/oss/upload
|
- /external/oss/upload
|
||||||
- /telegram/webhook
|
- /telegram/webhook
|
||||||
- /account/create/getRegion
|
- /account/create/getRegion
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import jakarta.validation.constraints.NotBlank;
|
|||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.util.List;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
@ -46,6 +47,12 @@ public class SysPayApplicationCommodityCmd extends CommonCommand {
|
|||||||
@JsonSerialize(using = ToStringSerializer.class)
|
@JsonSerialize(using = ToStringSerializer.class)
|
||||||
private Long payCountryId;
|
private Long payCountryId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量创建时的国家列表;表结构仍是一条商品对应一个国家,所以只在新增时拆成多条记录.
|
||||||
|
*/
|
||||||
|
@JsonSerialize(contentUsing = ToStringSerializer.class)
|
||||||
|
private List<Long> payCountryIds;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 区域ID.
|
* 区域ID.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import com.google.api.client.util.Maps;
|
|||||||
import com.google.api.client.util.Sets;
|
import com.google.api.client.util.Sets;
|
||||||
import com.red.circle.common.business.core.amount.PayAmountArithmeticUtils;
|
import com.red.circle.common.business.core.amount.PayAmountArithmeticUtils;
|
||||||
import com.red.circle.common.business.core.enums.SysOriginPlatformEnum;
|
import com.red.circle.common.business.core.enums.SysOriginPlatformEnum;
|
||||||
|
import com.red.circle.common.business.core.util.CountryCodeAliasUtils;
|
||||||
import com.red.circle.framework.core.asserts.ResponseAssert;
|
import com.red.circle.framework.core.asserts.ResponseAssert;
|
||||||
import com.red.circle.framework.core.response.CommonErrorCode;
|
import com.red.circle.framework.core.response.CommonErrorCode;
|
||||||
import com.red.circle.order.app.convertor.PayAppConvertor;
|
import com.red.circle.order.app.convertor.PayAppConvertor;
|
||||||
@ -23,6 +24,8 @@ import com.red.circle.order.infra.database.rds.service.pay.PayApplicationCommodi
|
|||||||
import com.red.circle.order.infra.database.rds.service.pay.PayApplicationService;
|
import com.red.circle.order.infra.database.rds.service.pay.PayApplicationService;
|
||||||
import com.red.circle.order.infra.database.rds.service.pay.PayChannelService;
|
import com.red.circle.order.infra.database.rds.service.pay.PayChannelService;
|
||||||
import com.red.circle.order.infra.database.rds.service.pay.PayCountryChannelDetailsService;
|
import com.red.circle.order.infra.database.rds.service.pay.PayCountryChannelDetailsService;
|
||||||
|
import com.red.circle.other.inner.endpoint.sys.SysCountryCodeClient;
|
||||||
|
import com.red.circle.other.inner.model.dto.sys.SysCountryCodeDTO;
|
||||||
import com.red.circle.tool.core.collection.CollectionUtils;
|
import com.red.circle.tool.core.collection.CollectionUtils;
|
||||||
import com.red.circle.tool.core.num.ArithmeticUtils;
|
import com.red.circle.tool.core.num.ArithmeticUtils;
|
||||||
import com.red.circle.tool.core.text.StringUtils;
|
import com.red.circle.tool.core.text.StringUtils;
|
||||||
@ -54,6 +57,7 @@ public class PayWebApplicationCommodityV2QueryExe {
|
|||||||
private final PayCountryAliasResolver payCountryAliasResolver;
|
private final PayCountryAliasResolver payCountryAliasResolver;
|
||||||
private final PayApplicationCommodityService payApplicationCommodityService;
|
private final PayApplicationCommodityService payApplicationCommodityService;
|
||||||
private final PayCountryChannelDetailsService payCountryChannelDetailsService;
|
private final PayCountryChannelDetailsService payCountryChannelDetailsService;
|
||||||
|
private final SysCountryCodeClient sysCountryCodeClient;
|
||||||
|
|
||||||
public ApplicationCommodityCardV2CO execute(PayWebApplicationCommodityCmd cmd) {
|
public ApplicationCommodityCardV2CO execute(PayWebApplicationCommodityCmd cmd) {
|
||||||
|
|
||||||
@ -165,7 +169,17 @@ public class PayWebApplicationCommodityV2QueryExe {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private PayCountry getPayCountry(PayWebApplicationCommodityCmd cmd) {
|
private PayCountry getPayCountry(PayWebApplicationCommodityCmd cmd) {
|
||||||
return payCountryAliasResolver.resolveUsablePayCountry(cmd.getPayCountryId());
|
if (Objects.nonNull(cmd.getPayCountryId()) || StringUtils.isBlank(cmd.getCountryCode())) {
|
||||||
|
return payCountryAliasResolver.resolveUsablePayCountry(cmd.getPayCountryId());
|
||||||
|
}
|
||||||
|
|
||||||
|
String normalizedCountryCode = CountryCodeAliasUtils.normalizePaymentCountryCode(
|
||||||
|
cmd.getCountryCode());
|
||||||
|
SysCountryCodeDTO countryCode = ResponseAssert.requiredSuccess(
|
||||||
|
sysCountryCodeClient.getByCode(normalizedCountryCode));
|
||||||
|
ResponseAssert.notNull(CommonErrorCode.NOT_SUPPORTED_REGION, countryCode);
|
||||||
|
// H5 只传用户国家码;这里仅把真实国家转成商品表使用的支付国家ID,是否开放支付国家由 H5 JSON 控制.
|
||||||
|
return payCountryAliasResolver.resolveUsablePayCountryByCountryId(countryCode.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<PayChannelDetailsCO> getPayChannels(List<PayChannel> payChannels,
|
private List<PayChannelDetailsCO> getPayChannels(List<PayChannel> payChannels,
|
||||||
|
|||||||
@ -26,8 +26,10 @@ public class PayWebOrderStatusQueryExe {
|
|||||||
public PayOrderStatusCO execute(PayOrderStatusCmd cmd) {
|
public PayOrderStatusCO execute(PayOrderStatusCmd cmd) {
|
||||||
OrderUserPurchasePay mysqlOrder = getMysqlOrder(cmd.getOrderId());
|
OrderUserPurchasePay mysqlOrder = getMysqlOrder(cmd.getOrderId());
|
||||||
ResponseAssert.notNull(OrderErrorCode.NO_PURCHASE_RECORD_FOUND, mysqlOrder);
|
ResponseAssert.notNull(OrderErrorCode.NO_PURCHASE_RECORD_FOUND, mysqlOrder);
|
||||||
|
Long expectedUserId = Objects.nonNull(cmd.getReqUserId()) ? cmd.getReqUserId() : cmd.getUserId();
|
||||||
|
// 登录态请求继续使用网关注入的 reqUserId;公开 H5 轮询没有登录态,只允许用下单用户ID校验同一笔订单.
|
||||||
ResponseAssert.isTrue(OrderErrorCode.NO_PURCHASE_RECORD_FOUND,
|
ResponseAssert.isTrue(OrderErrorCode.NO_PURCHASE_RECORD_FOUND,
|
||||||
Objects.equals(mysqlOrder.getUserId(), cmd.getReqUserId()));
|
Objects.nonNull(expectedUserId) && Objects.equals(mysqlOrder.getUserId(), expectedUserId));
|
||||||
InAppPurchaseStatus status = MiFaPayMysqlOrderSupport
|
InAppPurchaseStatus status = MiFaPayMysqlOrderSupport
|
||||||
.toInAppPurchaseStatus(mysqlOrder.getPayStatus());
|
.toInAppPurchaseStatus(mysqlOrder.getPayStatus());
|
||||||
return new PayOrderStatusCO()
|
return new PayOrderStatusCO()
|
||||||
|
|||||||
@ -18,13 +18,11 @@ import com.red.circle.tool.core.regex.RegexConstant;
|
|||||||
import com.red.circle.tool.core.text.StringUtils;
|
import com.red.circle.tool.core.text.StringUtils;
|
||||||
import com.red.circle.other.inner.asserts.user.UserErrorCode;
|
import com.red.circle.other.inner.asserts.user.UserErrorCode;
|
||||||
import com.red.circle.other.inner.model.dto.user.UserProfileDTO;
|
import com.red.circle.other.inner.model.dto.user.UserProfileDTO;
|
||||||
import com.red.circle.other.inner.model.dto.user.reigon.RegionRelationDTO;
|
|
||||||
import com.red.circle.other.inner.enums.user.RegionRelationGroupEnum;
|
|
||||||
import com.red.circle.other.inner.endpoint.user.region.RegionRelationClient;
|
|
||||||
import com.red.circle.other.inner.endpoint.user.region.UserRegionClient;
|
import com.red.circle.other.inner.endpoint.user.region.UserRegionClient;
|
||||||
import com.red.circle.other.inner.endpoint.user.user.UserProfileClient;
|
import com.red.circle.other.inner.endpoint.user.user.UserProfileClient;
|
||||||
import com.red.circle.wallet.inner.endpoint.freight.FreightGoldClient;
|
import com.red.circle.wallet.inner.endpoint.freight.FreightGoldClient;
|
||||||
import java.util.AbstractMap;
|
import java.util.AbstractMap;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -47,7 +45,6 @@ public class UserProfileAndCountryQueryExe {
|
|||||||
private final PayCountryAliasResolver payCountryAliasResolver;
|
private final PayCountryAliasResolver payCountryAliasResolver;
|
||||||
private final UserProfileClient userProfileClient;
|
private final UserProfileClient userProfileClient;
|
||||||
private final SysCountryCodeClient sysCountryCodeClient;
|
private final SysCountryCodeClient sysCountryCodeClient;
|
||||||
private final RegionRelationClient regionRelationClient;
|
|
||||||
|
|
||||||
public UserProfileAndCountryCO execute(PayWebUserCmd cmd) {
|
public UserProfileAndCountryCO execute(PayWebUserCmd cmd) {
|
||||||
|
|
||||||
@ -64,25 +61,15 @@ public class UserProfileAndCountryQueryExe {
|
|||||||
.toWebSiteUseProfileCO(userProfile);
|
.toWebSiteUseProfileCO(userProfile);
|
||||||
webSiteUseProfile.setAccount(userProfile.actualAccount());
|
webSiteUseProfile.setAccount(userProfile.actualAccount());
|
||||||
|
|
||||||
List<PayCountry> payCountryList;
|
|
||||||
|
|
||||||
String regionId = ResponseAssert.requiredSuccess(
|
String regionId = ResponseAssert.requiredSuccess(
|
||||||
userRegionClient.getRegionId(userProfile.getId())
|
userRegionClient.getRegionId(userProfile.getId())
|
||||||
);
|
);
|
||||||
|
|
||||||
if (Objects.equals(cmd.getSysOrigin(), SysOriginPlatformEnum.LIKEI.name())) {
|
if (Objects.equals(cmd.getSysOrigin(), SysOriginPlatformEnum.LIKEI.name())) {
|
||||||
ResponseAssert.isTrue(CommonErrorCode.NOT_SUPPORTED_REGION, StringUtils.isNotBlank(regionId));
|
return toLikeiUserCountryResult(userProfile, webSiteUseProfile, regionId);
|
||||||
|
|
||||||
List<RegionRelationDTO> regionRelationList = getRegionRelationList(userProfile, regionId);
|
|
||||||
ResponseAssert.notEmpty(CommonErrorCode.NOT_SUPPORTED_REGION, regionRelationList);
|
|
||||||
|
|
||||||
payCountryList = getPayCountryList(regionRelationList);
|
|
||||||
ResponseAssert.notEmpty(CommonErrorCode.NOT_SUPPORTED_REGION, payCountryList);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
payCountryList = payCountryService.listAllShelf();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<PayCountry> payCountryList = payCountryService.listAllShelf();
|
||||||
Map<Long, SysCountryCodeDTO> mapCountryCode = getMapCountryCode(payCountryList);
|
Map<Long, SysCountryCodeDTO> mapCountryCode = getMapCountryCode(payCountryList);
|
||||||
ResponseAssert.notEmpty(CommonErrorCode.NOT_SUPPORTED_REGION, mapCountryCode);
|
ResponseAssert.notEmpty(CommonErrorCode.NOT_SUPPORTED_REGION, mapCountryCode);
|
||||||
Map<Long, PayCountry> compatiblePayCountryMap = getCompatiblePayCountryMap(payCountryList);
|
Map<Long, PayCountry> compatiblePayCountryMap = getCompatiblePayCountryMap(payCountryList);
|
||||||
@ -109,6 +96,45 @@ public class UserProfileAndCountryQueryExe {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private UserProfileAndCountryCO toLikeiUserCountryResult(UserProfileDTO userProfile,
|
||||||
|
WebSiteUseProfileCO webSiteUseProfile, String regionId) {
|
||||||
|
|
||||||
|
SysCountryCodeDTO countryCode = getUserCountryCode(userProfile);
|
||||||
|
ResponseAssert.notNull(CommonErrorCode.NOT_SUPPORTED_REGION, countryCode);
|
||||||
|
|
||||||
|
PayCountry compatiblePayCountry = payCountryAliasResolver
|
||||||
|
.resolveUsablePayCountryByCountryId(countryCode.getId());
|
||||||
|
|
||||||
|
// LIKEI/Yumi 的支付国家开放由 H5 JSON 控制;这里仅返回用户真实国家,商品接口再按国家码查该国商品.
|
||||||
|
PayCountryCO payCountryCO = new PayCountryCO()
|
||||||
|
.setId(Objects.nonNull(compatiblePayCountry) ? compatiblePayCountry.getId() : null)
|
||||||
|
.setPayCountryId(Objects.nonNull(compatiblePayCountry) ? compatiblePayCountry.getId() : null)
|
||||||
|
.setCountryId(countryCode.getId())
|
||||||
|
.setCurrency(Objects.nonNull(compatiblePayCountry) ? compatiblePayCountry.getCurrency() : null)
|
||||||
|
.setCountry(countryCode);
|
||||||
|
|
||||||
|
return new UserProfileAndCountryCO()
|
||||||
|
.setCountryList(Collections.singletonList(payCountryCO))
|
||||||
|
.setUserProfile(webSiteUseProfile)
|
||||||
|
.setRegionId(regionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SysCountryCodeDTO getUserCountryCode(UserProfileDTO userProfile) {
|
||||||
|
if (Objects.nonNull(userProfile.getCountryId())) {
|
||||||
|
return ResponseAssert.requiredSuccess(
|
||||||
|
sysCountryCodeClient.getById(userProfile.getCountryId())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.isNotBlank(userProfile.getCountryCode())) {
|
||||||
|
return ResponseAssert.requiredSuccess(
|
||||||
|
sysCountryCodeClient.getByCode(userProfile.getCountryCode())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private UserProfileDTO getUserProfile(PayWebUserCmd cmd) {
|
private UserProfileDTO getUserProfile(PayWebUserCmd cmd) {
|
||||||
if (StringUtils.isNotBlank(cmd.getAccount()) && StringUtils.isNotBlank(cmd.getSysOrigin())) {
|
if (StringUtils.isNotBlank(cmd.getAccount()) && StringUtils.isNotBlank(cmd.getSysOrigin())) {
|
||||||
return ResponseAssert.requiredSuccess(
|
return ResponseAssert.requiredSuccess(
|
||||||
@ -146,18 +172,4 @@ public class UserProfileAndCountryQueryExe {
|
|||||||
(left, right) -> left));
|
(left, right) -> left));
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<RegionRelationDTO> getRegionRelationList(UserProfileDTO userProfile,
|
|
||||||
String regionId) {
|
|
||||||
return ResponseAssert.requiredSuccess(
|
|
||||||
regionRelationClient
|
|
||||||
.listByRegionId(regionId, userProfile.getOriginSys(),
|
|
||||||
RegionRelationGroupEnum.OPEN_PAY_COUNTRY)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<PayCountry> getPayCountryList(List<RegionRelationDTO> regionRelationList) {
|
|
||||||
return payCountryService
|
|
||||||
.listByIds(regionRelationList.stream().map(RegionRelationDTO::getRelationId).collect(
|
|
||||||
Collectors.toSet()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,4 +23,9 @@ public class PayOrderStatusCmd extends AppExtCommand {
|
|||||||
*/
|
*/
|
||||||
@NotBlank(message = "orderId required.")
|
@NotBlank(message = "orderId required.")
|
||||||
private String orderId;
|
private String orderId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* H5公开支付页没有登录态,轮询状态时必须用下单用户ID继续做订单归属校验.
|
||||||
|
*/
|
||||||
|
private Long userId;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,6 +32,11 @@ public class PayWebApplicationCommodityCmd extends AppExtCommand {
|
|||||||
*/
|
*/
|
||||||
private Long payCountryId;
|
private Long payCountryId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 国家编码;H5 先拿用户国家,再用国家码查询商品,避免前端硬编码支付国家ID.
|
||||||
|
*/
|
||||||
|
private String countryCode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 金币类型.
|
* 金币类型.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package com.red.circle.order.inner.service.impl;
|
|||||||
|
|
||||||
import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
|
import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
|
||||||
import com.red.circle.framework.core.asserts.ResponseAssert;
|
import com.red.circle.framework.core.asserts.ResponseAssert;
|
||||||
|
import com.red.circle.framework.core.response.CommonErrorCode;
|
||||||
import com.red.circle.framework.dto.PageResult;
|
import com.red.circle.framework.dto.PageResult;
|
||||||
import com.red.circle.order.infra.database.rds.entity.pay.PayApplication;
|
import com.red.circle.order.infra.database.rds.entity.pay.PayApplication;
|
||||||
import com.red.circle.order.infra.database.rds.entity.pay.PayApplicationCommodity;
|
import com.red.circle.order.infra.database.rds.entity.pay.PayApplicationCommodity;
|
||||||
@ -23,6 +24,7 @@ import java.util.Optional;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开通支付应用.
|
* 开通支付应用.
|
||||||
@ -107,9 +109,29 @@ public class PayApplicationClientServiceImpl implements PayApplicationClientServ
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void addOrUpdateCommodity(SysPayApplicationCommodityCmd param) {
|
public void addOrUpdateCommodity(SysPayApplicationCommodityCmd param) {
|
||||||
payApplicationCommodityService.saveOrUpdate(
|
if (Objects.nonNull(param.getId()) || CollectionUtils.isEmpty(param.getPayCountryIds())) {
|
||||||
webPayInnerConvertor.toPayApplicationCommodity(param));
|
// 编辑沿用原来的单条更新;批量国家只服务新增,避免一次编辑误伤多个已存在商品.
|
||||||
|
payApplicationCommodityService.saveOrUpdate(
|
||||||
|
webPayInnerConvertor.toPayApplicationCommodity(param));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<PayApplicationCommodity> commodities = param.getPayCountryIds().stream()
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.distinct()
|
||||||
|
.map(payCountryId -> {
|
||||||
|
PayApplicationCommodity commodity = webPayInnerConvertor.toPayApplicationCommodity(param);
|
||||||
|
// 商品表当前以国家维度存储,新增多选国家时需要拆成多条独立商品记录.
|
||||||
|
commodity.setId(null);
|
||||||
|
commodity.setPayCountryId(payCountryId);
|
||||||
|
return commodity;
|
||||||
|
})
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
ResponseAssert.notEmpty(CommonErrorCode.NOT_FOUND_RECORD_INFO, commodities);
|
||||||
|
payApplicationCommodityService.saveBatch(commodities);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -60,27 +60,12 @@ public class TeamMemberListQryExe {
|
|||||||
Map<Long, TeamMemberTarget> teamMemberTargetMap = teamMemberTargetService.mapMemberBillTarget(
|
Map<Long, TeamMemberTarget> teamMemberTargetMap = teamMemberTargetService.mapMemberBillTarget(
|
||||||
cmd.getId(), memberUserIds, ZonedDateTimeAsiaRiyadhUtils.nowYearMonthToInt());
|
cmd.getId(), memberUserIds, ZonedDateTimeAsiaRiyadhUtils.nowYearMonthToInt());
|
||||||
|
|
||||||
List<TeamMemberCO> teamMemberCOs = teamMembers.stream().map(teamMember -> new TeamMemberCO()
|
List<TeamMemberCO> teamMemberCOs = teamMembers.stream()
|
||||||
.setId(teamMember.getMemberId())
|
.map(teamMember -> assembleTeamMemberCO(
|
||||||
.setUserProfile(userProfileMap.get(teamMember.getMemberId()))
|
teamMember,
|
||||||
.setTargetFormat(Optional.ofNullable(teamMemberTargetMap.get(teamMember.getMemberId()))
|
userProfileMap.get(teamMember.getMemberId()),
|
||||||
.map(target -> NumUtils.formatLong(target.sumAcceptGiftValue()))
|
teamMemberTargetMap.get(teamMember.getMemberId())))
|
||||||
.orElse("0"))
|
.collect(Collectors.toList());
|
||||||
.setTimeHours(Optional.ofNullable(teamMemberTargetMap.get(teamMember.getMemberId()))
|
|
||||||
.map(target -> BigDecimal.valueOf(target.sumAllTargetTime())
|
|
||||||
.divide(BigDecimal.valueOf(60), 2, RoundingMode.DOWN)
|
|
||||||
.stripTrailingZeros().toPlainString())
|
|
||||||
.orElse("0"))
|
|
||||||
.setEffectiveDay(Optional.ofNullable(teamMemberTargetMap.get(teamMember.getMemberId()))
|
|
||||||
.map(TeamMemberTarget::sumEffectiveDay)
|
|
||||||
.orElse(0))
|
|
||||||
.setUseDiamonds("0")
|
|
||||||
.setSurplusDiamonds("0")
|
|
||||||
.setRole(Objects.toString(teamMember.getRole()))
|
|
||||||
.setWalletWithdrawal(Objects.isNull(teamMember.getWalletWithdrawal()) || Objects.equals(
|
|
||||||
teamMember.getWalletWithdrawal(), Boolean.TRUE))
|
|
||||||
.setCreateTime(teamMember.getCreateTime())
|
|
||||||
).collect(Collectors.toList());
|
|
||||||
return teamMemberCOs;
|
return teamMemberCOs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,23 +147,60 @@ public class TeamMemberListQryExe {
|
|||||||
.orElse(0);
|
.orElse(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<TeamMemberCO> searchTeamMember(Long reqUserId, String account) {
|
private TeamMemberCO assembleTeamMemberCO(
|
||||||
TeamMember reqTeamMember = teamMemberService.getByMemberId(reqUserId);
|
TeamMember teamMember,
|
||||||
if (reqTeamMember == null) {
|
UserProfileDTO userProfile,
|
||||||
return Collections.emptyList();
|
TeamMemberTarget teamMemberTarget) {
|
||||||
}
|
return new TeamMemberCO()
|
||||||
|
.setId(teamMember.getMemberId())
|
||||||
|
.setUserProfile(userProfile)
|
||||||
|
.setTargetFormat(Optional.ofNullable(teamMemberTarget)
|
||||||
|
.map(target -> NumUtils.formatLong(target.sumAcceptGiftValue()))
|
||||||
|
.orElse("0"))
|
||||||
|
.setTimeHours(Optional.ofNullable(teamMemberTarget)
|
||||||
|
.map(target -> BigDecimal.valueOf(target.sumAllTargetTime())
|
||||||
|
.divide(BigDecimal.valueOf(60), 2, RoundingMode.DOWN)
|
||||||
|
.stripTrailingZeros().toPlainString())
|
||||||
|
.orElse("0"))
|
||||||
|
.setEffectiveDay(Optional.ofNullable(teamMemberTarget)
|
||||||
|
.map(TeamMemberTarget::sumEffectiveDay)
|
||||||
|
.orElse(0))
|
||||||
|
.setUseDiamonds("0")
|
||||||
|
.setSurplusDiamonds("0")
|
||||||
|
.setRole(Objects.toString(teamMember.getRole()))
|
||||||
|
.setWalletWithdrawal(Objects.isNull(teamMember.getWalletWithdrawal()) || Objects.equals(
|
||||||
|
teamMember.getWalletWithdrawal(), Boolean.TRUE))
|
||||||
|
.setCreateTime(teamMember.getCreateTime());
|
||||||
|
}
|
||||||
|
|
||||||
List<UserProfile> userProfiles = userProfileGateway.getByAccount(account);
|
public List<TeamMemberCO> searchTeamMember(Long reqUserId, String account) {
|
||||||
if (CollectionUtils.isEmpty(userProfiles)) {
|
TeamMember reqTeamMember = teamMemberService.getByMemberId(reqUserId);
|
||||||
return Collections.emptyList();
|
if (reqTeamMember == null) {
|
||||||
}
|
return Collections.emptyList();
|
||||||
UserProfile userProfile = userProfiles.get(0);
|
|
||||||
TeamMember teamMember = teamMemberService.getByMemberId(userProfile.getId());
|
|
||||||
if (teamMember == null || !teamMember.getTeamId().equals(reqTeamMember.getTeamId())) {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
return Collections.singletonList(new TeamMemberCO().setUserProfile(userProfileAppConvertor.toUserProfileDTO(userProfile)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<UserProfile> userProfiles = userProfileGateway.getByAccount(account);
|
||||||
|
if (CollectionUtils.isEmpty(userProfiles)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
UserProfile userProfile = userProfiles.get(0);
|
||||||
|
TeamMember teamMember = teamMemberService.getByMemberId(userProfile.getId());
|
||||||
|
if (teamMember == null || !teamMember.getTeamId().equals(reqTeamMember.getTeamId())) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
TeamMemberTarget teamMemberTarget = teamMemberTargetService
|
||||||
|
.mapMemberBillTarget(
|
||||||
|
reqTeamMember.getTeamId(),
|
||||||
|
Collections.singleton(teamMember.getMemberId()),
|
||||||
|
ZonedDateTimeAsiaRiyadhUtils.nowYearMonthToInt())
|
||||||
|
.get(teamMember.getMemberId());
|
||||||
|
|
||||||
|
return Collections.singletonList(assembleTeamMemberCO(
|
||||||
|
teamMember,
|
||||||
|
userProfileAppConvertor.toUserProfileDTO(userProfile),
|
||||||
|
teamMemberTarget));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,88 @@
|
|||||||
|
package com.red.circle.other.app.command.team.query;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import com.red.circle.other.app.convertor.user.UserProfileAppConvertor;
|
||||||
|
import com.red.circle.other.app.dto.clientobject.team.TeamMemberCO;
|
||||||
|
import com.red.circle.other.domain.gateway.user.UserProfileGateway;
|
||||||
|
import com.red.circle.other.domain.model.user.UserProfile;
|
||||||
|
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamMember;
|
||||||
|
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamMemberTarget;
|
||||||
|
import com.red.circle.other.infra.database.mongo.service.team.team.TeamMemberService;
|
||||||
|
import com.red.circle.other.infra.database.mongo.service.team.team.TeamMemberTargetService;
|
||||||
|
import com.red.circle.other.infra.database.mongo.service.team.team.TeamPolicyManagerService;
|
||||||
|
import com.red.circle.other.infra.database.mongo.service.team.team.TeamProfileService;
|
||||||
|
import com.red.circle.other.inner.enums.team.TeamMemberTargetIndex;
|
||||||
|
import com.red.circle.other.inner.model.dto.user.UserProfileDTO;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class TeamMemberListQryExeTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void searchTeamMemberShouldReturnCurrentWorkSummary() {
|
||||||
|
TeamMemberService teamMemberService = mock(TeamMemberService.class);
|
||||||
|
UserProfileGateway userProfileGateway = mock(UserProfileGateway.class);
|
||||||
|
UserProfileAppConvertor userProfileAppConvertor = mock(UserProfileAppConvertor.class);
|
||||||
|
TeamMemberTargetService teamMemberTargetService = mock(TeamMemberTargetService.class);
|
||||||
|
TeamPolicyManagerService teamPolicyManagerService = mock(TeamPolicyManagerService.class);
|
||||||
|
TeamProfileService teamProfileService = mock(TeamProfileService.class);
|
||||||
|
TeamMemberListQryExe exe = new TeamMemberListQryExe(
|
||||||
|
teamMemberService,
|
||||||
|
userProfileGateway,
|
||||||
|
userProfileAppConvertor,
|
||||||
|
teamMemberTargetService,
|
||||||
|
teamPolicyManagerService,
|
||||||
|
teamProfileService
|
||||||
|
);
|
||||||
|
|
||||||
|
Long requesterUserId = 2064760394110529538L;
|
||||||
|
Long targetUserId = 2065155499803865089L;
|
||||||
|
Long teamId = 2064760394110529538L;
|
||||||
|
UserProfile targetProfile = new UserProfile();
|
||||||
|
targetProfile.setId(targetUserId);
|
||||||
|
targetProfile.setAccount("1018375");
|
||||||
|
targetProfile.setUserNickname("misra");
|
||||||
|
UserProfileDTO targetProfileDTO = new UserProfileDTO();
|
||||||
|
TeamMember requesterMember = new TeamMember()
|
||||||
|
.setMemberId(requesterUserId)
|
||||||
|
.setTeamId(teamId);
|
||||||
|
TeamMember targetMember = new TeamMember()
|
||||||
|
.setMemberId(targetUserId)
|
||||||
|
.setTeamId(teamId);
|
||||||
|
TeamMemberTarget target = new TeamMemberTarget()
|
||||||
|
.setUserId(targetUserId)
|
||||||
|
.setTeamId(teamId)
|
||||||
|
.setDailyTargets(List.of(
|
||||||
|
new TeamMemberTargetIndex()
|
||||||
|
.setAcceptGiftValue(425_289L)
|
||||||
|
.setOwnOnlineTime(2L)
|
||||||
|
.setEffectiveDay(1)
|
||||||
|
));
|
||||||
|
|
||||||
|
when(teamMemberService.getByMemberId(requesterUserId)).thenReturn(requesterMember);
|
||||||
|
when(userProfileGateway.getByAccount("1018375")).thenReturn(List.of(targetProfile));
|
||||||
|
when(teamMemberService.getByMemberId(targetUserId)).thenReturn(targetMember);
|
||||||
|
when(userProfileAppConvertor.toUserProfileDTO(targetProfile)).thenReturn(targetProfileDTO);
|
||||||
|
when(teamMemberTargetService.mapMemberBillTarget(
|
||||||
|
eq(teamId),
|
||||||
|
eq(Collections.singleton(targetUserId)),
|
||||||
|
anyInt())).thenReturn(Map.of(targetUserId, target));
|
||||||
|
|
||||||
|
List<TeamMemberCO> result = exe.searchTeamMember(requesterUserId, "1018375");
|
||||||
|
|
||||||
|
assertEquals(1, result.size());
|
||||||
|
assertEquals(targetUserId, result.get(0).getId());
|
||||||
|
assertSame(targetProfileDTO, result.get(0).getUserProfile());
|
||||||
|
assertEquals("425.28K", result.get(0).getTargetFormat());
|
||||||
|
assertEquals("0.03", result.get(0).getTimeHours());
|
||||||
|
assertEquals(1, result.get(0).getEffectiveDay());
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user