diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/pointaccount/entity/PointAccount.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/pointaccount/entity/PointAccount.java index 723ef9d..ee385cc 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/pointaccount/entity/PointAccount.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/pointaccount/entity/PointAccount.java @@ -42,4 +42,12 @@ public class PointAccount extends Entity { pointAccount.setPoints(0); return pointAccount; } + + public static PointAccount initOrg(Long orgId) { + PointAccount pointAccount = new PointAccount(); + pointAccount.setOrgId(orgId); + pointAccount.setIdentityType(IdentityTypeEnum.ORGANIZATION); + pointAccount.setPoints(0); + return pointAccount; + } } diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/prc/entity/PointRewardConfig.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/prc/entity/PointRewardConfig.java index 65663aa..9d70e87 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/prc/entity/PointRewardConfig.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/prc/entity/PointRewardConfig.java @@ -3,11 +3,15 @@ package com.qniao.dam.domain.aggregate.prc.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.qniao.dam.domian.aggregate.prc.constant.PointRewardConfigAttributeEnum; import com.qniao.dam.domian.aggregate.prc.constant.PointRewardConfigTypeEnum; +import com.qniao.dam.domian.aggregate.rewardconfig.constant.RewardAmountUnitEnum; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import com.qniao.domain.Entity; +import java.math.BigDecimal; +import java.math.RoundingMode; + /** * 积分奖励配置 * @@ -33,4 +37,12 @@ public class PointRewardConfig extends Entity { @ApiModelProperty("备注") private String remark; + + public Integer calculateReward(BigDecimal amount) { + if (PointRewardConfigAttributeEnum.NUM.equals(attribute)) { + return Integer.valueOf(num); + } else { + return amount.multiply(new BigDecimal(num)).divide(BigDecimal.valueOf(100), 0, RoundingMode.HALF_UP).intValue(); + } + } } diff --git a/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/pointaccount/event/PointRewardCreatedMQ.java b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/pointaccount/event/PointRewardCreatedMQ.java new file mode 100644 index 0000000..e59ed16 --- /dev/null +++ b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/pointaccount/event/PointRewardCreatedMQ.java @@ -0,0 +1,34 @@ +package com.qniao.dam.domian.aggregate.pointaccount.event; + +import com.qniao.dam.domian.aggregate.prc.constant.PointRewardConfigTypeEnum; +import com.qniao.dam.domian.aggregate.walletaccount.constant.IdentityTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class PointRewardCreatedMQ implements Serializable { + + @ApiModelProperty("用户唯一标识") + private Long ownId; + + @ApiModelProperty("身份类型(个人、组织)") + private IdentityTypeEnum identityType; + + @ApiModelProperty("积分类型") + private PointRewardConfigTypeEnum pointType; + + @ApiModelProperty("内容") + private String content; + + @ApiModelProperty("是否收入") + private Boolean isIncome; + + @ApiModelProperty("关联ID") + private Long associateId; + + @ApiModelProperty("金额") + private BigDecimal amount; +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/pointaccount/PointAccountEventHandler.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/pointaccount/PointAccountEventHandler.java new file mode 100644 index 0000000..44323f7 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/pointaccount/PointAccountEventHandler.java @@ -0,0 +1,60 @@ +package com.qniao.dam.application.handler.pointaccount; + +import com.qniao.dam.domain.aggregate.pointaccount.PointAccountAggregate; +import com.qniao.dam.domain.aggregate.pointaccount.entity.PointAccount; +import com.qniao.dam.domain.aggregate.pointaccount.valueobj.PointAccountRecord; +import com.qniao.dam.domain.aggregate.prc.entity.PointRewardConfig; +import com.qniao.dam.domian.aggregate.pointaccount.event.PointRewardCreatedMQ; +import com.qniao.dam.infrastructure.constant.MqExchange; +import com.qniao.dam.infrastructure.constant.MqQueue; +import com.qniao.dam.query.pointaccount.PointAccountQueryService; +import com.qniao.dam.query.prc.PointRewardConfigQueryService; +import com.qniao.domain.BaseApplicationService; +import com.qniao.framework.utils.TypeConvertUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.Objects; + +@Component +@Slf4j +public class PointAccountEventHandler extends BaseApplicationService { + + @Resource + private PointAccountQueryService pointAccountQueryService; + @Resource + private PointRewardConfigQueryService pointRewardConfigQueryService; + @Resource + private PointAccountAggregate pointAccountAggregate; + + @RabbitListener(bindings = @QueueBinding(value = @Queue(MqQueue.POINT_REWARD_CREATED), + exchange = @Exchange(value = MqExchange.POINT_REWARD_CREATED, + type = ExchangeTypes.FANOUT))) + public void handle(PointRewardCreatedMQ mq) { + try { + PointAccount pointAccount = pointAccountQueryService.queryByType(mq.getOwnId(), mq.getIdentityType()); + //积分计算 + PointRewardConfig pointRewardConfig = pointRewardConfigQueryService.queryEnableByType(mq.getPointType()); + if (Objects.nonNull(pointRewardConfig)) { + Integer points = pointRewardConfig.calculateReward(mq.getAmount()); + PointAccountRecord pointAccountRecord = TypeConvertUtils.convert(mq, PointAccountRecord.class); + pointAccountRecord.setPoints(points); + pointAccountRecord.setOriginalPoints(pointAccount.getPoints()); + pointAccount.setPoints(pointAccount.getPoints() + points); + pointAccountRecord.setCurrentPoints(pointAccount.getPoints()); + pointAccount.setRecordList(Collections.singletonList(pointAccountRecord)); + pointAccountAggregate.edit(pointAccount); + } + } catch (Exception e) { + log.error("积分奖励创建事件处理异常", e); + } + } + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqExchange.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqExchange.java index 9d16900..f5d09fd 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqExchange.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqExchange.java @@ -16,4 +16,5 @@ public interface MqExchange { String CANCEL_SITE_ACTIVITY = "fanout.cancelSiteActivity"; + String POINT_REWARD_CREATED = "fanout.pointRewardCreated"; } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqQueue.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqQueue.java index 8ba2dc5..d43663a 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqQueue.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqQueue.java @@ -16,4 +16,5 @@ public interface MqQueue { String CANCEL_SITE_ACTIVITY = MqExchange.CANCEL_SITE_ACTIVITY + serviceName; + String POINT_REWARD_CREATED = MqExchange.POINT_REWARD_CREATED + serviceName; } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/pointaccount/PointAccountQueryService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/pointaccount/PointAccountQueryService.java index df4fd04..77d3f86 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/pointaccount/PointAccountQueryService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/pointaccount/PointAccountQueryService.java @@ -1,8 +1,11 @@ package com.qniao.dam.query.pointaccount; import com.qniao.dam.domain.aggregate.pointaccount.entity.PointAccount; +import com.qniao.dam.domian.aggregate.walletaccount.constant.IdentityTypeEnum; public interface PointAccountQueryService { PointAccount queryByUserId(Long userId); + + PointAccount queryByType(Long ownId, IdentityTypeEnum identityType); } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/pointaccount/impl/PointAccountQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/pointaccount/impl/PointAccountQueryServiceImpl.java index e7f1986..79f2344 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/pointaccount/impl/PointAccountQueryServiceImpl.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/pointaccount/impl/PointAccountQueryServiceImpl.java @@ -22,9 +22,31 @@ public class PointAccountQueryServiceImpl implements PointAccountQueryService { .eq(PointAccount::getIdentityType, IdentityTypeEnum.INDIVIDUAL) .eq(PointAccount::getUserId, userId) .last("limit 1")); - if (Objects.isNull(pointAccount)){ + if (Objects.isNull(pointAccount)) { pointAccount = PointAccount.initUser(userId); } return pointAccount; } + + private PointAccount queryByOrg(Long orgId) { + PointAccount pointAccount = pointAccountDao.selectOne(new LambdaQueryWrapper() + .eq(PointAccount::getIdentityType, IdentityTypeEnum.INDIVIDUAL) + .eq(PointAccount::getOrgId, orgId) + .last("limit 1")); + if (Objects.isNull(pointAccount)) { + pointAccount = PointAccount.initOrg(orgId); + } + return pointAccount; + } + + @Override + public PointAccount queryByType(Long ownId, IdentityTypeEnum identityType) { + if (IdentityTypeEnum.INDIVIDUAL.equals(identityType)) { + return queryByUserId(ownId); + } else if (IdentityTypeEnum.ORGANIZATION.equals(identityType)) { + return queryByOrg(ownId); + } + return null; + } + } \ No newline at end of file diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/prc/PointRewardConfigQueryService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/prc/PointRewardConfigQueryService.java index 8c43dbb..aa7e169 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/prc/PointRewardConfigQueryService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/prc/PointRewardConfigQueryService.java @@ -3,9 +3,13 @@ package com.qniao.dam.query.prc; import com.baomidou.mybatisplus.core.metadata.IPage; import com.qniao.dam.api.query.prc.user.request.UserPagePointRewardConfigQueryParams; import com.qniao.dam.api.query.prc.user.response.UserPagePointRewardConfigVo; +import com.qniao.dam.domain.aggregate.prc.entity.PointRewardConfig; +import com.qniao.dam.domian.aggregate.prc.constant.PointRewardConfigTypeEnum; import com.qniao.framework.utils.PageUtil; public interface PointRewardConfigQueryService { IPage page(PageUtil pageUtil, UserPagePointRewardConfigQueryParams queryParams); + + PointRewardConfig queryEnableByType(PointRewardConfigTypeEnum type); } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/prc/impl/PointRewardConfigQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/prc/impl/PointRewardConfigQueryServiceImpl.java index 12d10e1..3b0f9c3 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/prc/impl/PointRewardConfigQueryServiceImpl.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/prc/impl/PointRewardConfigQueryServiceImpl.java @@ -1,8 +1,11 @@ package com.qniao.dam.query.prc.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.qniao.dam.api.query.prc.user.request.UserPagePointRewardConfigQueryParams; import com.qniao.dam.api.query.prc.user.response.UserPagePointRewardConfigVo; +import com.qniao.dam.domain.aggregate.prc.entity.PointRewardConfig; +import com.qniao.dam.domian.aggregate.prc.constant.PointRewardConfigTypeEnum; import com.qniao.dam.infrastructure.persistent.dao.prc.PointRewardConfigDao; import com.qniao.dam.query.prc.PointRewardConfigQueryService; import com.qniao.framework.utils.PageUtil; @@ -21,4 +24,12 @@ public class PointRewardConfigQueryServiceImpl implements PointRewardConfigQuery UserPagePointRewardConfigQueryParams queryParams) { return pointRewardConfigDao.page(pageUtil.toPageWithoutOrders(), queryParams); } + + @Override + public PointRewardConfig queryEnableByType(PointRewardConfigTypeEnum type) { + return pointRewardConfigDao.selectOne(new LambdaQueryWrapper() + .eq(PointRewardConfig::getType, type) + .eq(PointRewardConfig::getEnable, true) + .last("limit 1")); + } } \ No newline at end of file