| package com.xzx.gc.order.service;  | 
|   | 
| import cn.hutool.core.convert.Convert;  | 
| import cn.hutool.core.date.DateUtil;  | 
| import cn.hutool.core.util.StrUtil;  | 
| import com.github.pagehelper.PageHelper;  | 
| import com.github.pagehelper.PageInfo;  | 
| import com.xzx.gc.common.constant.Constants;  | 
| import com.xzx.gc.common.constant.UserEnum;  | 
| import com.xzx.gc.common.utils.DateUtils;  | 
| import com.xzx.gc.common.utils.RedisUtil;  | 
| import com.xzx.gc.entity.CityPartner;  | 
| import com.xzx.gc.entity.PackageGoodsInfo;  | 
| import com.xzx.gc.entity.RebateRule;  | 
| import com.xzx.gc.entity.RedPaperRule;  | 
| import com.xzx.gc.model.admin.*;  | 
| import com.xzx.gc.model.query.XzxUserRedpaperRuleQuery;  | 
| import com.xzx.gc.order.mapper.*;  | 
| import com.xzx.gc.util.DoubleUtil;  | 
| import org.apache.commons.codec.binary.Base64;  | 
| import org.apache.commons.lang3.StringUtils;  | 
| 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.*;  | 
|   | 
| @Service  | 
| @Transactional  | 
| public class RedPaperRuleService {  | 
|   | 
|   | 
|     @Autowired  | 
|     private RedPaperRuleMapper redPaperRuleMapper;  | 
|   | 
|     @Autowired private RedPaperRuleMapper xzxUserRedpaperRuleDao;  | 
|   | 
|     @Autowired private ConfigMapper configMapper;  | 
|   | 
|     @Autowired  | 
|     private CityPartnerService cityPartnerService;  | 
|   | 
|     @Autowired  | 
|     private RebateRuleMapper rebateRuleMapper;  | 
|   | 
|     @Autowired  | 
|     private PackageGoodsInfoService packageGoodsInfoService;  | 
|   | 
|     @Autowired  | 
|     private RebateWeightPriceMapper rebateWeightPriceMapper;  | 
|   | 
|   | 
|     /**  | 
|      * 红包在规则时间范围内是否有效  | 
|      * @param ruleId  | 
|      * @return  | 
|      */  | 
|     public boolean isvalid( Integer ruleId ){  | 
|         //是否在规则的时间内  | 
|         RedPaperRule redPaperRule = redPaperRuleMapper.selectByPrimaryKey(ruleId);  | 
|         if(redPaperRule==null||Constants.DEL_FLAG==Convert.toInt(redPaperRule.getDelFlag(),1)||Constants.FAIL.equals(Convert.toStr(redPaperRule.getStatus(),"0"))){  | 
|            return false;  | 
|         }  | 
|         Date startTime = DateUtil.parse(redPaperRule.getStartTime(),DateUtils.DATE_FORMAT_YMD);  | 
|         Date endTime =  DateUtil.parse(redPaperRule.getEndTime(),DateUtils.DATE_FORMAT_YMD);  | 
|         boolean in = DateUtil.isIn(DateUtil.parse(DateUtil.today(),DateUtils.DATE_FORMAT_YMD), startTime, endTime);  | 
|         return in;  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 获取当前时间内符合条件的一条规则  | 
|      * @return  | 
|      */  | 
|     public RedPaperRule getOne(String ruleType,String partnerId){  | 
|         if(StrUtil.isBlank(partnerId)){  | 
|             return null;  | 
|         }  | 
|         return redPaperRuleMapper.getOne(DateUtil.format(new Date(),DateUtils.DATE_FORMAT_YMD),ruleType,partnerId);  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 根据打包站和类型查找  | 
|      * @param ruleType  | 
|      * @param packageId  | 
|      * @return  | 
|      */  | 
|     public RedPaperRule findByPackageIdAndRuleType(String ruleType,String packageId){  | 
|         RedPaperRule redPaperRule=new RedPaperRule();  | 
|         redPaperRule.setStatus(Convert.toShort(Constants.OPEN_FLAG));  | 
|         redPaperRule.setDelFlag(Convert.toShort(Constants.DEL_NOT_FLAG));  | 
|         redPaperRule.setRuleType(ruleType);  | 
|         redPaperRule.setPackageId(packageId);  | 
|         return redPaperRuleMapper.selectOne(redPaperRule);  | 
|     }  | 
|   | 
|   | 
|   | 
|   | 
|     public Map<String,Object> queryByCondition(XzxUserRedpaperRuleQuery query, String ruleType){  | 
|         PageHelper.startPage(query.getPage(),query.getLimit());  | 
|         List<RedPaperRule> list =  xzxUserRedpaperRuleDao.queryByCondition(query);  | 
|         PageInfo<RedPaperRule> pageInfo=new PageInfo<>(list);  | 
|   | 
|         List<XzxUserRedpaperPriceModel> priceList = new ArrayList<>();  | 
|         if(ruleType.equals("3")){  | 
|             for (RedPaperRule rule:list) {  | 
|                 if(rule.getPartnerId().equals("-1")){  | 
|                     rule.setPartnerName("管理员");  | 
|   | 
|                 }  | 
|                 XzxUserRedpaperPriceModel model = new XzxUserRedpaperPriceModel(rule);  | 
|                 List<RebateRule> rulePriceList =xzxUserRedpaperRuleDao.queryRebateRulePriceList(String.valueOf(rule.getId()));  | 
|                 model.setRulePriceList(rulePriceList);  | 
|                 model.setApplicableObject(rule.getApplicableObject());  | 
|                 //文案文字返回  | 
|                 String sharingProfitType = rule.getSharingProfitType();  | 
|                 if(sharingProfitType!=null){  | 
|                     String[] types = sharingProfitType.split(",");  | 
|                     StringBuffer typeDesc = new StringBuffer();  | 
|                     String aa="";  | 
|                     String demo="";  | 
|                     for (String type:types) {  | 
|                         String desc =configMapper.queryTypeDesc(type);  | 
|                         int a=1;  | 
|                         for (RebateRule p:rulePriceList) {  | 
|                             if(typeDesc.toString()!=null&&!"".equals(typeDesc.toString())){  | 
|                                 if(type.equals("REBATE_TWO")){  | 
|                                     if(a>=2){  | 
|                                         typeDesc.append(";").append(a+"、"+demo).append(p.getWeight()).append("kg,").append(desc).append(p.getRate()).append("%");  | 
|                                     }else{  | 
|                                         typeDesc.append(desc).append(p.getRate()).append("%");  | 
|                                     }  | 
|   | 
|                                 }else if(type.equals("REBATE_THREE")){  | 
|                                     aa=desc;  | 
|                                 }  | 
|                                 a=a+1;  | 
|                             }else{  | 
|                                 demo=desc;  | 
|                                 typeDesc.append(a+"、"+desc).append(p.getWeight()).append("kg,");  | 
|                             }  | 
|   | 
|                             //break;  | 
|                         }  | 
|   | 
|                     }  | 
|   | 
|                     typeDesc.append(",").append((rulePriceList.size()+1)+"、").append(aa).append(model.getConversionPerUnit()).append("kg");  | 
|                     model.setTypeDesc(typeDesc.toString());  | 
|   | 
|                 }  | 
|                 priceList.add(model);  | 
|   | 
|             }  | 
|         }else if(ruleType.equals("8")){  | 
|             for (RedPaperRule rule:list) {  | 
|                 XzxUserRedpaperPriceModel model = new XzxUserRedpaperPriceModel(rule);  | 
|   | 
|                 StringBuffer typeDesc = new StringBuffer();  | 
|                 BigDecimal radio = new BigDecimal(rule.getShareRatio());  | 
|                 BigDecimal showRadio =  radio.multiply(new BigDecimal("100"));  | 
|                 typeDesc.append("城市合伙人每笔订单成交,总部收取每笔订单回收流水的").append(DoubleUtil.subZeroAndDot(showRadio.toString()));  | 
|                 typeDesc.append("%,做为平台服务费。");  | 
|                 model.setTypeDesc(typeDesc.toString());  | 
|                 model.setShareRatio(showRadio.toString());  | 
|   | 
|                 //设置合伙人名字  | 
|                 String partnerId = model.getPartnerId();  | 
|                 if (StrUtil.isNotBlank(partnerId)) {  | 
|                     CityPartner byId = cityPartnerService.findById(Convert.toInt(partnerId));  | 
|                     if (byId != null) {  | 
|                         model.setPartnerName(byId.getPartnerName());  | 
|                     }  | 
|                 }  | 
|                 priceList.add(model);  | 
|   | 
|             }  | 
|         }else{  | 
|             for (RedPaperRule rule:list) {  | 
|                 XzxUserRedpaperPriceModel model = new XzxUserRedpaperPriceModel(rule);  | 
|                 //文案文字返回  | 
|                 String sharingProfitType = rule.getSharingProfitType();  | 
|                 model.setApplicableObject(rule.getApplicableObject());  | 
|                 if(ruleType.equals("2")){  | 
|                     if(sharingProfitType!=null){  | 
|                         String[] types = sharingProfitType.split(",");  | 
|                         StringBuffer typeDesc = new StringBuffer();  | 
|                         for (String type:types) {  | 
|                             String desc =configMapper.queryTypeDesc(type);  | 
|                             if(typeDesc.toString()!=null&&!"".equals(typeDesc.toString())){  | 
|                                 typeDesc.append(",").append(desc);  | 
|                             }else{  | 
|                                 if(type.equals("SHARE_RATIO")){  | 
|                                     typeDesc.append(desc).append(model.getShareRatio()).append("%");  | 
|                                 }else{  | 
|                                     typeDesc.append(desc);  | 
|                                 }  | 
|                             }  | 
|                         }  | 
|                         model.setTypeDesc(typeDesc.toString());  | 
|                     }  | 
|                 }else{  | 
|                     if(ruleType.equals("5")){  | 
|                         StringBuffer str = new StringBuffer();  | 
|                         List<RebateRule> wl = rebateRuleMapper.queryWtList(rule.getId()+"");  | 
|                         model.setProductType(rule.getProductType());  | 
|                         String[] types = rule.getProductType().split(",");  | 
|                         List<RebateRule> rulePriceList  = new ArrayList<>();  | 
|                         for (int i=0;i<wl.size();i++) {  | 
|                             RebateRule ww = wl.get(i);  | 
|                             rulePriceList.add(ww);  | 
|                             str.append(i+1).append("、用户每次下单超过").append(ww.getWeight()).append("kg,返利").append(ww.getRate().split(",")[0]+"%;");  | 
|                         }  | 
|                         model.setRulePriceList(rulePriceList);  | 
|                         str.append((wl.size()+1));  | 
|                         str.append("、适用物品包括:");  | 
|                         for (String t:types) {  | 
|                             if(t.equals("1")){  | 
|                                 str.append("废纸").append(",");  | 
|                             }else if(t.equals("2")){  | 
|                                 str.append("杂纸").append(",");  | 
|                             }  | 
|                         }  | 
|                         model.setTypeDesc(str.toString());  | 
|                     }else if(ruleType.equals(UserEnum.提成规则.getValue())){  | 
|                         StringBuffer str = new StringBuffer();  | 
|                         String packageId = rule.getPackageId();  | 
|                         CityPartner partner =cityPartnerService.queryById(packageId);  | 
|                         str.append(partner.getPartnerName()).append("的发放规则");  | 
|                         str.append("1、回收员每次成交,合伙人给回收员发放提成,提成为");  | 
|                         List<RebateWeightPriceModel> itemList = rebateWeightPriceMapper.queryOldItemList(rule.getId()+"");  | 
|                         for (RebateWeightPriceModel mm:itemList) {  | 
|                             PackageGoodsInfo packageGoodsInfo = packageGoodsInfoService.findByPackageIdAndItemTypeForBidden(mm.getPackageId(), mm.getProductType());  | 
|                             String title = packageGoodsInfo.getTitle();  | 
|                             mm.setProductName(title);  | 
|                             str.append(title).append(":").append(mm.getMoney()).append("元/公斤,");  | 
|   | 
|                         }  | 
|                         model.setRoyaltyRuleList(itemList);  | 
|                         String rType = rule.getProductType();  | 
|                         if(null!=rType){  | 
|                             String[]  itemType = rType.split(",");  | 
|                             if(itemType[0].equals("3")){  | 
|                                 str.append("2、可以人工结算提成;");  | 
|                             }  | 
|                             if(itemType[0].equals("4")){  | 
|                                 String timming = rule.getTiming();  | 
|                                 String[]  trs = timming.split(",");  | 
|                                 str.append("3、每周").append(trs[0]).append(" ").append(trs[1]).append("点系统自动结算提成");  | 
|                             }  | 
|                         }  | 
|                         model.setTypeDesc(str.toString());  | 
|                     }else{  | 
|                         StringBuffer str = new StringBuffer();  | 
|                         if(model.getIssuanceRules().equals("0")){  | 
|                             double totald = Double.parseDouble(model.getAmount())*100;  | 
|                             long total =new Double(totald).longValue();  | 
|                             int count = Integer.parseInt(model.getRedEnvelopesNum());  | 
|                             long average = total / count;  | 
|                             String[] pri = model.getRandomAmountAverage().split(",");  | 
|                             str.append("1、发放金额随机,金额范围为").append(model.getRandomAmountAverage()).append("元;平均为").append(average).append("元");  | 
|                             str.append("总额为").append(model.getAmount()).append("元,随机分配;最高").append(pri[1]).append("元/个");  | 
|                         }else{  | 
|                             str.append("发放固定金额,红包为").append(model.getRandomAmountAverage()).append(",总额为").append(model.getAmount());  | 
|                         }  | 
|                         model.setTypeDesc(str.toString());  | 
|                     }  | 
|   | 
|                 }  | 
|                 priceList.add(model);  | 
|   | 
|             }  | 
|         }  | 
|         Map<String,Object> map = new HashMap<>();  | 
|         map.put("data",priceList);  | 
|         map.put("pageNumber",pageInfo.getPageNum());  | 
|         map.put("pageSize",pageInfo.getPageSize());  | 
|         map.put("totalPage",pageInfo.getPages());  | 
|         map.put("count",pageInfo.getTotal());  | 
|         //queryListAfter(priceList);  | 
|   | 
|         return map;  | 
|     }  | 
|   | 
|     public void deleteByRuleId(Integer ruleId){  | 
|         xzxUserRedpaperRuleDao.deleteByRuleId(ruleId);  | 
|     }  | 
|     public Map<String,Object> queryRebateList(XzxPlatformCapitalInfoModel model){  | 
|   | 
|         List<String> partnerIds = cityPartnerService.queryPartnerByCurrent();  | 
|         model.setPartnerIds(partnerIds);  | 
|         Map<String,Object> map = new HashMap<>();  | 
|         String mobilePhone = model.getMobilePhone();  | 
|         if(!StringUtils.isEmpty(model.getMobilePhone())){  | 
|             model.setMobilePhone(mobilePhone);  | 
|             model.setNickName(new String(Base64.encodeBase64(mobilePhone.getBytes())));  | 
|   | 
|         }  | 
|         PageHelper.startPage(model.getPage(),model.getLimit());  | 
|         List<XzxPlatformCapitalInfoModel> list = xzxUserRedpaperRuleDao.queryRebateList(model);  | 
|   | 
|         for (XzxPlatformCapitalInfoModel info:list) {  | 
|             if(info.getUserId()!=null&&!"".equals(info.getUserId())){  | 
|                 //转昵称  | 
|                 String nickName = info.getNickName();  | 
|                 if(nickName!=null&&!"".equals(nickName)){  | 
|                     nickName = cn.hutool.core.codec.Base64.decodeStr(nickName);  | 
|                 }  | 
|                 info.setNickName(nickName);  | 
|                 //查询用户此单之前的累计重量  | 
|                 String afterWeight = "0" ;  | 
|                 String userId = info.getUserId();  | 
|                 String completeTime = info.getCreateTime();  | 
|                 List<String> orderIds = xzxUserRedpaperRuleDao.queryUserOrderIds(completeTime,userId);  | 
|                 if(orderIds!=null&&orderIds.size()>0){  | 
|                     afterWeight = xzxUserRedpaperRuleDao.queryAfterWeightByOrderIds(orderIds);  | 
|                 }  | 
|                 info.setAfterWeight(DoubleUtil.roundThree(afterWeight));  | 
|                 info.setDesignatedWeight(DoubleUtil.roundThree(info.getDesignatedWeight()));  | 
|             }  | 
|   | 
|         }  | 
|         //如果没有用户Id,则不显示返利列表  | 
|         if(list.size()==0){  | 
|             list = new ArrayList<>();  | 
|         }  | 
|   | 
|         PageInfo<XzxPlatformCapitalInfoModel> pageInfo=new PageInfo<>(list);  | 
|         String totalAmount =xzxUserRedpaperRuleDao.queryTotalAmountByParam(model);  | 
|   | 
|         map.put("data",list);  | 
|         map.put("count",pageInfo.getTotal());  | 
|         map.put("code",0);  | 
|         map.put("orderNum",pageInfo.getTotal());  | 
|         if(null!=totalAmount&&!"".equals(totalAmount)){  | 
|             map.put("totalAmount",DoubleUtil.roundTwo(totalAmount));  | 
|   | 
|         }else{  | 
|             map.put("totalAmount","0");  | 
|         }  | 
|         return map;  | 
|     }  | 
|   | 
|     public List<RedPaperRule> queryRedpaperListStartAndEnd(String startTime,String endTime,String partnerId,Integer id,String ruleType){  | 
|         return xzxUserRedpaperRuleDao.queryRedpaperListStartAndEnd(startTime,endTime,partnerId,id,ruleType);  | 
|     }  | 
|   | 
|     public Map<String,Object> queryAccountList(CommissionModel model){  | 
|         Map<String,Object> map = new HashMap<>();  | 
|         String partnerName = model.getPartnerName();  | 
|         if(!StringUtils.isEmpty(partnerName)){  | 
|             model.setPartnerName(partnerName);  | 
|             model.setMobile(partnerName);  | 
|         }  | 
|         int count = 0;  | 
|         PageHelper.startPage(model.getPage(),model.getLimit());  | 
|         List<CommissionModel>  list = xzxUserRedpaperRuleDao.queryAccountList(model);  | 
|         for (CommissionModel cmodel:list) {  | 
|             cmodel.setOrderMoney(DoubleUtil.roundTwo(cmodel.getOrderMoney()));  | 
|         }  | 
|         //已提佣次数  | 
|         map.put("commissionNum",count);  | 
|         //总提佣金额  | 
|         String totalMoney =xzxUserRedpaperRuleDao.queryTotalCommissionMoney(model);  | 
|         if(null!=totalMoney&&!"".equals(totalMoney)){  | 
|             map.put("totalMoney",DoubleUtil.roundTwo(totalMoney));  | 
|         }else{  | 
|             map.put("totalMoney","0.00");  | 
|         }  | 
|         PageInfo<CommissionModel> pageInfo=new PageInfo<>(list);  | 
|         map.put("code",0);  | 
|         map.put("data",pageInfo.getList());  | 
|         map.put("count",pageInfo.getTotal());  | 
|         return map;  | 
|     }  | 
|   | 
|     public List<RedPaperRule> queryRoyalRuleList(String partnerId,String packageId){  | 
|         return xzxUserRedpaperRuleDao.queryRoyalRuleList(partnerId,packageId);  | 
|     }  | 
|   | 
|     public RedPaperRule queryById(Integer id) {  | 
|         return xzxUserRedpaperRuleDao.selectByPrimaryKey(id);  | 
|     }  | 
|   | 
|     public boolean update(RedPaperRule ru) {  | 
|         return xzxUserRedpaperRuleDao.updateByPrimaryKeySelective(ru)>0?true:false;  | 
|     }  | 
|   | 
|     public boolean save(RedPaperRule rule) {  | 
|         return xzxUserRedpaperRuleDao.insertUseGeneratedKeys(rule)>0?true:false;  | 
|     }  | 
|   | 
| }  |