3 files added
16 files modified
New file |
| | |
| | | package cc.mrbird.febs.common.enumerates; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | @Getter |
| | | public enum ScoreFlowTypeEnum { |
| | | |
| | | /** |
| | | * |
| | | */ |
| | | PAY(1, "积分支付"), |
| | | |
| | | BUY(2, "购买商品获得积分"); |
| | | |
| | | private final int value; |
| | | |
| | | private final String desc; |
| | | |
| | | ScoreFlowTypeEnum(int value, String desc) { |
| | | this.value = value; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | public static String getDescByValue(int value) { |
| | | for (ScoreFlowTypeEnum scoreFlowTypeEnum : values()) { |
| | | if (value == scoreFlowTypeEnum.getValue()) { |
| | | return scoreFlowTypeEnum.getDesc(); |
| | | } |
| | | } |
| | | |
| | | return ""; |
| | | } |
| | | |
| | | } |
| | |
| | | package cc.mrbird.febs.mall.service.impl; |
| | | |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.common.enumerates.AgentLevelEnum; |
| | | import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; |
| | | import cc.mrbird.febs.common.enumerates.FlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.*; |
| | | import cc.mrbird.febs.common.exception.FebsException; |
| | | import cc.mrbird.febs.common.properties.XcxProperties; |
| | | import cc.mrbird.febs.common.utils.*; |
| | |
| | | Long id = LoginUserUtil.getLoginUser().getId(); |
| | | moneyFlowDto.setMemberId(id); |
| | | IPage<MoneyFlowVo> pages = mallMoneyFlowMapper.selectApiMoneyFlowInPage(page, moneyFlowDto); |
| | | |
| | | // if (moneyFlowDto.getFlowType() == 3) { |
| | | // pages.getRecords().forEach(item -> { |
| | | // item.setDescription(ScoreFlowTypeEnum.getDescByValue(item.getType())); |
| | | // }); |
| | | // } |
| | | return new FebsResponse().success().data(pages); |
| | | } |
| | | |
| | |
| | | import cc.mrbird.febs.pay.service.IXcxPayService; |
| | | import cc.mrbird.febs.pay.util.WeixinServiceUtil; |
| | | import cc.mrbird.febs.rabbit.producter.AgentProducer; |
| | | import cc.mrbird.febs.vip.service.IMallVipConfigBenefitsService; |
| | | import cc.mrbird.febs.vip.service.IMallVipConfigService; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.date.DateUnit; |
| | | import cn.hutool.core.date.DateUtil; |
| | |
| | | private final MallMemberCouponMapper mallMemberCouponMapper; |
| | | private final MallGoodsCouponMapper mallGoodsCouponMapper; |
| | | private final CouponGoodsMapper couponGoodsMapper; |
| | | |
| | | private final IMallVipConfigService mallVipConfigService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue(),"余额支付",2); |
| | | |
| | | agentProducer.sendOrderCoupon(orderInfo.getId()); |
| | | agentProducer.sendGetScoreMsg(orderInfo.getId()); |
| | | break; |
| | | case "4": |
| | | if (orderInfo.getOrderType() != 2) { |
| | |
| | | @ApiModelProperty(value = "时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date createdTime; |
| | | |
| | | |
| | | @ApiModelProperty(value = "描述") |
| | | private String description; |
| | | |
| | | @ApiModelProperty(value = "备注") |
| | | private String remark; |
| | | } |
| | |
| | | mallOrderInfoMapper.updateById(order); |
| | | |
| | | agentProducer.sendOrderCoupon(order.getId()); |
| | | agentProducer.sendGetScoreMsg(order.getId()); |
| | | |
| | | mallMoneyFlowService.addMoneyFlow( |
| | | order.getMemberId(), |
| | |
| | | public static final String ORDER_RETURN_MONEY = "queue_order_return_money_qay"; |
| | | |
| | | public static final String ORDER_COUPON = "queue_order_coupon"; |
| | | |
| | | public static final String GET_SCORE_MSG = "queue_get_score_msg"; |
| | | } |
| | |
| | | import cc.mrbird.febs.mall.service.IMemberProfitService; |
| | | import cc.mrbird.febs.rabbit.constants.QueueConstants; |
| | | import cc.mrbird.febs.rabbit.enumerates.RabbitQueueEnum; |
| | | import cc.mrbird.febs.vip.service.IVipCommonService; |
| | | import com.rabbitmq.client.Channel; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.amqp.core.Message; |
| | |
| | | log.error("使用优惠卷异常:", e); |
| | | } |
| | | } |
| | | |
| | | @Autowired |
| | | private IVipCommonService vipCommonService; |
| | | |
| | | @RabbitListener(queues = QueueConstants.GET_SCORE_MSG) |
| | | public void getScoreMsg(Long orderId) { |
| | | log.info("收到积分消息:{}", orderId); |
| | | try { |
| | | vipCommonService.getScore(orderId); |
| | | } catch (Exception e) { |
| | | log.error("获取积分消息异常", e); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | ORDER_RETURN_MONEY("exchange_order_return_money_qay", "route_key_order_return_money_qay", "queue_order_return_money_qay"), |
| | | |
| | | ORDER_COUPON("exchange_order_coupon", "route_key_order_coupon", QueueConstants.ORDER_COUPON); |
| | | ORDER_COUPON("exchange_order_coupon", "route_key_order_coupon", QueueConstants.ORDER_COUPON), |
| | | |
| | | GET_SCORE_MSG("exchange_get_score_msg", "route_key_get_score_msg", QueueConstants.GET_SCORE_MSG); |
| | | |
| | | private String exchange; |
| | | |
| | |
| | | CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); |
| | | rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_COUPON.getExchange(), RabbitQueueEnum.ORDER_COUPON.getRoute(), id, correlationData); |
| | | } |
| | | |
| | | public void sendGetScoreMsg(Long orderId) { |
| | | log.info("发送获得积分消息:{}", orderId); |
| | | |
| | | CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); |
| | | rabbitTemplate.convertAndSend(RabbitQueueEnum.GET_SCORE_MSG.getExchange(), RabbitQueueEnum.GET_SCORE_MSG.getRoute(), orderId, correlationData); |
| | | } |
| | | } |
| | |
| | | import cc.mrbird.febs.common.controller.BaseController; |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.vip.entity.MallVipBenefits; |
| | | import cc.mrbird.febs.vip.entity.MallVipConfig; |
| | | import cc.mrbird.febs.vip.service.IMallVipBenefitsService; |
| | | import cc.mrbird.febs.vip.service.IMallVipConfigService; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import io.swagger.annotations.ApiResponse; |
| | | import io.swagger.annotations.ApiResponses; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | |
| | | |
| | | @ApiOperation(value = "获取会员等级列表") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = MallVipConfig.class) |
| | | }) |
| | | @GetMapping(value = "/findVipList") |
| | | public FebsResponse findVipList() { |
| | | return new FebsResponse().success().data(mallVipConfigService.findConfigList()); |
| | | } |
| | | |
| | | @ApiOperation(value = "获取权益详情") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = MallVipBenefits.class) |
| | | }) |
| | | @GetMapping(value = "/findBenefitsDetailList/{id}") |
| | | public FebsResponse findVipDetailList(@PathVariable("id") Long id) { |
| | | MallVipBenefits vipBenefits = mallVipBenefitsService.findVipBenefitsById(id); |
| | |
| | | import cc.mrbird.febs.common.entity.BaseEntity; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | |
| | | |
| | | @Data |
| | | @TableName("mall_vip_benefits") |
| | | @ApiModel(value = "MallVipBenefits") |
| | | public class MallVipBenefits extends BaseEntity { |
| | | |
| | | /** |
| | | * 权益名称 |
| | | */ |
| | | @ApiModelProperty(value = "权益名称") |
| | | private String name; |
| | | |
| | | /** |
| | |
| | | /** |
| | | * 权益图标 |
| | | */ |
| | | @ApiModelProperty(value = "权益图标") |
| | | private String icon; |
| | | |
| | | /** |
| | |
| | | import cc.mrbird.febs.common.entity.BaseEntity; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | @TableName("mall_vip_benefits_details") |
| | | @ApiModel(value = "MallVipBenefitsDetails") |
| | | public class MallVipBenefitsDetails extends BaseEntity { |
| | | |
| | | /** |
| | | * 图片链接 |
| | | */ |
| | | @ApiModelProperty(value = "图片") |
| | | private String image; |
| | | |
| | | /** |
| | | * 是否可点击;1-是 2-否 |
| | | */ |
| | | @ApiModelProperty(value = "是否可点击") |
| | | private Integer isClick; |
| | | |
| | | /** |
| | | * 链接类型;1-链接 2-领取商品 3-优惠券 |
| | | */ |
| | | @ApiModelProperty(value = "1-链接 2-领取商品 3-优惠券") |
| | | private Integer linkType; |
| | | |
| | | /** |
| | | * 内容;根据linkType来的 |
| | | */ |
| | | @ApiModelProperty(value = "跳转的链接或者商品/优惠券的ID") |
| | | private String content; |
| | | |
| | | /** |
| | |
| | | import cc.mrbird.febs.common.entity.BaseEntity; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | @ApiModel(value = "MallVipConfig") |
| | | @TableName("mall_vip_config") |
| | | public class MallVipConfig extends BaseEntity { |
| | | |
| | | |
| | | /** |
| | | * 会员名称 |
| | | */ |
| | | @ApiModelProperty(value = "名称") |
| | | private String name; |
| | | |
| | | /** |
| | | * 主图 |
| | | */ |
| | | @ApiModelProperty(value = "主图") |
| | | private String thumb; |
| | | |
| | | /** |
| | | * 会员编码 |
| | | */ |
| | | private String code; |
| | | |
| | | /** |
| | | * 等级 |
| | | */ |
| | | @ApiModelProperty(value = "会员等级") |
| | | private Integer level; |
| | | |
| | | /** |
| | |
| | | import cc.mrbird.febs.vip.entity.MallVipConfig; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.util.List; |
| | | |
| | |
| | | IPage<MallVipConfig> findVipConfigListInPage(IPage<MallVipConfig> page); |
| | | |
| | | List<MallVipConfig> selectVipConfigList(); |
| | | |
| | | MallVipConfig selectVipConfigByCode(@Param("code") String code); |
| | | } |
| | |
| | | package cc.mrbird.febs.vip.service; |
| | | |
| | | import cc.mrbird.febs.common.entity.QueryRequest; |
| | | import cc.mrbird.febs.vip.entity.MallVipBenefits; |
| | | import cc.mrbird.febs.vip.entity.MallVipBenefitsDetails; |
| | | import cc.mrbird.febs.vip.entity.MallVipConfig; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | |
| | | void editVipConfig(MallVipConfig config); |
| | | |
| | | void delVipConfig(Long id); |
| | | |
| | | MallVipBenefits hasVipBenefits(Long memberId); |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.vip.service; |
| | | |
| | | public interface IVipCommonService { |
| | | |
| | | void getScore(Long orderId); |
| | | } |
| | |
| | | package cc.mrbird.febs.vip.service.impl; |
| | | |
| | | import cc.mrbird.febs.common.entity.QueryRequest; |
| | | import cc.mrbird.febs.common.exception.FebsException; |
| | | import cc.mrbird.febs.mall.entity.MallMember; |
| | | import cc.mrbird.febs.mall.mapper.MallMemberMapper; |
| | | import cc.mrbird.febs.vip.entity.MallVipBenefits; |
| | | import cc.mrbird.febs.vip.entity.MallVipConfig; |
| | | import cc.mrbird.febs.vip.entity.MallVipConfigBenefits; |
| | | import cc.mrbird.febs.vip.mapper.MallVipConfigBenefitsMapper; |
| | |
| | | import cc.mrbird.febs.vip.service.IMallVipConfigBenefitsService; |
| | | import cc.mrbird.febs.vip.service.IMallVipConfigService; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.date.DatePattern; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | |
| | | @Slf4j |
| | | @Service |
| | |
| | | public class MallVipConfigServiceImpl extends ServiceImpl<MallVipConfigMapper, MallVipConfig> implements IMallVipConfigService { |
| | | |
| | | private final IMallVipConfigBenefitsService mallVipConfigBenefitsService; |
| | | private final MallMemberMapper mallMemberMapper; |
| | | |
| | | @Override |
| | | public IPage<MallVipConfig> vipConfigList(QueryRequest request) { |
| | |
| | | delQuery.eq(MallVipConfigBenefits::getConfigId, id); |
| | | this.mallVipConfigBenefitsService.remove(delQuery); |
| | | } |
| | | |
| | | @Override |
| | | public MallVipBenefits hasVipBenefits(Long memberId) { |
| | | MallMember member = mallMemberMapper.selectById(memberId); |
| | | if (member == null) { |
| | | throw new FebsException("会员不存在"); |
| | | } |
| | | |
| | | MallVipConfig vipConfig = this.baseMapper.selectVipConfigByCode(member.getLevel()); |
| | | if (vipConfig == null) { |
| | | throw new FebsException("会员配置不存在"); |
| | | } |
| | | |
| | | String today = DateUtil.format(new Date(), DatePattern.NORM_DATE_PATTERN); |
| | | boolean isBirthday = member.getBirthday().compareTo(DateUtil.parseDate(today)) == 0; |
| | | List<MallVipBenefits> benefits = vipConfig.getBenefits(); |
| | | Optional<MallVipBenefits> max = benefits.stream().filter(item -> { |
| | | if (item.getScoreMultiple() == null) { |
| | | return false; |
| | | } |
| | | |
| | | // 生日权益 |
| | | if (item.getGainType() == 2 && isBirthday) { |
| | | return true; |
| | | } |
| | | |
| | | // 会员日 |
| | | return item.getGainType() == 1; |
| | | }).max(Comparator.comparing(MallVipBenefits::getScoreMultiple)); |
| | | |
| | | return max.orElseGet(max::get); |
| | | } |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.vip.service.impl; |
| | | |
| | | import cc.mrbird.febs.common.enumerates.FlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.ScoreFlowTypeEnum; |
| | | import cc.mrbird.febs.mall.entity.MallOrderInfo; |
| | | import cc.mrbird.febs.mall.entity.MallOrderItem; |
| | | import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; |
| | | import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; |
| | | import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; |
| | | import cc.mrbird.febs.mall.service.IMallMoneyFlowService; |
| | | import cc.mrbird.febs.vip.entity.MallVipBenefits; |
| | | import cc.mrbird.febs.vip.service.IMallVipConfigService; |
| | | import cc.mrbird.febs.vip.service.IVipCommonService; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Slf4j |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class VipCommonServiceImpl implements IVipCommonService { |
| | | |
| | | private final MallOrderInfoMapper mallOrderInfoMapper; |
| | | private final IMallVipConfigService mallVipConfigService; |
| | | private final IMallMoneyFlowService mallMoneyFlowService; |
| | | private final IApiMallMemberWalletService mallMemberWalletService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void getScore(Long orderId) { |
| | | MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectOrderDetailsById(orderId); |
| | | if (mallOrderInfo == null) { |
| | | return; |
| | | } |
| | | |
| | | Long memberId = mallOrderInfo.getMemberId(); |
| | | MallVipBenefits mallVipBenefits = mallVipConfigService.hasVipBenefits(memberId); |
| | | |
| | | BigDecimal multiple = BigDecimal.ONE; |
| | | String name = ""; |
| | | if (mallVipBenefits != null) { |
| | | multiple = mallVipBenefits.getScoreMultiple(); |
| | | name = mallVipBenefits.getName(); |
| | | } |
| | | |
| | | double sum = mallOrderInfo.getItems().stream().map(MallOrderItem::getAmount).mapToDouble(BigDecimal::doubleValue).sum(); |
| | | |
| | | int score = multiple.multiply(BigDecimal.valueOf(sum)).intValue(); |
| | | |
| | | mallMoneyFlowService.addMoneyFlow(memberId, new BigDecimal(score), ScoreFlowTypeEnum.BUY.getValue(), mallOrderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue(), name, 2); |
| | | mallMemberWalletService.add(new BigDecimal(score), memberId, "prize_score"); |
| | | } |
| | | } |
| | |
| | | inner join mall_vip_config_benefits configBenefits on config.id=configBenefits.config_id |
| | | inner join mall_vip_benefits benefits on configBenefits.benefits_id=benefits.id |
| | | </select> |
| | | |
| | | <select id="selectVipConfigByCode" resultMap="vipConfigMap"> |
| | | select |
| | | config.* |
| | | ,benefits.id c_id |
| | | ,benefits.name c_name |
| | | ,benefits.icon c_icon |
| | | from mall_vip_config config |
| | | inner join mall_vip_config_benefits configBenefits on config.id=configBenefits.config_id |
| | | inner join mall_vip_benefits benefits on configBenefits.benefits_id=benefits.id |
| | | where config.code=#{code} |
| | | </select> |
| | | </mapper> |