package com.xzx.gc.order.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.text.StrBuilder; import com.xzx.gc.common.constant.Constants; import com.xzx.gc.common.constant.UserEnum; import com.xzx.gc.common.utils.BusinessUtil; import com.xzx.gc.common.utils.StringUtils; import com.xzx.gc.entity.OtherUserInfo; import com.xzx.gc.entity.RebateRule; import com.xzx.gc.entity.RedPaperRule; import com.xzx.gc.entity.UserInfo; import com.xzx.gc.order.dto.RuleDto; import com.xzx.gc.order.mapper.OrderMapper; import com.xzx.gc.order.mapper.RebateRuleMapper; import com.xzx.gc.order.mapper.UserMapper; 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.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @Service @Transactional @Slf4j public class RuleService { @Autowired private RedPaperRuleService redPaperRuleService; @Autowired private OrderService orderService; @Autowired private RebateRuleService rebateRuleService; @Autowired private OtherUserService otherUserService; @Autowired private UserService userService; /** * 查询用户重量返利 * @param userId * @param checkFlag 检查参与用户是平台用户则弃掉 * @return */ public RuleDto findWeightRebate(String userId,boolean checkFlag,String partnerId){ RuleDto ruleDto = new RuleDto(); if(checkFlag){ UserInfo byId = userService.findById(userId); if(byId!=null){ String mobilePhone = byId.getMobilePhone(); List byMobile = otherUserService.findByMobile(mobilePhone); if(CollUtil.isNotEmpty(byMobile)) { return ruleDto; } } } RedPaperRule one = redPaperRuleService.getOne(UserEnum.重量返利规则.getValue(),partnerId); if (one != null) { ruleDto.setRuleId(one.getId()); String s = changeProductType(one.getProductType()); ruleDto.setProductType(s); List rebateRules = rebateRuleService.findByRuleId(one.getId()); ruleDto.setRebateRules(rebateRules); } else { log.warn("重量返利规则不存在"); } return ruleDto; } /** * 查询用户阶梯返利 * @param userId * @return */ public RuleDto findStepRebate(String userId,boolean checkFlag,String partnerId){ RuleDto ruleDto=new RuleDto(); ruleDto.setScale(UserEnum.无返利.getValue()); if(checkFlag){ UserInfo byId = userService.findById(userId); if(byId!=null){ String mobilePhone = byId.getMobilePhone(); List byMobile = otherUserService.findByMobile(mobilePhone); if(CollUtil.isNotEmpty(byMobile)) { return ruleDto; } } } RedPaperRule one = redPaperRuleService.getOne(UserEnum.阶梯返利规则.getValue(),partnerId); if(one!=null){ ruleDto.setRuleId(one.getId()); ruleDto.setConversionPerUnit(one.getConversionPerUnit()); List rebateRules = rebateRuleService.findByRuleId(one.getId()); String rate=null; String minWeight=null; String minScale=null; if(CollUtil.isNotEmpty(rebateRules)){ //sort升序 List collect = rebateRules.stream().sorted(Comparator.comparing(RebateRule::getSort)).collect(Collectors.toList()); ruleDto.setRebateRules(collect); ruleDto.setMinScale(collect.get(0).getRate()); ruleDto.setMinWeight(collect.get(0).getWeight()); //用户以前下单的总重量 BigDecimal sumWeight = orderService.findSumWeight(userId,one); ruleDto.setSumWeight(sumWeight); //从大到小 rebateRules = rebateRules.stream().sorted(Comparator.comparing(RebateRule::getSort).reversed()).collect(Collectors.toList()); for (RebateRule rebateRule : rebateRules) { String weight = rebateRule.getWeight(); String rate1 = rebateRule.getRate(); if(sumWeight.compareTo(Convert.toBigDecimal(weight))>=0){ rate = rate1; break; } } } if(rate!=null){ ruleDto.setScale(rate); }else{ //无返利 ruleDto.setMinScale(minScale); ruleDto.setMinWeight(minWeight); } } return ruleDto; } /** * 获取返利规则阶梯重量及返利 * @return */ public List getRebateRules(RedPaperRule one){ List rebateRules = rebateRuleService.findByRuleId(one.getId()); if(CollUtil.isEmpty(rebateRules)) { rebateRules=new ArrayList<>(); } return rebateRules; } /** * 将类型转换成itemType * @param productType * @return */ public String changeProductType(String productType){ String[] split = productType.split(","); StrBuilder strBuilder=StrBuilder.create(); for (String s : split) { if("1".equals(s)){ strBuilder.append(Constants.PAPER_WASTE_ITEM_TYPE).append(","); }else if("2".equals(s)){ strBuilder.append(Constants.PAPER_MIX_ITEM_TYPE).append(","); } } return StringUtils.removeLast(strBuilder, ","); } }