package com.xzx.gc.order.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.xzx.gc.common.constant.CommonEnum; import com.xzx.gc.common.constant.OrderEnum; import com.xzx.gc.common.constant.PayEnum; import com.xzx.gc.common.constant.SysEnum; import com.xzx.gc.common.utils.BusinessUtil; import com.xzx.gc.common.utils.IdUtils; import com.xzx.gc.common.utils.SpringUtil; import com.xzx.gc.entity.*; import com.xzx.gc.model.comon.account.AllAcountParamDto; import com.xzx.gc.model.user.AccountVo; import com.xzx.gc.order.mapper.*; import com.xzx.gc.service.BaseAccountService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @Service @Transactional @Slf4j public class PromotionRebateService extends BaseAccountService { @Autowired private UserService userService; @Autowired private OrderMapper orderMapper; @Autowired private AccountService accountService; @Autowired private BusinessUtil businessUtil; @Autowired private PayInfoMapper payInfoMapper; @Autowired private PartnerAccountLogService partnerAccountLogService; @Autowired private PartnerAccountService partnerAccountService; @Autowired private SysMessageMapper sysMessageMapper; @Autowired private IdUtils idUtils; @Autowired private AccountLogService accountLogService; @Autowired private ConfigService configService; @Autowired private OtherUserService otherUserService; @Autowired private UserTargetInfoService userTargetInfoService; @Autowired private OrderItemService orderItemService; @Autowired private AccountMapper accountMapper; @Override public Object account(AllAcountParamDto allAcountParamDto) { String now = DateUtil.now(); //推广返利 //回收员返利开关 0 开启 int receiveSwitch = 1; //推广员返利开关 int proSwitch = 1; //返利比例 BigDecimal scale = BigDecimal.ZERO; //推广员返利有效时长 天 int days = 0; //回收员返利有效时长 天 int receiveDays = 0; //支持的合伙人 List partnerIds=CollUtil.newArrayList(); List promotion_rebate = configService.findByGroup("PROMOTION_REBATE"); for (ConfigInfo configInfo : promotion_rebate) { String configTypeCode = configInfo.getConfigTypeCode(); String configValue = configInfo.getConfigValue(); if (configTypeCode.equals("PROMOTION_REBATE_RECEIVE_SWITCH")) { receiveSwitch = Convert.toInt(configValue); } else if (configTypeCode.equals("PROMOTION_REBATE_SWITCH")) { proSwitch = Convert.toInt(configValue); } else if (configTypeCode.equals("PROMOTION_REBATE_SCALE")) { scale = Convert.toBigDecimal(configValue); } else if (configTypeCode.equals("PROMOTION_REBATE_DAYS")) { days = Convert.toInt(configValue); } else if (configTypeCode.equals("PROMOTION_REBATE_RECEIVE_DAYS")) { receiveDays = Convert.toInt(configValue); }else if(configTypeCode.equals("PROMOTION_PARTNER_ID")){ if(StrUtil.isNotBlank(configValue)){ partnerIds= CollUtil.toList(configValue.split(",")); } } } //存在返利开关开启 if (receiveSwitch == 0 || proSwitch == 0) { String orderId = allAcountParamDto.getFlowNo(); //查询出所有订单列表 List byIds = orderMapper.findByIds(orderId.split(",")); //去重用户 ArrayList collect = byIds.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(OrderInfo::getCreateUserId))), ArrayList::new)); //去重平台用户 for (Iterator iterator = collect.iterator(); iterator.hasNext(); ) { OrderInfo orderInfo = iterator.next(); String createMobile = orderInfo.getCreateMobile(); List byMobile = otherUserService.findByMobile(createMobile); if (CollUtil.isNotEmpty(byMobile)) { iterator.remove(); } } //先筛选是被推广的用户 List collect1 = collect.stream().map(OrderInfo::getCreateUserId).collect(Collectors.toList()); //所有下单的用户 List byIds1 = userService.findByIds(collect1); if (CollUtil.isNotEmpty(collect)) { List collect2 = byIds1.stream().map(UserInfo::getMobilePhone).collect(Collectors.toList()); //筛选没推广人的用户 List byMobiles = userTargetInfoService.findByMobiles(collect2); if (CollUtil.isNotEmpty(byMobiles)) { List mobiles = byMobiles.stream().map(UserTargetInfo::getMobile).collect(Collectors.toList()); List collect3 = collect.stream().filter(x -> mobiles.contains(x.getCreateMobile())).collect(Collectors.toList()); if (CollUtil.isNotEmpty(collect3)) { // // //筛选当前还没被返利的用户 // for (Iterator iterator = collect3.iterator(); iterator.hasNext(); ) { // OrderInfo next = iterator.next(); // payInfoService.findByOtherAndUserAndType(next.getCreateUserId()) // List byInviteUserIdAndType = platformCapitalSevice.findByInviteUserIdAndType(next.getCreateUserId(), UserEnum.推广返利规则.getValue()); // if(CollUtil.isNotEmpty(byInviteUserIdAndType)){ // iterator.remove(); // } // } //设置当前用户的推广人 for (Iterator iterator = collect3.iterator(); iterator.hasNext(); ) { OrderInfo orderInfo = iterator.next(); String createMobile = orderInfo.getCreateMobile(); List collect4 = byMobiles.stream().filter(x -> x.getMobile().equals(createMobile)).collect(Collectors.toList()); String realUserId = collect4.get(0).getRealUserId(); orderInfo.setRealUserId(realUserId); OtherUserInfo otherUserInfo = otherUserService.findById(realUserId); //筛选出当前回收员的合伙人不等于配置的合伙人 if(!partnerIds.contains(otherUserInfo.getPartnerId())){ iterator.remove(); continue; } orderInfo.setRealUserType(otherUserInfo.getUserType()); orderInfo.setPartnerId(otherUserInfo.getPartnerId()); } //筛选注册时间和下单完成时间相差在有效范围内 for (Iterator iterator = collect3.iterator(); iterator.hasNext(); ) { OrderInfo orderInfo = iterator.next(); //下单人注册时间 String registTime = orderInfo.getRegistTime(); //订单完成时间 String completeTime = orderInfo.getCompleteTime(); long l = 0; if (SpringUtil.isProd()) { l = DateUtil.betweenDay(DateUtil.parseDateTime(registTime), DateUtil.parseDateTime(completeTime), true); } else { l = DateUtil.between(DateUtil.parseDateTime(registTime), DateUtil.parseDateTime(completeTime), DateUnit.MINUTE); } if (StrUtil.isNotBlank(orderInfo.getRealUserType())) { if (CommonEnum.回收员.getValue().equals(orderInfo.getRealUserType())) { if (l > receiveDays) { iterator.remove(); } else if (receiveSwitch == 1) { iterator.remove(); } } else if (CommonEnum.推广员.getValue().equals(orderInfo.getRealUserType())) { if (l > days) { iterator.remove(); } else if (proSwitch == 1) { iterator.remove(); } } } else { iterator.remove(); } } //筛选订单含有纸的小类信息 for (Iterator iterator = collect3.iterator(); iterator.hasNext(); ) { OrderInfo orderInfo = iterator.next(); String orderId1 = orderInfo.getOrderId(); String addressId = orderInfo.getAddressId(); //查询回收员区域 List byOrderIdAndPaper = orderItemService.findByOrderIdAndPaper(orderId1, addressId); if (CollUtil.isEmpty(byOrderIdAndPaper)) { iterator.remove(); } else { orderInfo.setPaperItemList(byOrderIdAndPaper); } } //进行返利 注意如果推广用户有回收员身份,需要返利到其回收员账户上 List accountVos=null; for (OrderInfo orderInfo : collect3) { //每个订单下纸类的总金额 BigDecimal paperMoney = new BigDecimal("0"); List paperItemList = orderInfo.getPaperItemList(); for (OrderItemInfo orderItemInfo : paperItemList) { String money = orderItemInfo.getMoney(); paperMoney = NumberUtil.add(paperMoney, Convert.toBigDecimal(money)); } //返利的金额 BigDecimal mul = NumberUtil.mul(paperMoney, scale); if(mul.compareTo(BigDecimal.ZERO)==0){ continue; } // allMul = NumberUtil.add(allMul, mul); String s = businessUtil.changeMoney(Convert.toStr(mul)); String realUserId = orderInfo.getRealUserId(); if (CommonEnum.回收员.getValue().equals(orderInfo.getRealUserType())) { } else if (CommonEnum.推广员.getValue().equals(orderInfo.getRealUserType())) { //如果存在回收员的身份。则转换成回收员或入库员的账户操作 OtherUserInfo otherUserInfo1 = otherUserService.turnReceiver(realUserId); if (otherUserInfo1 != null) { realUserId = otherUserInfo1.getUserId(); } } Map hashMap = new HashMap(); hashMap.put("userId", realUserId); accountVos = accountMapper.queryMyMoney(hashMap); if (CollUtil.isNotEmpty(accountVos)) { AccountVo accountVo1 = accountVos.get(0); allAcountParamDto.setFlowNo(orderInfo.getOrderId()); allAcountParamDto.setOtherUserId(realUserId); allAcountParamDto.setMoney(Convert.toBigDecimal(s)); allAcountParamDto.setOtherAccountId(accountVo1.getAccountId()); allAcountParamDto.setOtherOldMoney(Convert.toBigDecimal(accountVo1.getMoney())); allAcountParamDto.setPartnerId(orderInfo.getPartnerId()); log.debug("准备进行推广返利支出操作:{}", JSONUtil.toJsonPrettyStr(allAcountParamDto)); //推广返利 合伙人扣钱,推广用户加钱 Map payMap = new HashMap(); String payOrderId = idUtils.generate("ZF", 0); payMap.put("payOrderId", payOrderId); payMap.put("orderId", allAcountParamDto.getFlowNo()); payMap.put("createUserId", allAcountParamDto.getOtherUserId()); payMap.put("money", allAcountParamDto.getMoney()); payMap.put("accountId", allAcountParamDto.getOtherAccountId()); payMap.put("payType", PayEnum.分享返利.getValue()); payMap.put("status", PayEnum.已支付.getValue()); payMap.put("createTime", now); payInfoMapper.payInfoAdd(payMap); //推广员账号变更 accountService.updateMoneyByUserId(allAcountParamDto.getOtherUserId(), allAcountParamDto.getMoney()); AccountLog accountLog = new AccountLog(); accountLog.setCreateTime(now); accountLog.setAccountId(allAcountParamDto.getOtherAccountId()); accountLog.setCreateUserId(allAcountParamDto.getOtherUserId()); accountLog.setChannelType(Convert.toShort(CommonEnum.推广返利.getValue())); accountLog.setOldMoney(Convert.toStr(allAcountParamDto.getOtherOldMoney())); accountLog.setNewMoney(Convert.toStr(NumberUtil.add(Convert.toBigDecimal(accountLog.getOldMoney()), allAcountParamDto.getMoney()))); accountLog.setOrderId(payOrderId); accountLogService.add(accountLog); //合伙人账户变更 PartnerAccountLog partnerAccountLog = new PartnerAccountLog(); partnerAccountLog.setPartnerId(allAcountParamDto.getPartnerId()); partnerAccountLog.setFlowNo(allAcountParamDto.getFlowNo()); partnerAccountLog.setType(OrderEnum.推广返利.getValue()); partnerAccountLog.setMoney("-" + businessUtil.changeMoney(allAcountParamDto.getMoney())); partnerAccountLog.setRuleId(allAcountParamDto.getRuleId()); partnerAccountLogService.add(partnerAccountLog); //修改合伙人账户 partnerAccountService.updateReduceMoneyByPartnerId(allAcountParamDto.getPartnerId(), allAcountParamDto.getMoney()); //入库员消息 SysMessage sysMessage = new SysMessage(); sysMessage.setCreateTime(now); sysMessage.setCreateUserId(allAcountParamDto.getUserId()); sysMessage.setFlag(SysEnum.未读.getValue()); sysMessage.setMessage("订单" + allAcountParamDto.getFlowNo() + "入库完成,您收到返利" + allAcountParamDto.getMoney() + "元"); sysMessage.setMessageSubTypeName("推广返利"); //充值提现根据文字匹配 不根据类型 sysMessage.setMessageType(SysEnum.返利.getValue()); sysMessage.setUserId(allAcountParamDto.getOtherUserId()); sysMessageMapper.insert(sysMessage); } } if (CollUtil.isNotEmpty(accountVos)) { log.debug("推广返利支出操作已完成"); } } } } } // if end return null; } }