123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- package com.txz.cif.service.impl;
- import cn.hutool.core.collection.CollUtil;
- import cn.hutool.core.date.DateUtil;
- import cn.hutool.core.util.IdUtil;
- import com.github.pagehelper.PageHelper;
- import com.txz.cif.constants.MyConstants;
- import com.txz.cif.dao.RedEnvelopeMapper;
- import com.txz.cif.dto.Result;
- import com.txz.cif.dubbo.client.OperatingConfigDubboServiceClient;
- import com.txz.cif.enums.BizTypeEnum;
- import com.txz.cif.model.Account;
- import com.txz.cif.model.ConfigMember;
- import com.txz.cif.model.RedEnvelope;
- import com.txz.cif.model.User;
- import com.txz.cif.param.SignRedEnvelopeParam;
- import com.txz.cif.service.AccountService;
- import com.txz.cif.service.ConfigMemberService;
- import com.txz.cif.service.RedEnvelopeService;
- import com.txz.cif.core.AbstractService;
- import com.txz.cif.service.UserService;
- import com.txz.cif.web.bo.UserTopBo;
- import com.txz.cif.web.para.RedEnvelopeParam;
- import com.txz.operating.dto.ConfigDTO;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import tk.mybatis.mapper.entity.Condition;
- import javax.annotation.Resource;
- import java.math.BigDecimal;
- import java.math.RoundingMode;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.List;
- /**
- * Created by CodeGenerator on 2025/07/15.
- */
- @Service
- @Transactional
- public class RedEnvelopeServiceImpl extends AbstractService<RedEnvelope> implements RedEnvelopeService {
- @Resource
- private RedEnvelopeMapper cRedEnvelopeMapper;
- @Resource
- private AccountService accountService;
- @Resource
- private UserService userService;
- @Resource
- private OperatingConfigDubboServiceClient operatingConfigDubboServiceClient;
- @Resource
- private ConfigMemberService configMemberService;
- /**
- * 类型 1充值 2提现 3参团 4退款 5开团红包 6参团红包 7签到红包 8下级红包佣金 9下下级红包佣金
- * @param param
- * @return
- */
- @Override
- public Result addRedEnvelope(RedEnvelopeParam param) {
- com.txz.operating.result.Result<ConfigDTO> redEnvelopeSettelDay = operatingConfigDubboServiceClient.getConfigByCode("red_envelope_settel_day_"+param.getBizType());
- Integer settleDay = Integer.parseInt(redEnvelopeSettelDay.getData().getValueInfo());
- Date settleTime = DateUtil.offsetDay(param.getTransTime(),settleDay);
- List<RedEnvelope> redEnvelopes = new ArrayList<>();
- if (BizTypeEnum.getByKey(param.getBizType()) == BizTypeEnum.OPEN_GROUP_RED_ENVELOPE){
- //开团红包
- redEnvelopes.addAll(bulidRedEnvelope(param.getUserIds().get(0),param,settleTime)) ;
- } else if (BizTypeEnum.getByKey(param.getBizType()) == BizTypeEnum.JOIN_GROUP_RED_ENVELOPE){
- //参团红包
- for (Long userId:param.getUserIds()){
- redEnvelopes.addAll(bulidRedEnvelope(userId,param,settleTime)) ;
- }
- } else if (BizTypeEnum.getByKey(param.getBizType()) == BizTypeEnum.SIGN_RED_ENVELOPE){
- //签到红包
- redEnvelopes.addAll(bulidRedEnvelope(param.getUserIds().get(0),param,settleTime)) ;
- }else if (BizTypeEnum.getByKey(param.getBizType()) == BizTypeEnum.PROMOTION_COMMISSION){
- //直推红包
- redEnvelopes.addAll(bulidRedEnvelope(param.getUserIds().get(0),param,settleTime)) ;
- }
- if (CollUtil.isNotEmpty(redEnvelopes)){
- save(redEnvelopes);
- }
- return null;
- }
- @Override
- public BigDecimal sumWithDay(Integer day, Long userId,Integer type) {
- if (day == null){
- return cRedEnvelopeMapper.sumWithDay(null,userId,type);
- } else {
- return cRedEnvelopeMapper.sumWithDay(DateUtil.offsetDay(DateUtil.date(),-day),userId,type);
- }
- }
- @Override
- public List<UserTopBo> top(Integer type, Integer page, Integer size) {
- PageHelper.startPage(page, size);
- HashMap<String,Object> map = new HashMap<>();
- map.put("page",page);
- map.put("size",size);
- map.put("startTime",DateUtil.offsetDay(DateUtil.date(),-8));
- map.put("endTime",DateUtil.yesterday());
- return cRedEnvelopeMapper.top( map);
- }
- /**
- * 构建红包对象
- * @param userId
- * @param param
- * @param settleTime
- * @return
- */
- private List<RedEnvelope> bulidRedEnvelope(Long userId, RedEnvelopeParam param, Date settleTime) {
- List<RedEnvelope> ret = new ArrayList<>();
- //红包
- ret.add(bulidRedEnvelope2(1,userId,param,settleTime)) ;
- // 开团、参团 才有 佣金红包
- if (BizTypeEnum.getByKey(param.getBizType()) == BizTypeEnum.OPEN_GROUP_RED_ENVELOPE
- || BizTypeEnum.getByKey(param.getBizType()) == BizTypeEnum.JOIN_GROUP_RED_ENVELOPE ){
- //只有 开团、参团 有分佣
- User user = userService.findById(userId);
- if (user.getPid() != null){
- //找父亲 上级分佣
- ret.add(bulidRedEnvelope2(2,user.getPid(),param,settleTime)) ;
- if (user.getPpid() != null){
- //找爷爷 上上级分佣
- ret.add(bulidRedEnvelope2(3,user.getPpid(),param,settleTime)) ;
- }
- }
- }
- return ret;
- }
- /**
- *
- * @param type 1自己 2父亲 3爷爷
- * @param userId
- * @param param
- * @param settleTime
- * @return
- */
- private RedEnvelope bulidRedEnvelope2(Integer type , Long userId, RedEnvelopeParam param, Date settleTime) {
- Condition c = new Condition(Account.class);
- c.createCriteria().andEqualTo("userId", userId)
- .andEqualTo("bizType",2);
- List<Account> accounts = accountService.findByCondition(c);
- Account account = accounts.get(0);
- Integer bizType = type == 1?param.getBizType(): type==2? BizTypeEnum.FIRST_COMMISSION.getKey():BizTypeEnum.SECONDARY_COMMISSION.getKey();
- // 一级二级分佣重新计算结算时间
- if (type > 1){
- com.txz.operating.result.Result<ConfigDTO> redEnvelopeSettelDay = operatingConfigDubboServiceClient.getConfigByCode("red_envelope_settel_day_"+bizType);
- Integer settleDay = Integer.parseInt(redEnvelopeSettelDay.getData().getValueInfo());
- settleTime = DateUtil.offsetDay(param.getTransTime(),settleDay);
- }
- Long id = IdUtil.getSnowflake(1,1).nextId();
- //借:营销账户(负债类201)(贷) -100元
- //贷:个人账户(负债类202)(贷) +100元
- BigDecimal amount = param.getAmount();
- if (type > 1 ){
- User user = userService.findById(userId);
- ConfigMember level = configMemberService.findBy("level", user.getVipLevel());
- if (type == 2){
- amount = amount.multiply(level.getDirectReferralReward()).divide(BigDecimal.valueOf(100),2, RoundingMode.DOWN);
- } else {
- amount = amount.multiply(level.getIndirectReferralReward()).divide(BigDecimal.valueOf(100),2, RoundingMode.DOWN);
- }
- }
- RedEnvelope redEnvelope = RedEnvelope.builder()
- .amount(amount)
- .createTime(DateUtil.date())
- .orderNo(param.getOrderNo())
- //类型: 1(自己) 返回 1(开团)或2(参团) 2(父亲)返回4(上级分佣) 3(爷爷)返回5(上上级分佣)
- .bizType(bizType)
- .debitAccount(MyConstants.INNER_MARKETING)
- .creditAccount(account.getId())
- .transTime(param.getTransTime())
- .status(1)
- .userId(param.getUserIds().get(0))
- .tranNo(id+"")
- .settleTime(settleTime)
- .build();
- return redEnvelope;
- }
- }
|